/ lib / kadm5 / init_s.c
init_s.c
  1  /*
  2   * Copyright (c) 1997 - 2000 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  
 39  static kadm5_ret_t
 40  kadm5_s_init_with_context(krb5_context context,
 41  			  const char *client_name,
 42  			  const char *service_name,
 43  			  kadm5_config_params *realm_params,
 44  			  unsigned long struct_version,
 45  			  unsigned long api_version,
 46  			  void **server_handle)
 47  {
 48      kadm5_ret_t ret;
 49      kadm5_server_context *ctx;
 50      ret = _kadm5_s_init_context(&ctx, realm_params, context);
 51      if(ret)
 52  	return ret;
 53  
 54      assert(ctx->config.dbname != NULL);
 55      assert(ctx->config.stash_file != NULL);
 56      assert(ctx->config.acl_file != NULL);
 57      assert(ctx->log_context.log_file != NULL);
 58  #ifndef NO_UNIX_SOCKETS
 59      assert(ctx->log_context.socket_name.sun_path[0] != '\0');
 60  #else
 61      assert(ctx->log_context.socket_info != NULL);
 62  #endif
 63  
 64      ret = hdb_create(ctx->context, &ctx->db, ctx->config.dbname);
 65      if(ret)
 66  	return ret;
 67      ret = hdb_set_master_keyfile (ctx->context,
 68  				  ctx->db, ctx->config.stash_file);
 69      if(ret)
 70  	return ret;
 71  
 72      ctx->log_context.log_fd   = -1;
 73  
 74  #ifndef NO_UNIX_SOCKETS
 75      ctx->log_context.socket_fd = socket (AF_UNIX, SOCK_DGRAM, 0);
 76  #else
 77      ctx->log_context.socket_fd = socket (ctx->log_context.socket_info->ai_family,
 78  					 ctx->log_context.socket_info->ai_socktype,
 79  					 ctx->log_context.socket_info->ai_protocol);
 80  #endif
 81      if (!rk_IS_BAD_SOCKET(ctx->log_context.socket_fd))
 82  	socket_set_nopipe(ctx->log_context.socket_fd, ctx->log_context.socket_fd);
 83  
 84      ret = krb5_parse_name(ctx->context, client_name, &ctx->caller);
 85      if(ret)
 86  	return ret;
 87  
 88      ret = _kadm5_acl_init(ctx);
 89      if(ret)
 90  	return ret;
 91  
 92      *server_handle = ctx;
 93      return 0;
 94  }
 95  
 96  kadm5_ret_t
 97  kadm5_s_init_with_password_ctx(krb5_context context,
 98  			       const char *client_name,
 99  			       const char *password,
100  			       const char *service_name,
101  			       kadm5_config_params *realm_params,
102  			       unsigned long struct_version,
103  			       unsigned long api_version,
104  			       void **server_handle)
105  {
106      return kadm5_s_init_with_context(context,
107  				     client_name,
108  				     service_name,
109  				     realm_params,
110  				     struct_version,
111  				     api_version,
112  				     server_handle);
113  }
114  
115  kadm5_ret_t
116  kadm5_s_init_with_password(const char *client_name,
117  			   const char *password,
118  			   const char *service_name,
119  			   kadm5_config_params *realm_params,
120  			   unsigned long struct_version,
121  			   unsigned long api_version,
122  			   void **server_handle)
123  {
124      krb5_context context;
125      kadm5_ret_t ret;
126      kadm5_server_context *ctx;
127  
128      ret = krb5_init_context(&context);
129      if (ret)
130  	return ret;
131      ret = kadm5_s_init_with_password_ctx(context,
132  					 client_name,
133  					 password,
134  					 service_name,
135  					 realm_params,
136  					 struct_version,
137  					 api_version,
138  					 server_handle);
139      if(ret){
140  	krb5_free_context(context);
141  	return ret;
142      }
143      ctx = *server_handle;
144      ctx->my_context = 1;
145      return 0;
146  }
147  
148  kadm5_ret_t
149  kadm5_s_init_with_skey_ctx(krb5_context context,
150  			   const char *client_name,
151  			   const char *keytab,
152  			   const char *service_name,
153  			   kadm5_config_params *realm_params,
154  			   unsigned long struct_version,
155  			   unsigned long api_version,
156  			   void **server_handle)
157  {
158      return kadm5_s_init_with_context(context,
159  				     client_name,
160  				     service_name,
161  				     realm_params,
162  				     struct_version,
163  				     api_version,
164  				     server_handle);
165  }
166  
167  kadm5_ret_t
168  kadm5_s_init_with_skey(const char *client_name,
169  		       const char *keytab,
170  		       const char *service_name,
171  		       kadm5_config_params *realm_params,
172  		       unsigned long struct_version,
173  		       unsigned long api_version,
174  		       void **server_handle)
175  {
176      krb5_context context;
177      kadm5_ret_t ret;
178      kadm5_server_context *ctx;
179  
180      ret = krb5_init_context(&context);
181      if (ret)
182  	return ret;
183      ret = kadm5_s_init_with_skey_ctx(context,
184  				     client_name,
185  				     keytab,
186  				     service_name,
187  				     realm_params,
188  				     struct_version,
189  				     api_version,
190  				     server_handle);
191      if(ret){
192  	krb5_free_context(context);
193  	return ret;
194      }
195      ctx = *server_handle;
196      ctx->my_context = 1;
197      return 0;
198  }
199  
200  kadm5_ret_t
201  kadm5_s_init_with_creds_ctx(krb5_context context,
202  			    const char *client_name,
203  			    krb5_ccache ccache,
204  			    const char *service_name,
205  			    kadm5_config_params *realm_params,
206  			    unsigned long struct_version,
207  			    unsigned long api_version,
208  			    void **server_handle)
209  {
210      return kadm5_s_init_with_context(context,
211  				     client_name,
212  				     service_name,
213  				     realm_params,
214  				     struct_version,
215  				     api_version,
216  				     server_handle);
217  }
218  
219  kadm5_ret_t
220  kadm5_s_init_with_creds(const char *client_name,
221  			krb5_ccache ccache,
222  			const char *service_name,
223  			kadm5_config_params *realm_params,
224  			unsigned long struct_version,
225  			unsigned long api_version,
226  			void **server_handle)
227  {
228      krb5_context context;
229      kadm5_ret_t ret;
230      kadm5_server_context *ctx;
231  
232      ret = krb5_init_context(&context);
233      if (ret)
234  	return ret;
235      ret = kadm5_s_init_with_creds_ctx(context,
236  				      client_name,
237  				      ccache,
238  				      service_name,
239  				      realm_params,
240  				      struct_version,
241  				      api_version,
242  				      server_handle);
243      if(ret){
244  	krb5_free_context(context);
245  	return ret;
246      }
247      ctx = *server_handle;
248      ctx->my_context = 1;
249      return 0;
250  }