dbinfo.c revision 256281
181477Smarkm/*
2109069Snectar * Copyright (c) 2005 Kungliga Tekniska H��gskolan
3109069Snectar * (Royal Institute of Technology, Stockholm, Sweden).
4109069Snectar * All rights reserved.
5109069Snectar *
6109069Snectar * Redistribution and use in source and binary forms, with or without
7109069Snectar * modification, are permitted provided that the following conditions
8109069Snectar * are met:
9109069Snectar *
10109069Snectar * 1. Redistributions of source code must retain the above copyright
1194564Sdes *    notice, this list of conditions and the following disclaimer.
1293984Sdes *
1393984Sdes * 2. Redistributions in binary form must reproduce the above copyright
1493984Sdes *    notice, this list of conditions and the following disclaimer in the
1593984Sdes *    documentation and/or other materials provided with the distribution.
16110274Sdes *
1781477Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1881477Smarkm *    may be used to endorse or promote products derived from this software
1981477Smarkm *    without specific prior written permission.
2081477Smarkm *
21109069Snectar * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2281477Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2381477Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2481477Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2581477Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2681477Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2781477Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2881477Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29110274Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3081477Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3181477Smarkm * SUCH DAMAGE.
3281477Smarkm */
3381477Smarkm
3481477Smarkm#include "hdb_locl.h"
35110274Sdes
3681477Smarkmstruct hdb_dbinfo {
3781477Smarkm    char *label;
3881477Smarkm    char *realm;
3981477Smarkm    char *dbname;
4081477Smarkm    char *mkey_file;
4181477Smarkm    char *acl_file;
4281477Smarkm    char *log_file;
4381477Smarkm    const krb5_config_binding *binding;
4481477Smarkm    struct hdb_dbinfo *next;
4581477Smarkm};
4681477Smarkm
4794564Sdesstatic int
4881477Smarkmget_dbinfo(krb5_context context,
4981477Smarkm	   const krb5_config_binding *db_binding,
5084218Sdillon	   const char *label,
5184218Sdillon	   struct hdb_dbinfo **db)
5284218Sdillon{
5381477Smarkm    struct hdb_dbinfo *di;
5481477Smarkm    const char *p;
5581477Smarkm
5681477Smarkm    *db = NULL;
5781477Smarkm
5881477Smarkm    p = krb5_config_get_string(context, db_binding, "dbname", NULL);
5981477Smarkm    if(p == NULL)
6093984Sdes	return 0;
6181477Smarkm
6281477Smarkm    di = calloc(1, sizeof(*di));
6381477Smarkm    if (di == NULL) {
6481477Smarkm	krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
6581477Smarkm	return ENOMEM;
6681477Smarkm    }
6781477Smarkm    di->label = strdup(label);
6881477Smarkm    di->dbname = strdup(p);
6981477Smarkm
7081477Smarkm    p = krb5_config_get_string(context, db_binding, "realm", NULL);
7181477Smarkm    if(p)
7281477Smarkm	di->realm = strdup(p);
7390229Sdes    p = krb5_config_get_string(context, db_binding, "mkey_file", NULL);
7481477Smarkm    if(p)
7581477Smarkm	di->mkey_file = strdup(p);
7681477Smarkm    p = krb5_config_get_string(context, db_binding, "acl_file", NULL);
7781477Smarkm    if(p)
7881477Smarkm	di->acl_file = strdup(p);
7981477Smarkm    p = krb5_config_get_string(context, db_binding, "log_file", NULL);
8081477Smarkm    if(p)
8181477Smarkm	di->log_file = strdup(p);
8281477Smarkm
8381477Smarkm    di->binding = db_binding;
8485485Ssobomax
8585485Ssobomax    *db = di;
8681477Smarkm    return 0;
8794564Sdes}
8894564Sdes
8994564Sdes
9094564Sdesint
9194564Sdeshdb_get_dbinfo(krb5_context context, struct hdb_dbinfo **dbp)
9294564Sdes{
9394564Sdes    const krb5_config_binding *db_binding;
9481477Smarkm    struct hdb_dbinfo *di, **dt, *databases;
9581477Smarkm    const char *default_dbname = HDB_DEFAULT_DB;
9681477Smarkm    const char *default_mkey = HDB_DB_DIR "/m-key";
9781477Smarkm    const char *default_acl = HDB_DB_DIR "/kadmind.acl";
9881477Smarkm    const char *p;
9981477Smarkm    int ret;
10081477Smarkm
10181477Smarkm    *dbp = NULL;
10281477Smarkm    dt = NULL;
10381477Smarkm    databases = NULL;
10481477Smarkm
10581477Smarkm    db_binding = krb5_config_get_list(context, NULL,
10681477Smarkm				      "kdc",
10781477Smarkm				      "database",
10894564Sdes				      NULL);
10994564Sdes    if (db_binding) {
11081477Smarkm
11181477Smarkm	ret = get_dbinfo(context, db_binding, "default", &di);
11281477Smarkm	if (ret == 0 && di) {
11381477Smarkm	    databases = di;
11481477Smarkm	    dt = &di->next;
115106864Snectar	}
11681477Smarkm
11781477Smarkm	for ( ; db_binding != NULL; db_binding = db_binding->next) {
11881477Smarkm
11981477Smarkm	    if (db_binding->type != krb5_config_list)
12089760Smarkm		continue;
121106864Snectar
12281477Smarkm	    ret = get_dbinfo(context, db_binding->u.list,
12381477Smarkm			     db_binding->name, &di);
12481477Smarkm	    if (ret)
12581477Smarkm		krb5_err(context, 1, ret, "failed getting realm");
12681477Smarkm
12781477Smarkm	    if (di == NULL)
12881477Smarkm		continue;
12994564Sdes
13081477Smarkm	    if (dt)
13181477Smarkm		*dt = di;
13281477Smarkm	    else
13381477Smarkm		databases = di;
13481477Smarkm	    dt = &di->next;
13594564Sdes
13681477Smarkm	}
13781477Smarkm    }
13881477Smarkm
13981477Smarkm    if(databases == NULL) {
14081477Smarkm	/* if there are none specified, create one and use defaults */
14181477Smarkm	di = calloc(1, sizeof(*di));
14281477Smarkm	databases = di;
14381477Smarkm	di->label = strdup("default");
14481477Smarkm    }
14581477Smarkm
14681477Smarkm    for(di = databases; di; di = di->next) {
14781477Smarkm	if(di->dbname == NULL) {
14881477Smarkm	    di->dbname = strdup(default_dbname);
14994564Sdes	    if (di->mkey_file == NULL)
15081477Smarkm		di->mkey_file = strdup(default_mkey);
15181477Smarkm	}
15281477Smarkm	if(di->mkey_file == NULL) {
15381477Smarkm	    p = strrchr(di->dbname, '.');
15481477Smarkm	    if(p == NULL || strchr(p, '/') != NULL)
15581477Smarkm		/* final pathname component does not contain a . */
15681477Smarkm		asprintf(&di->mkey_file, "%s.mkey", di->dbname);
15781477Smarkm	    else
15881477Smarkm		/* the filename is something.else, replace .else with
15981477Smarkm                   .mkey */
16081477Smarkm		asprintf(&di->mkey_file, "%.*s.mkey",
16181477Smarkm			 (int)(p - di->dbname), di->dbname);
16281477Smarkm	}
16381477Smarkm	if(di->acl_file == NULL)
16481477Smarkm	    di->acl_file = strdup(default_acl);
16581477Smarkm    }
16681477Smarkm    *dbp = databases;
16781477Smarkm    return 0;
16881477Smarkm}
16981477Smarkm
17081477Smarkm
17181477Smarkmstruct hdb_dbinfo *
17281477Smarkmhdb_dbinfo_get_next(struct hdb_dbinfo *dbp, struct hdb_dbinfo *dbprevp)
17381477Smarkm{
17481477Smarkm    if (dbprevp == NULL)
17581477Smarkm	return dbp;
17681477Smarkm    else
17781477Smarkm	return dbprevp->next;
17881477Smarkm}
17981477Smarkm
18081477Smarkmconst char *
181106862Snectarhdb_dbinfo_get_label(krb5_context context, struct hdb_dbinfo *dbp)
182106862Snectar{
18381477Smarkm    return dbp->label;
18481477Smarkm}
18581477Smarkm
18681477Smarkmconst char *
18781477Smarkmhdb_dbinfo_get_realm(krb5_context context, struct hdb_dbinfo *dbp)
18881477Smarkm{
18981477Smarkm    return dbp->realm;
19081477Smarkm}
19181477Smarkm
19281477Smarkmconst char *
19381477Smarkmhdb_dbinfo_get_dbname(krb5_context context, struct hdb_dbinfo *dbp)
194106862Snectar{
195106862Snectar    return dbp->dbname;
19681477Smarkm}
19781477Smarkm
19881477Smarkmconst char *
19981477Smarkmhdb_dbinfo_get_mkey_file(krb5_context context, struct hdb_dbinfo *dbp)
20081477Smarkm{
20181477Smarkm    return dbp->mkey_file;
20281477Smarkm}
20381477Smarkm
20493984Sdesconst char *
20581477Smarkmhdb_dbinfo_get_acl_file(krb5_context context, struct hdb_dbinfo *dbp)
20681477Smarkm{
20781477Smarkm    return dbp->acl_file;
20881477Smarkm}
20981477Smarkm
21081477Smarkmconst char *
21181477Smarkmhdb_dbinfo_get_log_file(krb5_context context, struct hdb_dbinfo *dbp)
21281477Smarkm{
21381477Smarkm    return dbp->log_file;
21481477Smarkm}
21581477Smarkm
21681477Smarkmconst krb5_config_binding *
21781477Smarkmhdb_dbinfo_get_binding(krb5_context context, struct hdb_dbinfo *dbp)
218106862Snectar{
21981477Smarkm    return dbp->binding;
22081477Smarkm}
22181477Smarkm
22281477Smarkmvoid
22381477Smarkmhdb_free_dbinfo(krb5_context context, struct hdb_dbinfo **dbp)
22481477Smarkm{
22581477Smarkm    struct hdb_dbinfo *di, *ndi;
22681477Smarkm
22781477Smarkm    for(di = *dbp; di != NULL; di = ndi) {
22881477Smarkm	ndi = di->next;
22981477Smarkm	free (di->label);
23081477Smarkm	free (di->realm);
23181477Smarkm	free (di->dbname);
23281477Smarkm	free (di->mkey_file);
23381477Smarkm	free (di->acl_file);
23481477Smarkm	free (di->log_file);
23581477Smarkm	free(di);
23681477Smarkm    }
23781477Smarkm    *dbp = NULL;
23881477Smarkm}
23981477Smarkm
24081477Smarkm/**
24181477Smarkm * Return the directory where the hdb database resides.
24281477Smarkm *
24381477Smarkm * @param context Kerberos 5 context.
24481477Smarkm *
24581477Smarkm * @return string pointing to directory.
24681477Smarkm */
24781477Smarkm
24881477Smarkmconst char *
249106862Snectarhdb_db_dir(krb5_context context)
25081477Smarkm{
25181477Smarkm    return HDB_DB_DIR;
25281477Smarkm}
25381477Smarkm
25481477Smarkm/**
25581477Smarkm * Return the default hdb database resides.
256106864Snectar *
257106864Snectar * @param context Kerberos 5 context.
25881477Smarkm *
25981477Smarkm * @return string pointing to directory.
260106864Snectar */
261106862Snectar
26281477Smarkmconst char *
26381477Smarkmhdb_default_db(krb5_context context)
26481477Smarkm{
26581477Smarkm    return HDB_DEFAULT_DB;
26681477Smarkm}
26781477Smarkm