/ lib / gssapi / krb5 / init.c
init.c
  1  /*
  2   * Copyright (c) 1997 - 2001, 2003, 2006 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 "gsskrb5_locl.h"
 35  
 36  heim_string_t _gsskrb5_kGSSICPassword;
 37  heim_string_t _gsskrb5_kGSSICKerberosCacheName;
 38  heim_string_t _gsskrb5_kGSSICSiteName;
 39  heim_string_t _gsskrb5_kGSSICCertificate;
 40  heim_string_t _gsskrb5_kGSSICLKDCHostname;
 41  heim_string_t _gsskrb5_kGSSICAppIdentifierACL;
 42  heim_string_t _gsskrb5_kGSSICAppleSourceApp;
 43  heim_string_t _gsskrb5_kGSSICAppleSourceAppAuditToken;
 44  heim_string_t _gsskrb5_kGSSICAppleSourceAppPID;
 45  heim_string_t _gsskrb5_kGSSICAppleSourceAppUUID;
 46  heim_string_t _gsskrb5_kGSSICAppleSourceAppSigningIdentity;
 47  heim_string_t _gsskrb5_kGSSICVerifyCredential;
 48  heim_string_t _gsskrb5_kGSSICVerifyCredentialAcceptorName;
 49  heim_string_t _gsskrb5_kGSSICCreateNewCredential;
 50  heim_string_t _gsskrb5_kGSSICAuthenticationContext;
 51  
 52  static HEIMDAL_thread_key context_key;
 53  
 54  static void
 55  destroy_context(void *ptr)
 56  {
 57      krb5_context context = ptr;
 58  
 59      if (context == NULL)
 60  	return;
 61      krb5_free_context(context);
 62  }
 63  
 64  static void
 65  once_func(void *ctx)
 66  {
 67      int ret;
 68  
 69      _gsskrb5_kGSSICPassword = heim_string_create("kGSSICPassword");
 70      _gsskrb5_kGSSICCertificate = heim_string_create("kGSSICCertificate");
 71      _gsskrb5_kGSSICSiteName = heim_string_create("kGSSICSiteName");
 72      _gsskrb5_kGSSICKerberosCacheName = heim_string_create("kGSSICKerberosCacheName");
 73      _gsskrb5_kGSSICLKDCHostname = heim_string_create("kGSSICLKDCHostname");
 74      _gsskrb5_kGSSICAppIdentifierACL = heim_string_create("kGSSICAppIdentifierACL");
 75      _gsskrb5_kGSSICAppleSourceApp = heim_string_create("kGSSICAppleSourceApp");
 76      _gsskrb5_kGSSICAppleSourceAppAuditToken = heim_string_create("kGSSICAppleSourceAppAuditToken");
 77      _gsskrb5_kGSSICAppleSourceAppPID = heim_string_create("kGSSICAppleSourceAppPID");
 78      _gsskrb5_kGSSICAppleSourceAppUUID = heim_string_create("kGSSICAppleSourceAppUUID");
 79      _gsskrb5_kGSSICAppleSourceAppSigningIdentity = heim_string_create("kGSSICAppleSourceAppSigningIdentity");
 80      _gsskrb5_kGSSICVerifyCredential = heim_string_create("kGSSICVerifyCredential");
 81      _gsskrb5_kGSSICVerifyCredentialAcceptorName = heim_string_create("kGSSICVerifyCredentialAcceptorName");
 82      _gsskrb5_kGSSICCreateNewCredential = heim_string_create("kGSSICCreateNewCredential");
 83      _gsskrb5_kGSSICAuthenticationContext = heim_string_create("kGSSICAuthenticationContext");
 84      
 85      HEIMDAL_key_create(&context_key, destroy_context, ret);
 86  }
 87  
 88  krb5_error_code
 89  _gsskrb5_init (krb5_context *context)
 90  {
 91      static heim_base_once_t once;
 92      krb5_error_code ret = 0;
 93  
 94      heim_base_once_f(&once, NULL, once_func);
 95  
 96      *context = HEIMDAL_getspecific(context_key);
 97      if (*context == NULL) {
 98  
 99  	ret = krb5_init_context(context);
100  	if (ret == 0) {
101  	    HEIMDAL_setspecific(context_key, *context, ret);
102  	    if (ret) {
103  		krb5_free_context(*context);
104  		*context = NULL;
105  	    }
106  	}
107      } else {
108  	krb5_reload_config(*context, 0, NULL);
109      }
110  
111      return ret;
112  }