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;
|
static char *max_request_str;
|
||||||
size_t max_request;
|
size_t max_request;
|
||||||
time_t kdc_warn_pwexpire;
|
time_t kdc_warn_pwexpire;
|
||||||
char **databases;
|
struct dbinfo *databases;
|
||||||
HDB **db;
|
HDB **db;
|
||||||
int num_db;
|
int num_db;
|
||||||
char *port_str;
|
char *port_str;
|
||||||
@@ -85,10 +85,12 @@ static struct getargs args[] = {
|
|||||||
"max-request", 0, arg_string, &max_request,
|
"max-request", 0, arg_string, &max_request,
|
||||||
"max size for a kdc-request", "size"
|
"max size for a kdc-request", "size"
|
||||||
},
|
},
|
||||||
|
#if 0
|
||||||
{
|
{
|
||||||
"database", 'd', arg_string, &databases,
|
"database", 'd', arg_string, &databases,
|
||||||
"location of database", "database"
|
"location of database", "database"
|
||||||
},
|
},
|
||||||
|
#endif
|
||||||
{ "enable-http", 'H', arg_flag, &enable_http, "turn on HTTP support" },
|
{ "enable-http", 'H', arg_flag, &enable_http, "turn on HTTP support" },
|
||||||
#ifdef KRB4
|
#ifdef KRB4
|
||||||
{
|
{
|
||||||
@@ -118,6 +120,80 @@ usage(int ret)
|
|||||||
exit (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
|
void
|
||||||
configure(int argc, char **argv)
|
configure(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -158,8 +234,8 @@ configure(int argc, char **argv)
|
|||||||
keyfile = strdup(p);
|
keyfile = strdup(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(databases == NULL)
|
|
||||||
databases = krb5_config_get_strings (context, cf, "kdc", "database", NULL);
|
get_dbinfo(cf);
|
||||||
|
|
||||||
if(max_request_str){
|
if(max_request_str){
|
||||||
max_request = parse_bytes(max_request_str, NULL);
|
max_request = parse_bytes(max_request_str, NULL);
|
||||||
|
@@ -52,7 +52,12 @@ extern sig_atomic_t exit_flag;
|
|||||||
extern char *keyfile;
|
extern char *keyfile;
|
||||||
extern size_t max_request;
|
extern size_t max_request;
|
||||||
extern time_t kdc_warn_pwexpire;
|
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 HDB **db;
|
||||||
extern int num_db;
|
extern int num_db;
|
||||||
extern char *port_str;
|
extern char *port_str;
|
||||||
|
29
kdc/main.c
29
kdc/main.c
@@ -65,21 +65,24 @@ main(int argc, char **argv)
|
|||||||
ret = hdb_create(context, &db[0], NULL);
|
ret = hdb_create(context, &db[0], NULL);
|
||||||
if(ret)
|
if(ret)
|
||||||
krb5_err(context, 1, ret, "hdb_create %s", HDB_DEFAULT_DB);
|
krb5_err(context, 1, ret, "hdb_create %s", HDB_DEFAULT_DB);
|
||||||
} else {
|
ret = hdb_set_master_keyfile(context, db[0], NULL);
|
||||||
char **d;
|
|
||||||
int i;
|
|
||||||
/* count databases */
|
|
||||||
for(d = databases, i = 0; *d; d++, i++);
|
|
||||||
db = malloc(i * sizeof(*db));
|
|
||||||
for(d = databases, num_db = 0; *d; d++) {
|
|
||||||
ret = hdb_create(context, &db[num_db++], *d);
|
|
||||||
if(ret)
|
|
||||||
krb5_err(context, 1, ret, "hdb_create %s", *d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = hdb_set_master_keyfile(context, db, keyfile);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err(context, 1, ret, "hdb_set_master_keyfile");
|
krb5_err(context, 1, ret, "hdb_set_master_keyfile");
|
||||||
|
} else {
|
||||||
|
struct dbinfo *d;
|
||||||
|
int i;
|
||||||
|
/* count databases */
|
||||||
|
for(d = databases, i = 0; d; d = d->next, i++);
|
||||||
|
db = malloc(i * sizeof(*db));
|
||||||
|
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->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
|
#ifdef HAVE_SIGACTION
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user