]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - crypto/heimdal/lib/kadm5/context_s.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / crypto / heimdal / lib / kadm5 / context_s.c
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 }