/ kdc / windc.c
windc.c
  1  /*
  2   * Copyright (c) 2007 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 "kdc_locl.h"
 35  
 36  static krb5plugin_windc_ftable *windcft;
 37  static void *windcctx;
 38  
 39  /*
 40   * Pick the first WINDC module that we find.
 41   */
 42  
 43  krb5_error_code
 44  krb5_kdc_windc_init(krb5_context context)
 45  {
 46      struct krb5_plugin *list = NULL, *e;
 47      krb5_error_code ret;
 48  
 49      ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "windc", &list);
 50      if(ret != 0 || list == NULL)
 51  	return 0;
 52  
 53      for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) {
 54  
 55  	windcft = _krb5_plugin_get_symbol(e);
 56  	if (windcft->minor_version < KRB5_WINDC_PLUGIN_MINOR)
 57  	    continue;
 58  
 59  	(*windcft->init)(context, &windcctx);
 60  	break;
 61      }
 62      _krb5_plugin_free(list);
 63      if (e == NULL) {
 64  	krb5_set_error_message(context, ENOENT, "Did not find any WINDC plugin");
 65  	windcft = NULL;
 66  	return ENOENT;
 67      }
 68  
 69      return 0;
 70  }
 71  
 72  
 73  krb5_error_code
 74  _kdc_pac_generate(krb5_context context,
 75  		  hdb_entry_ex *client,
 76  		  krb5_pac *pac)
 77  {
 78      *pac = NULL;
 79      if (windcft == NULL)
 80  	return 0;
 81      return (windcft->pac_generate)(windcctx, context, client, pac);
 82  }
 83  
 84  krb5_error_code
 85  _kdc_pac_verify(krb5_context context,
 86  		const krb5_principal client_principal,
 87  		const krb5_principal delegated_proxy_principal,
 88  		hdb_entry_ex *client,
 89  		hdb_entry_ex *server,
 90  		hdb_entry_ex *krbtgt,
 91  		krb5_pac *pac,
 92  		int *verified)
 93  {
 94      krb5_error_code ret;
 95  
 96      if (windcft == NULL)
 97  	return 0;
 98  
 99      ret = windcft->pac_verify(windcctx, context,
100  			      client_principal,
101  			      delegated_proxy_principal,
102  			      client, server, krbtgt, pac);
103      if (ret == 0)
104  	*verified = 1;
105      return ret;
106  }
107  
108  krb5_error_code
109  _kdc_check_access(krb5_context context,
110  		  krb5_kdc_configuration *config,
111  		  hdb_entry_ex *client_ex, const char *client_name,
112  		  hdb_entry_ex *server_ex, const char *server_name,
113  		  KDC_REQ *req,
114  		  METHOD_DATA *method_data)
115  {
116      if (windcft == NULL || windcft->client_access == NULL)
117  	    return kdc_check_flags(context, config,
118  				   client_ex, client_name,
119  				   server_ex, server_name,
120  				   req->msg_type == krb_as_req);
121  
122      return (windcft->client_access)(windcctx, 
123  				    context, config, 
124  				    client_ex, client_name, 
125  				    server_ex, server_name, 
126  				    req, method_data);
127  }