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