make this work with multi-db
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7343 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
82
kdc/config.c
82
kdc/config.c
@@ -48,7 +48,7 @@ char *keyfile;
|
||||
static char *max_request_str;
|
||||
size_t max_request;
|
||||
time_t kdc_warn_pwexpire;
|
||||
char **databases;
|
||||
struct dbinfo *databases;
|
||||
HDB **db;
|
||||
int num_db;
|
||||
char *port_str;
|
||||
@@ -85,10 +85,12 @@ static struct getargs args[] = {
|
||||
"max-request", 0, arg_string, &max_request,
|
||||
"max size for a kdc-request", "size"
|
||||
},
|
||||
#if 0
|
||||
{
|
||||
"database", 'd', arg_string, &databases,
|
||||
"location of database", "database"
|
||||
},
|
||||
#endif
|
||||
{ "enable-http", 'H', arg_flag, &enable_http, "turn on HTTP support" },
|
||||
#ifdef KRB4
|
||||
{
|
||||
@@ -118,6 +120,80 @@ usage(int ret)
|
||||
exit (ret);
|
||||
}
|
||||
|
||||
static void
|
||||
get_dbinfo(krb5_config_section *cf)
|
||||
{
|
||||
krb5_config_binding *top_binding = NULL;
|
||||
krb5_config_binding *db_binding;
|
||||
krb5_config_binding *default_binding = NULL;
|
||||
struct dbinfo *di, **dt;
|
||||
const char *default_dbname = HDB_DEFAULT_DB;
|
||||
const char *default_mkey = HDB_DB_DIR "/m-key";
|
||||
const char *p;
|
||||
|
||||
databases = NULL;
|
||||
dt = &databases;
|
||||
while((db_binding = krb5_config_get_next(context, cf, &top_binding,
|
||||
krb5_config_list,
|
||||
"kdc",
|
||||
"database",
|
||||
NULL))) {
|
||||
p = krb5_config_get_string(context, db_binding, "realm", NULL);
|
||||
if(p == NULL) {
|
||||
if(default_binding) {
|
||||
krb5_warnx(context, "WARNING: more than one realm-less "
|
||||
"database specification");
|
||||
krb5_warnx(context, "WARNING: using the first encountered");
|
||||
} else
|
||||
default_binding = db_binding;
|
||||
continue;
|
||||
}
|
||||
di = calloc(1, sizeof(*di));
|
||||
di->realm = strdup(p);
|
||||
p = krb5_config_get_string(context, db_binding, "dbname", NULL);
|
||||
if(p)
|
||||
di->dbname = strdup(p);
|
||||
p = krb5_config_get_string(context, db_binding, "mkey_file", NULL);
|
||||
if(p)
|
||||
di->mkey_file = strdup(p);
|
||||
*dt = di;
|
||||
dt = &di->next;
|
||||
}
|
||||
if(default_binding) {
|
||||
di = calloc(1, sizeof(*di));
|
||||
p = krb5_config_get_string(context, default_binding, "dbname", NULL);
|
||||
if(p) {
|
||||
di->dbname = strdup(p);
|
||||
default_dbname = p;
|
||||
}
|
||||
p = krb5_config_get_string(context, default_binding, "mkey_file", NULL);
|
||||
if(p) {
|
||||
di->mkey_file = strdup(p);
|
||||
default_mkey = p;
|
||||
}
|
||||
*dt = di;
|
||||
dt = &di->next;
|
||||
} else {
|
||||
di = calloc(1, sizeof(*di));
|
||||
di->dbname = strdup(default_dbname);
|
||||
di->mkey_file = strdup(default_mkey);
|
||||
*dt = di;
|
||||
dt = &di->next;
|
||||
}
|
||||
for(di = databases; di; di = di->next) {
|
||||
if(di->dbname == NULL)
|
||||
di->dbname = strdup(default_dbname);
|
||||
if(di->mkey_file == NULL) {
|
||||
p = strrchr(di->dbname, '.');
|
||||
if(p == NULL || strchr(p, '/') != NULL)
|
||||
asprintf(&di->mkey_file, "%s.mkey", di->dbname);
|
||||
else
|
||||
asprintf(&di->mkey_file, "%.*s.mkey",
|
||||
(int)(p - di->dbname), di->dbname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
configure(int argc, char **argv)
|
||||
{
|
||||
@@ -158,8 +234,8 @@ configure(int argc, char **argv)
|
||||
keyfile = strdup(p);
|
||||
}
|
||||
|
||||
if(databases == NULL)
|
||||
databases = krb5_config_get_strings (context, cf, "kdc", "database", NULL);
|
||||
|
||||
get_dbinfo(cf);
|
||||
|
||||
if(max_request_str){
|
||||
max_request = parse_bytes(max_request_str, NULL);
|
||||
|
@@ -52,7 +52,12 @@ extern sig_atomic_t exit_flag;
|
||||
extern char *keyfile;
|
||||
extern size_t max_request;
|
||||
extern time_t kdc_warn_pwexpire;
|
||||
extern char **databases;
|
||||
extern struct dbinfo {
|
||||
char *realm;
|
||||
char *dbname;
|
||||
char *mkey_file;
|
||||
struct dbinfo *next;
|
||||
} *databases;
|
||||
extern HDB **db;
|
||||
extern int num_db;
|
||||
extern char *port_str;
|
||||
|
19
kdc/main.c
19
kdc/main.c
@@ -65,21 +65,24 @@ main(int argc, char **argv)
|
||||
ret = hdb_create(context, &db[0], NULL);
|
||||
if(ret)
|
||||
krb5_err(context, 1, ret, "hdb_create %s", HDB_DEFAULT_DB);
|
||||
ret = hdb_set_master_keyfile(context, db[0], NULL);
|
||||
if (ret)
|
||||
krb5_err(context, 1, ret, "hdb_set_master_keyfile");
|
||||
} else {
|
||||
char **d;
|
||||
struct dbinfo *d;
|
||||
int i;
|
||||
/* count databases */
|
||||
for(d = databases, i = 0; *d; d++, i++);
|
||||
for(d = databases, i = 0; d; d = d->next, i++);
|
||||
db = malloc(i * sizeof(*db));
|
||||
for(d = databases, num_db = 0; *d; d++) {
|
||||
ret = hdb_create(context, &db[num_db++], *d);
|
||||
for(d = databases, num_db = 0; d; d = d->next, num_db++) {
|
||||
ret = hdb_create(context, &db[num_db], d->dbname);
|
||||
if(ret)
|
||||
krb5_err(context, 1, ret, "hdb_create %s", *d);
|
||||
}
|
||||
}
|
||||
ret = hdb_set_master_keyfile(context, db, keyfile);
|
||||
krb5_err(context, 1, ret, "hdb_create %s", d->dbname);
|
||||
ret = hdb_set_master_keyfile(context, db[num_db], d->mkey_file);
|
||||
if (ret)
|
||||
krb5_err(context, 1, ret, "hdb_set_master_keyfile");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
{
|
||||
|
Reference in New Issue
Block a user