From 6d36ebed76bacda31ad1208b617455b6fe1c1f4f Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Thu, 11 Nov 1999 15:17:24 +0000 Subject: [PATCH] make this work with multi-db git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7343 ec53bebd-3082-4978-b11e-865c3cabbd6b --- kdc/config.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++-- kdc/kdc_locl.h | 7 ++++- kdc/main.c | 19 +++++++----- 3 files changed, 96 insertions(+), 12 deletions(-) diff --git a/kdc/config.c b/kdc/config.c index d45273d45..905e1c0bc 100644 --- a/kdc/config.c +++ b/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); diff --git a/kdc/kdc_locl.h b/kdc/kdc_locl.h index db801f72d..c18c10fcb 100644 --- a/kdc/kdc_locl.h +++ b/kdc/kdc_locl.h @@ -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; diff --git a/kdc/main.c b/kdc/main.c index 7933dd1ea..c146b92b5 100644 --- a/kdc/main.c +++ b/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 {