1178825Sdfr/* 2233294Sstas * Copyright (c) 2005 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 5178825Sdfr * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 9178825Sdfr * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 12178825Sdfr * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * documentation and/or other materials provided with the distribution. 16178825Sdfr * 17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 18233294Sstas * may be used to endorse or promote products derived from this software 19233294Sstas * without specific prior written permission. 20178825Sdfr * 21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31233294Sstas * SUCH DAMAGE. 32178825Sdfr */ 33178825Sdfr 34178825Sdfr#include "hdb_locl.h" 35178825Sdfr 36178825Sdfrstruct hdb_dbinfo { 37178825Sdfr char *label; 38178825Sdfr char *realm; 39178825Sdfr char *dbname; 40178825Sdfr char *mkey_file; 41178825Sdfr char *acl_file; 42178825Sdfr char *log_file; 43178825Sdfr const krb5_config_binding *binding; 44178825Sdfr struct hdb_dbinfo *next; 45178825Sdfr}; 46178825Sdfr 47178825Sdfrstatic int 48178825Sdfrget_dbinfo(krb5_context context, 49178825Sdfr const krb5_config_binding *db_binding, 50178825Sdfr const char *label, 51178825Sdfr struct hdb_dbinfo **db) 52178825Sdfr{ 53178825Sdfr struct hdb_dbinfo *di; 54178825Sdfr const char *p; 55178825Sdfr 56178825Sdfr *db = NULL; 57178825Sdfr 58178825Sdfr p = krb5_config_get_string(context, db_binding, "dbname", NULL); 59178825Sdfr if(p == NULL) 60178825Sdfr return 0; 61178825Sdfr 62178825Sdfr di = calloc(1, sizeof(*di)); 63178825Sdfr if (di == NULL) { 64233294Sstas krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); 65178825Sdfr return ENOMEM; 66178825Sdfr } 67178825Sdfr di->label = strdup(label); 68178825Sdfr di->dbname = strdup(p); 69178825Sdfr 70178825Sdfr p = krb5_config_get_string(context, db_binding, "realm", NULL); 71178825Sdfr if(p) 72178825Sdfr di->realm = strdup(p); 73178825Sdfr p = krb5_config_get_string(context, db_binding, "mkey_file", NULL); 74178825Sdfr if(p) 75178825Sdfr di->mkey_file = strdup(p); 76178825Sdfr p = krb5_config_get_string(context, db_binding, "acl_file", NULL); 77178825Sdfr if(p) 78178825Sdfr di->acl_file = strdup(p); 79178825Sdfr p = krb5_config_get_string(context, db_binding, "log_file", NULL); 80178825Sdfr if(p) 81178825Sdfr di->log_file = strdup(p); 82178825Sdfr 83178825Sdfr di->binding = db_binding; 84178825Sdfr 85178825Sdfr *db = di; 86178825Sdfr return 0; 87178825Sdfr} 88178825Sdfr 89178825Sdfr 90178825Sdfrint 91178825Sdfrhdb_get_dbinfo(krb5_context context, struct hdb_dbinfo **dbp) 92178825Sdfr{ 93178825Sdfr const krb5_config_binding *db_binding; 94178825Sdfr struct hdb_dbinfo *di, **dt, *databases; 95178825Sdfr const char *default_dbname = HDB_DEFAULT_DB; 96178825Sdfr const char *default_mkey = HDB_DB_DIR "/m-key"; 97178825Sdfr const char *default_acl = HDB_DB_DIR "/kadmind.acl"; 98178825Sdfr const char *p; 99178825Sdfr int ret; 100178825Sdfr 101178825Sdfr *dbp = NULL; 102178825Sdfr dt = NULL; 103178825Sdfr databases = NULL; 104178825Sdfr 105233294Sstas db_binding = krb5_config_get_list(context, NULL, 106233294Sstas "kdc", 107233294Sstas "database", 108233294Sstas NULL); 109178825Sdfr if (db_binding) { 110178825Sdfr 111178825Sdfr ret = get_dbinfo(context, db_binding, "default", &di); 112178825Sdfr if (ret == 0 && di) { 113178825Sdfr databases = di; 114178825Sdfr dt = &di->next; 115233294Sstas } 116178825Sdfr 117178825Sdfr for ( ; db_binding != NULL; db_binding = db_binding->next) { 118178825Sdfr 119178825Sdfr if (db_binding->type != krb5_config_list) 120178825Sdfr continue; 121178825Sdfr 122233294Sstas ret = get_dbinfo(context, db_binding->u.list, 123178825Sdfr db_binding->name, &di); 124178825Sdfr if (ret) 125178825Sdfr krb5_err(context, 1, ret, "failed getting realm"); 126178825Sdfr 127178825Sdfr if (di == NULL) 128178825Sdfr continue; 129178825Sdfr 130178825Sdfr if (dt) 131178825Sdfr *dt = di; 132178825Sdfr else 133178825Sdfr databases = di; 134178825Sdfr dt = &di->next; 135178825Sdfr 136178825Sdfr } 137178825Sdfr } 138178825Sdfr 139178825Sdfr if(databases == NULL) { 140178825Sdfr /* if there are none specified, create one and use defaults */ 141178825Sdfr di = calloc(1, sizeof(*di)); 142178825Sdfr databases = di; 143178825Sdfr di->label = strdup("default"); 144178825Sdfr } 145178825Sdfr 146178825Sdfr for(di = databases; di; di = di->next) { 147178825Sdfr if(di->dbname == NULL) { 148178825Sdfr di->dbname = strdup(default_dbname); 149178825Sdfr if (di->mkey_file == NULL) 150178825Sdfr di->mkey_file = strdup(default_mkey); 151178825Sdfr } 152178825Sdfr if(di->mkey_file == NULL) { 153178825Sdfr p = strrchr(di->dbname, '.'); 154178825Sdfr if(p == NULL || strchr(p, '/') != NULL) 155178825Sdfr /* final pathname component does not contain a . */ 156178825Sdfr asprintf(&di->mkey_file, "%s.mkey", di->dbname); 157178825Sdfr else 158178825Sdfr /* the filename is something.else, replace .else with 159178825Sdfr .mkey */ 160233294Sstas asprintf(&di->mkey_file, "%.*s.mkey", 161178825Sdfr (int)(p - di->dbname), di->dbname); 162178825Sdfr } 163178825Sdfr if(di->acl_file == NULL) 164178825Sdfr di->acl_file = strdup(default_acl); 165178825Sdfr } 166178825Sdfr *dbp = databases; 167178825Sdfr return 0; 168178825Sdfr} 169178825Sdfr 170178825Sdfr 171178825Sdfrstruct hdb_dbinfo * 172178825Sdfrhdb_dbinfo_get_next(struct hdb_dbinfo *dbp, struct hdb_dbinfo *dbprevp) 173178825Sdfr{ 174178825Sdfr if (dbprevp == NULL) 175178825Sdfr return dbp; 176178825Sdfr else 177178825Sdfr return dbprevp->next; 178178825Sdfr} 179178825Sdfr 180178825Sdfrconst char * 181178825Sdfrhdb_dbinfo_get_label(krb5_context context, struct hdb_dbinfo *dbp) 182178825Sdfr{ 183178825Sdfr return dbp->label; 184178825Sdfr} 185178825Sdfr 186178825Sdfrconst char * 187178825Sdfrhdb_dbinfo_get_realm(krb5_context context, struct hdb_dbinfo *dbp) 188178825Sdfr{ 189178825Sdfr return dbp->realm; 190178825Sdfr} 191178825Sdfr 192178825Sdfrconst char * 193178825Sdfrhdb_dbinfo_get_dbname(krb5_context context, struct hdb_dbinfo *dbp) 194178825Sdfr{ 195178825Sdfr return dbp->dbname; 196178825Sdfr} 197178825Sdfr 198178825Sdfrconst char * 199178825Sdfrhdb_dbinfo_get_mkey_file(krb5_context context, struct hdb_dbinfo *dbp) 200178825Sdfr{ 201178825Sdfr return dbp->mkey_file; 202178825Sdfr} 203178825Sdfr 204178825Sdfrconst char * 205178825Sdfrhdb_dbinfo_get_acl_file(krb5_context context, struct hdb_dbinfo *dbp) 206178825Sdfr{ 207178825Sdfr return dbp->acl_file; 208178825Sdfr} 209178825Sdfr 210178825Sdfrconst char * 211178825Sdfrhdb_dbinfo_get_log_file(krb5_context context, struct hdb_dbinfo *dbp) 212178825Sdfr{ 213178825Sdfr return dbp->log_file; 214178825Sdfr} 215178825Sdfr 216178825Sdfrconst krb5_config_binding * 217178825Sdfrhdb_dbinfo_get_binding(krb5_context context, struct hdb_dbinfo *dbp) 218178825Sdfr{ 219178825Sdfr return dbp->binding; 220178825Sdfr} 221178825Sdfr 222178825Sdfrvoid 223178825Sdfrhdb_free_dbinfo(krb5_context context, struct hdb_dbinfo **dbp) 224178825Sdfr{ 225178825Sdfr struct hdb_dbinfo *di, *ndi; 226178825Sdfr 227178825Sdfr for(di = *dbp; di != NULL; di = ndi) { 228178825Sdfr ndi = di->next; 229233294Sstas free (di->label); 230178825Sdfr free (di->realm); 231178825Sdfr free (di->dbname); 232233294Sstas free (di->mkey_file); 233233294Sstas free (di->acl_file); 234233294Sstas free (di->log_file); 235178825Sdfr free(di); 236178825Sdfr } 237178825Sdfr *dbp = NULL; 238178825Sdfr} 239178825Sdfr 240178825Sdfr/** 241178825Sdfr * Return the directory where the hdb database resides. 242178825Sdfr * 243178825Sdfr * @param context Kerberos 5 context. 244178825Sdfr * 245178825Sdfr * @return string pointing to directory. 246178825Sdfr */ 247178825Sdfr 248178825Sdfrconst char * 249178825Sdfrhdb_db_dir(krb5_context context) 250178825Sdfr{ 251178825Sdfr return HDB_DB_DIR; 252178825Sdfr} 253178825Sdfr 254178825Sdfr/** 255178825Sdfr * Return the default hdb database resides. 256178825Sdfr * 257178825Sdfr * @param context Kerberos 5 context. 258178825Sdfr * 259178825Sdfr * @return string pointing to directory. 260178825Sdfr */ 261178825Sdfr 262178825Sdfrconst char * 263178825Sdfrhdb_default_db(krb5_context context) 264178825Sdfr{ 265178825Sdfr return HDB_DEFAULT_DB; 266178825Sdfr} 267