diff options
Diffstat (limited to 'src/lib/krb5/ccache/ccdefault.c')
-rw-r--r-- | src/lib/krb5/ccache/ccdefault.c | 96 |
1 files changed, 43 insertions, 53 deletions
diff --git a/src/lib/krb5/ccache/ccdefault.c b/src/lib/krb5/ccache/ccdefault.c index 71e6f9c..8a45a24 100644 --- a/src/lib/krb5/ccache/ccdefault.c +++ b/src/lib/krb5/ccache/ccdefault.c @@ -31,13 +31,18 @@ #ifdef USE_LOGIN_LIBRARY #include "KerberosLoginPrivate.h" +#else +#ifdef USE_LEASH +static void (*pLeash_AcquireInitialTicketsIfNeeded)(krb5_context,krb5_principal) = NULL; +static HANDLE hLeashDLL = INVALID_HANDLE_VALUE; +#endif #endif krb5_error_code KRB5_CALLCONV krb5_cc_default(krb5_context context, krb5_ccache *ccache) { - krb5_error_code retval; + krb5_error_code retval; krb5_os_context os_ctx; if (!context || context->magic != KV5M_CONTEXT) @@ -45,13 +50,7 @@ krb5_cc_default(krb5_context context, krb5_ccache *ccache) os_ctx = context->os_context; - retval = krb5_cc_resolve(context, krb5_cc_default_name(context), ccache); - if (!retval && ccache && !os_ctx->default_ccprincipal) { - /* We got a ccache... remember what principal is associated with it */ - if (krb5_cc_get_principal (context, *ccache, &os_ctx->default_ccprincipal) != 0) - os_ctx->default_ccprincipal = 0; - } - return retval; + return krb5_cc_resolve(context, krb5_cc_default_name(context), ccache); } /* This is the internal function which opens the default ccache. On platforms supporting @@ -64,53 +63,44 @@ krb5_cc_default(krb5_context context, krb5_ccache *ccache) krb5_error_code KRB5_CALLCONV krb5int_cc_default(krb5_context context, krb5_ccache *ccache) { + if (!context || context->magic != KV5M_CONTEXT) { + return KV5M_CONTEXT; + } + #ifdef USE_LOGIN_LIBRARY - { - /* make sure the default cache has tix before you open it */ - char *outCacheName; - KLPrincipal desiredPrincipal = nil; - krb5_principal desiredKrb5Principal; - krb5_error_code err; - krb5_os_context os_ctx; + { + /* make sure the default cache has tix before you open it */ + KLStatus err = klNoErr; + char *outCacheName = NULL; + + /* Try to make sure a krb5 tgt is in the cache */ + err = __KLInternalAcquireInitialTicketsForCache (krb5_cc_default_name (context), kerberosVersion_V5, + NULL, NULL, &outCacheName); + if (err == klNoErr) { + /* This function tries to get tickets and put them in the specified + cache, however, if the cache does not exist, it may choose to put + them elsewhere (ie: the system default) so we set that here */ + if (strcmp (krb5_cc_default_name (context), outCacheName) != 0) { + krb5_cc_set_default_name (context, outCacheName); + } + KLDisposeString (outCacheName); + } + } +#else +#ifdef USE_LEASH - if (!context || context->magic != KV5M_CONTEXT) - return KV5M_CONTEXT; - - os_ctx = context->os_context; - - desiredKrb5Principal = os_ctx->default_ccprincipal; - - /* do we want a specific client principal? */ - if (desiredKrb5Principal != NULL) { - char *desiredName; - - err = krb5_unparse_name (context, desiredKrb5Principal, &desiredName); - if (!err) { - err = KLCreatePrincipalFromString (desiredName, - kerberosVersion_V5, &desiredPrincipal); - krb5_free_unparsed_name (context, desiredName); - if (err != klNoErr) - desiredPrincipal = nil; - } - } - - /* Try to make sure a krb5 tgt is in the cache */ - err = __KLInternalAcquireInitialTicketsForCache (desiredPrincipal, NULL, - krb5_cc_default_name (context), - kerberosVersion_V5, nil, &outCacheName); - if (err == klNoErr) { - /* This function tries to get tickets and put them in the specified - cache, however, if the cache does not exist, it may choose to put - them elsewhere (ie: the system default) so we set that here */ - if (strcmp (krb5_cc_default_name (context), outCacheName) != 0) { - krb5_cc_set_default_name (context, outCacheName); - } - KLDisposeString (outCacheName); - } - - if (desiredPrincipal != nil) - KLDisposePrincipal (desiredPrincipal); - } + if ( hLeashDLL == INVALID_HANDLE_VALUE ) { + hLeashDLL = LoadLibrary("leashw32.dll"); + if ( hLeashDLL != INVALID_HANDLE_VALUE ) { + (FARPROC) pLeash_AcquireInitialTicketsIfNeeded = + GetProcAddress(hLeashDLL, "not_an_API_Leash_AcquireInitialTicketsIfNeeded"); + } + } + + if ( pLeash_AcquireInitialTicketsIfNeeded ) { + pLeash_AcquireInitialTicketsIfNeeded(context, NULL); + } +#endif #endif return krb5_cc_default (context, ccache); |