155682Smarkm/*
2233294Sstas * Copyright (c) 1997 - 2000 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
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.
1655682Smarkm *
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.
2055682Smarkm *
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.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "kadm5_locl.h"
3555682Smarkm
36233294SstasRCSID("$Id$");
3755682Smarkm
3855682Smarkm
39233294Sstasstatic kadm5_ret_t
4055682Smarkmkadm5_s_init_with_context(krb5_context context,
41233294Sstas			  const char *client_name,
4255682Smarkm			  const char *service_name,
4355682Smarkm			  kadm5_config_params *realm_params,
4455682Smarkm			  unsigned long struct_version,
4555682Smarkm			  unsigned long api_version,
4655682Smarkm			  void **server_handle)
4755682Smarkm{
4855682Smarkm    kadm5_ret_t ret;
4955682Smarkm    kadm5_server_context *ctx;
5055682Smarkm    ret = _kadm5_s_init_context(&ctx, realm_params, context);
5155682Smarkm    if(ret)
5255682Smarkm	return ret;
5355682Smarkm
5455682Smarkm    assert(ctx->config.dbname != NULL);
5555682Smarkm    assert(ctx->config.stash_file != NULL);
5655682Smarkm    assert(ctx->config.acl_file != NULL);
5755682Smarkm    assert(ctx->log_context.log_file != NULL);
58233294Sstas#ifndef NO_UNIX_SOCKETS
5955682Smarkm    assert(ctx->log_context.socket_name.sun_path[0] != '\0');
60233294Sstas#else
61233294Sstas    assert(ctx->log_context.socket_info != NULL);
62233294Sstas#endif
6355682Smarkm
6455682Smarkm    ret = hdb_create(ctx->context, &ctx->db, ctx->config.dbname);
6555682Smarkm    if(ret)
6655682Smarkm	return ret;
67233294Sstas    ret = hdb_set_master_keyfile (ctx->context,
6855682Smarkm				  ctx->db, ctx->config.stash_file);
6955682Smarkm    if(ret)
7055682Smarkm	return ret;
7155682Smarkm
7255682Smarkm    ctx->log_context.log_fd   = -1;
7355682Smarkm
74233294Sstas#ifndef NO_UNIX_SOCKETS
7555682Smarkm    ctx->log_context.socket_fd = socket (AF_UNIX, SOCK_DGRAM, 0);
76233294Sstas#else
77233294Sstas    ctx->log_context.socket_fd = socket (ctx->log_context.socket_info->ai_family,
78233294Sstas					 ctx->log_context.socket_info->ai_socktype,
79233294Sstas					 ctx->log_context.socket_info->ai_protocol);
80233294Sstas#endif
8155682Smarkm
8255682Smarkm    ret = krb5_parse_name(ctx->context, client_name, &ctx->caller);
8355682Smarkm    if(ret)
8455682Smarkm	return ret;
8555682Smarkm
8655682Smarkm    ret = _kadm5_acl_init(ctx);
8755682Smarkm    if(ret)
8855682Smarkm	return ret;
89233294Sstas
9055682Smarkm    *server_handle = ctx;
9155682Smarkm    return 0;
9255682Smarkm}
9355682Smarkm
94233294Sstaskadm5_ret_t
9555682Smarkmkadm5_s_init_with_password_ctx(krb5_context context,
96233294Sstas			       const char *client_name,
9755682Smarkm			       const char *password,
9855682Smarkm			       const char *service_name,
9955682Smarkm			       kadm5_config_params *realm_params,
10055682Smarkm			       unsigned long struct_version,
10155682Smarkm			       unsigned long api_version,
10255682Smarkm			       void **server_handle)
10355682Smarkm{
10455682Smarkm    return kadm5_s_init_with_context(context,
10555682Smarkm				     client_name,
10655682Smarkm				     service_name,
10755682Smarkm				     realm_params,
10855682Smarkm				     struct_version,
10955682Smarkm				     api_version,
11055682Smarkm				     server_handle);
11155682Smarkm}
11255682Smarkm
113233294Sstaskadm5_ret_t
114233294Sstaskadm5_s_init_with_password(const char *client_name,
11555682Smarkm			   const char *password,
11655682Smarkm			   const char *service_name,
11755682Smarkm			   kadm5_config_params *realm_params,
11855682Smarkm			   unsigned long struct_version,
11955682Smarkm			   unsigned long api_version,
12055682Smarkm			   void **server_handle)
12155682Smarkm{
12255682Smarkm    krb5_context context;
12355682Smarkm    kadm5_ret_t ret;
12455682Smarkm    kadm5_server_context *ctx;
12555682Smarkm
12672445Sassar    ret = krb5_init_context(&context);
12772445Sassar    if (ret)
12872445Sassar	return ret;
129233294Sstas    ret = kadm5_s_init_with_password_ctx(context,
130233294Sstas					 client_name,
131233294Sstas					 password,
132233294Sstas					 service_name,
133233294Sstas					 realm_params,
134233294Sstas					 struct_version,
135233294Sstas					 api_version,
13655682Smarkm					 server_handle);
13755682Smarkm    if(ret){
13855682Smarkm	krb5_free_context(context);
13955682Smarkm	return ret;
14055682Smarkm    }
14155682Smarkm    ctx = *server_handle;
14255682Smarkm    ctx->my_context = 1;
14355682Smarkm    return 0;
14455682Smarkm}
14555682Smarkm
146233294Sstaskadm5_ret_t
14755682Smarkmkadm5_s_init_with_skey_ctx(krb5_context context,
148233294Sstas			   const char *client_name,
14955682Smarkm			   const char *keytab,
15055682Smarkm			   const char *service_name,
15155682Smarkm			   kadm5_config_params *realm_params,
15255682Smarkm			   unsigned long struct_version,
15355682Smarkm			   unsigned long api_version,
15455682Smarkm			   void **server_handle)
15555682Smarkm{
15655682Smarkm    return kadm5_s_init_with_context(context,
15755682Smarkm				     client_name,
15855682Smarkm				     service_name,
15955682Smarkm				     realm_params,
16055682Smarkm				     struct_version,
16155682Smarkm				     api_version,
16255682Smarkm				     server_handle);
16355682Smarkm}
16455682Smarkm
165233294Sstaskadm5_ret_t
16655682Smarkmkadm5_s_init_with_skey(const char *client_name,
16755682Smarkm		       const char *keytab,
16855682Smarkm		       const char *service_name,
16955682Smarkm		       kadm5_config_params *realm_params,
17055682Smarkm		       unsigned long struct_version,
17155682Smarkm		       unsigned long api_version,
17255682Smarkm		       void **server_handle)
17355682Smarkm{
17455682Smarkm    krb5_context context;
17555682Smarkm    kadm5_ret_t ret;
17655682Smarkm    kadm5_server_context *ctx;
17755682Smarkm
17872445Sassar    ret = krb5_init_context(&context);
17972445Sassar    if (ret)
18072445Sassar	return ret;
181233294Sstas    ret = kadm5_s_init_with_skey_ctx(context,
182233294Sstas				     client_name,
183233294Sstas				     keytab,
184233294Sstas				     service_name,
185233294Sstas				     realm_params,
186233294Sstas				     struct_version,
187233294Sstas				     api_version,
18855682Smarkm				     server_handle);
18955682Smarkm    if(ret){
19055682Smarkm	krb5_free_context(context);
19155682Smarkm	return ret;
19255682Smarkm    }
19355682Smarkm    ctx = *server_handle;
19455682Smarkm    ctx->my_context = 1;
19555682Smarkm    return 0;
19655682Smarkm}
19755682Smarkm
198233294Sstaskadm5_ret_t
19955682Smarkmkadm5_s_init_with_creds_ctx(krb5_context context,
20055682Smarkm			    const char *client_name,
20155682Smarkm			    krb5_ccache ccache,
20255682Smarkm			    const char *service_name,
20355682Smarkm			    kadm5_config_params *realm_params,
20455682Smarkm			    unsigned long struct_version,
20555682Smarkm			    unsigned long api_version,
20655682Smarkm			    void **server_handle)
20755682Smarkm{
20855682Smarkm    return kadm5_s_init_with_context(context,
20955682Smarkm				     client_name,
21055682Smarkm				     service_name,
21155682Smarkm				     realm_params,
21255682Smarkm				     struct_version,
21355682Smarkm				     api_version,
21455682Smarkm				     server_handle);
21555682Smarkm}
21655682Smarkm
217233294Sstaskadm5_ret_t
21855682Smarkmkadm5_s_init_with_creds(const char *client_name,
21955682Smarkm			krb5_ccache ccache,
22055682Smarkm			const char *service_name,
22155682Smarkm			kadm5_config_params *realm_params,
22255682Smarkm			unsigned long struct_version,
22355682Smarkm			unsigned long api_version,
22455682Smarkm			void **server_handle)
22555682Smarkm{
22655682Smarkm    krb5_context context;
22755682Smarkm    kadm5_ret_t ret;
22855682Smarkm    kadm5_server_context *ctx;
22955682Smarkm
23072445Sassar    ret = krb5_init_context(&context);
23172445Sassar    if (ret)
23272445Sassar	return ret;
233233294Sstas    ret = kadm5_s_init_with_creds_ctx(context,
234233294Sstas				      client_name,
235233294Sstas				      ccache,
236233294Sstas				      service_name,
237233294Sstas				      realm_params,
238233294Sstas				      struct_version,
239233294Sstas				      api_version,
24055682Smarkm				      server_handle);
24155682Smarkm    if(ret){
24255682Smarkm	krb5_free_context(context);
24355682Smarkm	return ret;
24455682Smarkm    }
24555682Smarkm    ctx = *server_handle;
24655682Smarkm    ctx->my_context = 1;
24755682Smarkm    return 0;
24855682Smarkm}
249