xref: /freebsd/crypto/heimdal/lib/kadm5/context_s.c (revision d8a0fe102c0cfdfcd5b818f850eff09d8536c9bc)
1 /*
2  * Copyright (c) 1997 - 2002 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden).
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the Institute nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #include "kadm5_locl.h"
35 
36 RCSID("$Id$");
37 
38 static void
39 set_funcs(kadm5_server_context *c)
40 {
41 #define SET(C, F) (C)->funcs.F = kadm5_s_ ## F
42     SET(c, chpass_principal);
43     SET(c, chpass_principal_with_key);
44     SET(c, create_principal);
45     SET(c, delete_principal);
46     SET(c, destroy);
47     SET(c, flush);
48     SET(c, get_principal);
49     SET(c, get_principals);
50     SET(c, get_privs);
51     SET(c, modify_principal);
52     SET(c, randkey_principal);
53     SET(c, rename_principal);
54 }
55 
56 #ifndef NO_UNIX_SOCKETS
57 
58 static void
59 set_socket_name(krb5_context context, struct sockaddr_un *un)
60 {
61     const char *fn = kadm5_log_signal_socket(context);
62 
63     memset(un, 0, sizeof(*un));
64     un->sun_family = AF_UNIX;
65     strlcpy (un->sun_path, fn, sizeof(un->sun_path));
66 
67 }
68 #else
69 
70 static void
71 set_socket_info(krb5_context context, struct addrinfo **info)
72 {
73     kadm5_log_signal_socket_info(context, 0, info);
74 }
75 
76 #endif
77 
78 static kadm5_ret_t
79 find_db_spec(kadm5_server_context *ctx)
80 {
81     krb5_context context = ctx->context;
82     struct hdb_dbinfo *info, *d;
83     krb5_error_code ret;
84 
85     if (ctx->config.realm) {
86 	/* fetch the databases */
87 	ret = hdb_get_dbinfo(context, &info);
88 	if (ret)
89 	    return ret;
90 
91 	d = NULL;
92 	while ((d = hdb_dbinfo_get_next(info, d)) != NULL) {
93 	    const char *p = hdb_dbinfo_get_realm(context, d);
94 
95 	    /* match default (realm-less) */
96 	    if(p != NULL && strcmp(ctx->config.realm, p) != 0)
97 		continue;
98 
99 	    p = hdb_dbinfo_get_dbname(context, d);
100 	    if (p)
101 		ctx->config.dbname = strdup(p);
102 
103 	    p = hdb_dbinfo_get_acl_file(context, d);
104 	    if (p)
105 		ctx->config.acl_file = strdup(p);
106 
107 	    p = hdb_dbinfo_get_mkey_file(context, d);
108 	    if (p)
109 		ctx->config.stash_file = strdup(p);
110 
111 	    p = hdb_dbinfo_get_log_file(context, d);
112 	    if (p)
113 		ctx->log_context.log_file = strdup(p);
114 	    break;
115 	}
116 	hdb_free_dbinfo(context, &info);
117     }
118 
119     /* If any of the values was unset, pick up the default value */
120 
121     if (ctx->config.dbname == NULL)
122 	ctx->config.dbname = strdup(hdb_default_db(context));
123     if (ctx->config.acl_file == NULL)
124 	asprintf(&ctx->config.acl_file, "%s/kadmind.acl", hdb_db_dir(context));
125     if (ctx->config.stash_file == NULL)
126 	asprintf(&ctx->config.stash_file, "%s/m-key", hdb_db_dir(context));
127     if (ctx->log_context.log_file == NULL)
128 	asprintf(&ctx->log_context.log_file, "%s/log", hdb_db_dir(context));
129 
130 #ifndef NO_UNIX_SOCKETS
131     set_socket_name(context, &ctx->log_context.socket_name);
132 #else
133     set_socket_info(context, &ctx->log_context.socket_info);
134 #endif
135 
136     return 0;
137 }
138 
139 kadm5_ret_t
140 _kadm5_s_init_context(kadm5_server_context **ctx,
141 		      kadm5_config_params *params,
142 		      krb5_context context)
143 {
144     *ctx = malloc(sizeof(**ctx));
145     if(*ctx == NULL)
146 	return ENOMEM;
147     memset(*ctx, 0, sizeof(**ctx));
148     set_funcs(*ctx);
149     (*ctx)->context = context;
150     krb5_add_et_list (context, initialize_kadm5_error_table_r);
151 #define is_set(M) (params && params->mask & KADM5_CONFIG_ ## M)
152     if(is_set(REALM))
153 	(*ctx)->config.realm = strdup(params->realm);
154     else
155 	krb5_get_default_realm(context, &(*ctx)->config.realm);
156     if(is_set(DBNAME))
157 	(*ctx)->config.dbname = strdup(params->dbname);
158     if(is_set(ACL_FILE))
159 	(*ctx)->config.acl_file = strdup(params->acl_file);
160     if(is_set(STASH_FILE))
161 	(*ctx)->config.stash_file = strdup(params->stash_file);
162 
163     find_db_spec(*ctx);
164 
165     /* PROFILE can't be specified for now */
166     /* KADMIND_PORT is supposed to be used on the server also,
167        but this doesn't make sense */
168     /* ADMIN_SERVER is client only */
169     /* ADNAME is not used at all (as far as I can tell) */
170     /* ADB_LOCKFILE ditto */
171     /* DICT_FILE */
172     /* ADMIN_KEYTAB */
173     /* MKEY_FROM_KEYBOARD is not supported */
174     /* MKEY_NAME neither */
175     /* ENCTYPE */
176     /* MAX_LIFE */
177     /* MAX_RLIFE */
178     /* EXPIRATION */
179     /* FLAGS */
180     /* ENCTYPES */
181 
182     return 0;
183 }
184 
185 HDB *
186 _kadm5_s_get_db(void *server_handle)
187 {
188     kadm5_server_context *context = server_handle;
189     return context->db;
190 }
191