]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Implement switch_to for ccapiv3
authorKevin Wasserman <kevin.wasserman@painless-security.com>
Sun, 6 May 2012 19:23:10 +0000 (15:23 -0400)
committerSam Hartman <hartmans@mit.edu>
Thu, 12 Jul 2012 02:36:12 +0000 (22:36 -0400)
krb5_stdccv3_switch_to() calls cc_ccache_set_default().
krb5_stdccv3_resolve() checks for NULL or empty residual and calls
cc_context_get_default_ccache_name() in those cases.

Signed-off-by: Kevin Wasserman <kevin.wasserman@painless-security.com>
ticket: 7198 (new)
tags: pullup

src/lib/krb5/ccache/ccapi/stdcc.c
src/lib/krb5/ccache/ccapi/stdcc.h

index b646b761b5af63ddc9574c5e814ce3119985e47d..d361bdeec30716a4e137f87610ba12ce7289a654 100644 (file)
@@ -95,6 +95,7 @@ krb5_cc_ops krb5_cc_stdcc_ops = {
     NULL, /* wasdefault */
     krb5_stdccv3_lock,
     krb5_stdccv3_unlock,
+    krb5_stdccv3_switch_to,
 #else
     krb5_stdcc_get_name,
     krb5_stdcc_resolve,
@@ -388,6 +389,7 @@ krb5_stdccv3_resolve (krb5_context context, krb5_ccache *id , const char *residu
     stdccCacheDataPtr ccapi_data = NULL;
     krb5_ccache ccache = NULL;
     char *name = NULL;
+    cc_string_t defname = NULL;
 
     if (id == NULL) { err = KRB5_CC_NOMEM; }
 
@@ -405,6 +407,14 @@ krb5_stdccv3_resolve (krb5_context context, krb5_ccache *id , const char *residu
         if (!ccache) { err = KRB5_CC_NOMEM; }
     }
 
+    if (!err) {
+        if ((residual == NULL) || (strlen(residual) == 0)) {
+            err = cc_context_get_default_ccache_name(gCntrlBlock, &defname);
+            if (defname)
+                residual = defname->data;
+        }
+    }
+
     if (!err) {
         name = strdup (residual);
         if (!name) { err = KRB5_CC_NOMEM; }
@@ -434,6 +444,7 @@ krb5_stdccv3_resolve (krb5_context context, krb5_ccache *id , const char *residu
     if (ccache)     { free (ccache); }
     if (ccapi_data) { free (ccapi_data); }
     if (name)       { free (name); }
+    if (defname)    { cc_string_release(defname); }
 
     return cc_err_xlate (err);
 }
@@ -1070,6 +1081,20 @@ krb5_error_code KRB5_CALLCONV krb5_stdccv3_context_unlock
     return cc_err_xlate(err);
 }
 
+krb5_error_code KRB5_CALLCONV krb5_stdccv3_switch_to
+(krb5_context context, krb5_ccache id)
+{
+    krb5_error_code retval;
+    stdccCacheDataPtr ccapi_data = id->data;
+    int err;
+
+    if ((retval = stdccv3_setup(context, ccapi_data)))
+        return retval;
+
+    err = cc_ccache_set_default(ccapi_data->NamedCache);
+    return cc_err_xlate(err);
+}
+
 #else /* !USE_CCAPI_V3 */
 
 static krb5_error_code stdcc_setup(krb5_context context,
index 6550efcb4f65acc15ac825f12ae2adfc1438a0f1..7519891f569b46d7dcb91d7cd1a181d4790a03b9 100644 (file)
@@ -117,6 +117,8 @@ krb5_error_code KRB5_CALLCONV krb5_stdccv3_context_lock
 krb5_error_code KRB5_CALLCONV krb5_stdccv3_context_unlock
 (krb5_context context);
 
+krb5_error_code KRB5_CALLCONV krb5_stdccv3_switch_to
+(krb5_context context, krb5_ccache id);
 #else
 
 krb5_error_code KRB5_CALLCONV krb5_stdcc_close