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