init_s.c revision 55682
155682Smarkm/*
255682Smarkm * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H�gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
555682Smarkm *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
955682Smarkm *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
2055682Smarkm *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "kadm5_locl.h"
3555682Smarkm
3655682SmarkmRCSID("$Id: init_s.c,v 1.9 1999/12/02 17:05:06 joda Exp $");
3755682Smarkm
3855682Smarkm
3955682Smarkmstatic kadm5_ret_t
4055682Smarkmkadm5_s_init_with_context(krb5_context context,
4155682Smarkm			  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);
5855682Smarkm    assert(ctx->log_context.socket_name.sun_path[0] != '\0');
5955682Smarkm
6055682Smarkm    ret = hdb_create(ctx->context, &ctx->db, ctx->config.dbname);
6155682Smarkm    if(ret)
6255682Smarkm	return ret;
6355682Smarkm    ret = hdb_set_master_keyfile (ctx->context,
6455682Smarkm				  ctx->db, ctx->config.stash_file);
6555682Smarkm    if(ret)
6655682Smarkm	return ret;
6755682Smarkm
6855682Smarkm    ctx->log_context.log_fd   = -1;
6955682Smarkm
7055682Smarkm    ctx->log_context.socket_fd = socket (AF_UNIX, SOCK_DGRAM, 0);
7155682Smarkm
7255682Smarkm    ret = krb5_parse_name(ctx->context, client_name, &ctx->caller);
7355682Smarkm    if(ret)
7455682Smarkm	return ret;
7555682Smarkm
7655682Smarkm    ret = _kadm5_acl_init(ctx);
7755682Smarkm    if(ret)
7855682Smarkm	return ret;
7955682Smarkm
8055682Smarkm    *server_handle = ctx;
8155682Smarkm    return 0;
8255682Smarkm}
8355682Smarkm
8455682Smarkmkadm5_ret_t
8555682Smarkmkadm5_s_init_with_password_ctx(krb5_context context,
8655682Smarkm			       const char *client_name,
8755682Smarkm			       const char *password,
8855682Smarkm			       const char *service_name,
8955682Smarkm			       kadm5_config_params *realm_params,
9055682Smarkm			       unsigned long struct_version,
9155682Smarkm			       unsigned long api_version,
9255682Smarkm			       void **server_handle)
9355682Smarkm{
9455682Smarkm    return kadm5_s_init_with_context(context,
9555682Smarkm				     client_name,
9655682Smarkm				     service_name,
9755682Smarkm				     realm_params,
9855682Smarkm				     struct_version,
9955682Smarkm				     api_version,
10055682Smarkm				     server_handle);
10155682Smarkm}
10255682Smarkm
10355682Smarkmkadm5_ret_t
10455682Smarkmkadm5_s_init_with_password(const char *client_name,
10555682Smarkm			   const char *password,
10655682Smarkm			   const char *service_name,
10755682Smarkm			   kadm5_config_params *realm_params,
10855682Smarkm			   unsigned long struct_version,
10955682Smarkm			   unsigned long api_version,
11055682Smarkm			   void **server_handle)
11155682Smarkm{
11255682Smarkm    krb5_context context;
11355682Smarkm    kadm5_ret_t ret;
11455682Smarkm    kadm5_server_context *ctx;
11555682Smarkm
11655682Smarkm    krb5_init_context(&context);
11755682Smarkm    ret = kadm5_s_init_with_password_ctx(context,
11855682Smarkm					 client_name,
11955682Smarkm					 password,
12055682Smarkm					 service_name,
12155682Smarkm					 realm_params,
12255682Smarkm					 struct_version,
12355682Smarkm					 api_version,
12455682Smarkm					 server_handle);
12555682Smarkm    if(ret){
12655682Smarkm	krb5_free_context(context);
12755682Smarkm	return ret;
12855682Smarkm    }
12955682Smarkm    ctx = *server_handle;
13055682Smarkm    ctx->my_context = 1;
13155682Smarkm    return 0;
13255682Smarkm}
13355682Smarkm
13455682Smarkmkadm5_ret_t
13555682Smarkmkadm5_s_init_with_skey_ctx(krb5_context context,
13655682Smarkm			   const char *client_name,
13755682Smarkm			   const char *keytab,
13855682Smarkm			   const char *service_name,
13955682Smarkm			   kadm5_config_params *realm_params,
14055682Smarkm			   unsigned long struct_version,
14155682Smarkm			   unsigned long api_version,
14255682Smarkm			   void **server_handle)
14355682Smarkm{
14455682Smarkm    return kadm5_s_init_with_context(context,
14555682Smarkm				     client_name,
14655682Smarkm				     service_name,
14755682Smarkm				     realm_params,
14855682Smarkm				     struct_version,
14955682Smarkm				     api_version,
15055682Smarkm				     server_handle);
15155682Smarkm}
15255682Smarkm
15355682Smarkmkadm5_ret_t
15455682Smarkmkadm5_s_init_with_skey(const char *client_name,
15555682Smarkm		       const char *keytab,
15655682Smarkm		       const char *service_name,
15755682Smarkm		       kadm5_config_params *realm_params,
15855682Smarkm		       unsigned long struct_version,
15955682Smarkm		       unsigned long api_version,
16055682Smarkm		       void **server_handle)
16155682Smarkm{
16255682Smarkm    krb5_context context;
16355682Smarkm    kadm5_ret_t ret;
16455682Smarkm    kadm5_server_context *ctx;
16555682Smarkm
16655682Smarkm    krb5_init_context(&context);
16755682Smarkm    ret = kadm5_s_init_with_skey_ctx(context,
16855682Smarkm				     client_name,
16955682Smarkm				     keytab,
17055682Smarkm				     service_name,
17155682Smarkm				     realm_params,
17255682Smarkm				     struct_version,
17355682Smarkm				     api_version,
17455682Smarkm				     server_handle);
17555682Smarkm    if(ret){
17655682Smarkm	krb5_free_context(context);
17755682Smarkm	return ret;
17855682Smarkm    }
17955682Smarkm    ctx = *server_handle;
18055682Smarkm    ctx->my_context = 1;
18155682Smarkm    return 0;
18255682Smarkm}
18355682Smarkm
18455682Smarkmkadm5_ret_t
18555682Smarkmkadm5_s_init_with_creds_ctx(krb5_context context,
18655682Smarkm			    const char *client_name,
18755682Smarkm			    krb5_ccache ccache,
18855682Smarkm			    const char *service_name,
18955682Smarkm			    kadm5_config_params *realm_params,
19055682Smarkm			    unsigned long struct_version,
19155682Smarkm			    unsigned long api_version,
19255682Smarkm			    void **server_handle)
19355682Smarkm{
19455682Smarkm    return kadm5_s_init_with_context(context,
19555682Smarkm				     client_name,
19655682Smarkm				     service_name,
19755682Smarkm				     realm_params,
19855682Smarkm				     struct_version,
19955682Smarkm				     api_version,
20055682Smarkm				     server_handle);
20155682Smarkm}
20255682Smarkm
20355682Smarkmkadm5_ret_t
20455682Smarkmkadm5_s_init_with_creds(const char *client_name,
20555682Smarkm			krb5_ccache ccache,
20655682Smarkm			const char *service_name,
20755682Smarkm			kadm5_config_params *realm_params,
20855682Smarkm			unsigned long struct_version,
20955682Smarkm			unsigned long api_version,
21055682Smarkm			void **server_handle)
21155682Smarkm{
21255682Smarkm    krb5_context context;
21355682Smarkm    kadm5_ret_t ret;
21455682Smarkm    kadm5_server_context *ctx;
21555682Smarkm
21655682Smarkm    krb5_init_context(&context);
21755682Smarkm    ret = kadm5_s_init_with_creds_ctx(context,
21855682Smarkm				      client_name,
21955682Smarkm				      ccache,
22055682Smarkm				      service_name,
22155682Smarkm				      realm_params,
22255682Smarkm				      struct_version,
22355682Smarkm				      api_version,
22455682Smarkm				      server_handle);
22555682Smarkm    if(ret){
22655682Smarkm	krb5_free_context(context);
22755682Smarkm	return ret;
22855682Smarkm    }
22955682Smarkm    ctx = *server_handle;
23055682Smarkm    ctx->my_context = 1;
23155682Smarkm    return 0;
23255682Smarkm}
233