aboutsummaryrefslogtreecommitdiff
path: root/src/lib/krb5/ccache/ccdefault.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/krb5/ccache/ccdefault.c')
-rw-r--r--src/lib/krb5/ccache/ccdefault.c96
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);