1/*
2 * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * 3. Neither the name of the Institute nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#include "kdc_locl.h"
37
38static krb5_error_code
39add_db(krb5_context context, struct krb5_kdc_configuration *c,
40       const char *conf, const char *master_key)
41{
42    krb5_error_code ret;
43    void *ptr;
44
45    ptr = realloc(c->db, (c->num_db + 1) * sizeof(*c->db));
46    if (ptr == NULL) {
47	krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
48	return ENOMEM;
49    }
50    c->db = ptr;
51
52    ret = hdb_create(context, &c->db[c->num_db], conf);
53    if(ret)
54	return ret;
55
56    c->num_db++;
57
58    if (master_key) {
59	ret = hdb_set_master_keyfile(context, c->db[c->num_db - 1], master_key);
60	if (ret)
61	    return ret;
62    }
63
64    return 0;
65}
66
67krb5_error_code
68krb5_kdc_set_dbinfo(krb5_context context, struct krb5_kdc_configuration *c)
69{
70    struct hdb_dbinfo *info, *d;
71    krb5_error_code ret;
72    int i;
73
74    /* fetch the databases */
75    ret = hdb_get_dbinfo(context, &info);
76    if (ret)
77	return ret;
78
79    d = NULL;
80    while ((d = hdb_dbinfo_get_next(info, d)) != NULL) {
81
82	ret = add_db(context, c,
83		     hdb_dbinfo_get_dbname(context, d),
84		     hdb_dbinfo_get_mkey_file(context, d));
85	if (ret)
86	    goto out;
87
88	kdc_log(context, c, 0, "label: %s",
89		hdb_dbinfo_get_label(context, d));
90	kdc_log(context, c, 0, "\tdbname: %s",
91		hdb_dbinfo_get_dbname(context, d));
92	kdc_log(context, c, 0, "\tmkey_file: %s",
93		hdb_dbinfo_get_mkey_file(context, d));
94	kdc_log(context, c, 0, "\tacl_file: %s",
95		hdb_dbinfo_get_acl_file(context, d));
96    }
97    hdb_free_dbinfo(context, &info);
98
99    return 0;
100out:
101    for (i = 0; i < c->num_db; i++)
102	if (c->db[i] && c->db[i]->hdb_destroy)
103	    (*c->db[i]->hdb_destroy)(context, c->db[i]);
104    c->num_db = 0;
105    free(c->db);
106    c->db = NULL;
107
108    hdb_free_dbinfo(context, &info);
109
110    return ret;
111}
112
113
114