Nalin Dahyabhai fb7c02f
commit 9dc75551cb8cc4c03f7e0fe5e8a705ed678079f4
Nalin Dahyabhai fb7c02f
Author: ghudson <ghudson@dc483132-0cff-0310-8789-dd5450dbe970>
Nalin Dahyabhai fb7c02f
Date:   Wed Dec 7 19:38:13 2011 +0000
Nalin Dahyabhai fb7c02f
Nalin Dahyabhai fb7c02f
    ticket: 7046
Nalin Dahyabhai fb7c02f
    subject: Allow S4U2Proxy delegated credentials to be saved
Nalin Dahyabhai fb7c02f
    
Nalin Dahyabhai fb7c02f
    The initial implementation of client-side S4U2Proxy support did not
Nalin Dahyabhai fb7c02f
    allow delegated proxy credentials to be stored (gss_store_cred would
Nalin Dahyabhai fb7c02f
    error out, and gss_krb5_copy_ccache would generate a non-working
Nalin Dahyabhai fb7c02f
    cache).  To make this work, we save the impersonator name in a cache
Nalin Dahyabhai fb7c02f
    config variable and in a cred structure field (replacing the
Nalin Dahyabhai fb7c02f
    proxy_cred flag), and make the default principal of the proxy cache
Nalin Dahyabhai fb7c02f
    the subject principal as the caller would expect for a regular
Nalin Dahyabhai fb7c02f
    delegated cred.
Nalin Dahyabhai fb7c02f
    
Nalin Dahyabhai fb7c02f
    git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25529 dc483132-0cff-0310-8789-dd5450dbe970
Nalin Dahyabhai fb7c02f
Nalin Dahyabhai fb7c02f
diff --git a/src/include/k5-int.h b/src/include/k5-int.h
Nalin Dahyabhai fb7c02f
index 514e2ea..b25c159 100644
Nalin Dahyabhai fb7c02f
--- a/src/include/k5-int.h
Nalin Dahyabhai fb7c02f
+++ b/src/include/k5-int.h
Nalin Dahyabhai fb7c02f
@@ -273,7 +273,10 @@ typedef INT64_TYPE krb5_int64;
Nalin Dahyabhai fb7c02f
 #define KRB5_CONF_V4_INSTANCE_CONVERT         "v4_instance_convert"
Nalin Dahyabhai fb7c02f
 #define KRB5_CONF_V4_REALM                    "v4_realm"
Nalin Dahyabhai fb7c02f
 #define KRB5_CONF_ASTERISK                    "*"
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+/* Cache configuration variables */
Nalin Dahyabhai fb7c02f
 #define KRB5_CONF_FAST_AVAIL                  "fast_avail"
Nalin Dahyabhai fb7c02f
+#define KRB5_CONF_PROXY_IMPERSONATOR          "proxy_impersonator"
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
 /* Error codes used in KRB_ERROR protocol messages.
Nalin Dahyabhai fb7c02f
    Return values of library routines are based on a different error table
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/acquire_cred.c b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai fb7c02f
index c815b35..c08e059 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai fb7c02f
@@ -417,6 +417,34 @@ prep_ccache(krb5_context context, krb5_gss_cred_id_rec *cred,
Nalin Dahyabhai fb7c02f
     return 0;
Nalin Dahyabhai fb7c02f
 }
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
+/* If an impersonator config entry exists in ccache, set *impersonator_out to
Nalin Dahyabhai fb7c02f
+ * the parsed principal.  Otherwise set *impersonator_out to NULL. */
Nalin Dahyabhai fb7c02f
+static krb5_error_code
Nalin Dahyabhai fb7c02f
+get_impersonator(krb5_context context, krb5_ccache ccache,
Nalin Dahyabhai fb7c02f
+                 krb5_principal *impersonator_out)
Nalin Dahyabhai fb7c02f
+{
Nalin Dahyabhai fb7c02f
+    krb5_error_code code;
Nalin Dahyabhai fb7c02f
+    krb5_data data = empty_data(), data0 = empty_data();
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    *impersonator_out = NULL;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    code = krb5_cc_get_config(context, ccache, NULL,
Nalin Dahyabhai fb7c02f
+                              KRB5_CONF_PROXY_IMPERSONATOR, &data);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        return (code == KRB5_CC_NOTFOUND) ? 0 : code;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    code = krb5int_copy_data_contents_add0(context, &data, &data0);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        goto cleanup;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    code = krb5_parse_name(context, data0.data, impersonator_out);
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+cleanup:
Nalin Dahyabhai fb7c02f
+    krb5_free_data_contents(context, &data);
Nalin Dahyabhai fb7c02f
+    krb5_free_data_contents(context, &data0);
Nalin Dahyabhai fb7c02f
+    return code;
Nalin Dahyabhai fb7c02f
+}
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
 /* Check ccache and scan it for its expiry time.  On success, cred takes
Nalin Dahyabhai fb7c02f
  * ownership of ccache. */
Nalin Dahyabhai fb7c02f
 static krb5_error_code
Nalin Dahyabhai fb7c02f
@@ -493,6 +521,10 @@ scan_ccache(krb5_context context, krb5_gss_cred_id_rec *cred,
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
     }
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
+    code = get_impersonator(context, ccache, &cred->impersonator);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        goto cleanup;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
     (void)krb5_cc_set_flags(context, ccache, KRB5_TC_OPENCLOSE);
Nalin Dahyabhai fb7c02f
     cred->ccache = ccache;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
@@ -622,6 +654,7 @@ acquire_cred(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     cred->usage = args->cred_usage;
Nalin Dahyabhai fb7c02f
     cred->name = NULL;
Nalin Dahyabhai fb7c02f
+    cred->impersonator = NULL;
Nalin Dahyabhai fb7c02f
     cred->iakerb_mech = args->iakerb;
Nalin Dahyabhai fb7c02f
     cred->default_identity = (name == NULL);
Nalin Dahyabhai fb7c02f
 #ifndef LEAN_CLIENT
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/gssapiP_krb5.h b/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai fb7c02f
index 016a2e6..6b7d530 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai fb7c02f
@@ -172,7 +172,7 @@ typedef struct _krb5_gss_cred_id_rec {
Nalin Dahyabhai fb7c02f
     /* name/type of credential */
Nalin Dahyabhai fb7c02f
     gss_cred_usage_t usage;
Nalin Dahyabhai fb7c02f
     krb5_gss_name_t name;
Nalin Dahyabhai fb7c02f
-    unsigned int proxy_cred : 1;
Nalin Dahyabhai fb7c02f
+    krb5_principal impersonator;
Nalin Dahyabhai fb7c02f
     unsigned int default_identity : 1;
Nalin Dahyabhai fb7c02f
     unsigned int iakerb_mech : 1;
Nalin Dahyabhai fb7c02f
     unsigned int destroy_ccache : 1;
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/init_sec_context.c b/src/lib/gssapi/krb5/init_sec_context.c
Nalin Dahyabhai fb7c02f
index 1b8120c..d7b9ffa 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/init_sec_context.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/init_sec_context.c
Nalin Dahyabhai fb7c02f
@@ -129,7 +129,6 @@ static krb5_error_code get_credentials(context, cred, server, now,
Nalin Dahyabhai fb7c02f
     krb5_error_code     code;
Nalin Dahyabhai fb7c02f
     krb5_creds          in_creds, evidence_creds, *result_creds = NULL;
Nalin Dahyabhai fb7c02f
     krb5_flags          flags = 0;
Nalin Dahyabhai fb7c02f
-    krb5_principal      cc_princ = NULL;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     *out_creds = NULL;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
@@ -140,16 +139,13 @@ static krb5_error_code get_credentials(context, cred, server, now,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     assert(cred->name != NULL);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-    if ((code = krb5_cc_get_principal(context, cred->ccache, &cc_princ)))
Nalin Dahyabhai fb7c02f
-        goto cleanup;
Nalin Dahyabhai fb7c02f
-
Nalin Dahyabhai fb7c02f
     /*
Nalin Dahyabhai fb7c02f
      * Do constrained delegation if we have proxy credentials and
Nalin Dahyabhai fb7c02f
      * we're not trying to get a ticket to ourselves (in which case
Nalin Dahyabhai fb7c02f
      * we can just use the S4U2Self or evidence ticket directly).
Nalin Dahyabhai fb7c02f
      */
Nalin Dahyabhai fb7c02f
-    if (cred->proxy_cred &&
Nalin Dahyabhai fb7c02f
-        !krb5_principal_compare(context, cc_princ, server->princ)) {
Nalin Dahyabhai fb7c02f
+    if (cred->impersonator &&
Nalin Dahyabhai fb7c02f
+        !krb5_principal_compare(context, cred->impersonator, server->princ)) {
Nalin Dahyabhai fb7c02f
         krb5_creds mcreds;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
         flags |= KRB5_GC_CANONICALIZE |
Nalin Dahyabhai fb7c02f
@@ -159,20 +155,18 @@ static krb5_error_code get_credentials(context, cred, server, now,
Nalin Dahyabhai fb7c02f
         memset(&mcreds, 0, sizeof(mcreds));
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
         mcreds.magic = KV5M_CREDS;
Nalin Dahyabhai fb7c02f
-        mcreds.times.endtime = cred->tgt_expire;
Nalin Dahyabhai fb7c02f
-        mcreds.server = cc_princ;
Nalin Dahyabhai fb7c02f
+        mcreds.server = cred->impersonator;
Nalin Dahyabhai fb7c02f
         mcreds.client = cred->name->princ;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
         code = krb5_cc_retrieve_cred(context, cred->ccache,
Nalin Dahyabhai fb7c02f
-                                     KRB5_TC_MATCH_TIMES | KRB5_TC_MATCH_AUTHDATA,
Nalin Dahyabhai fb7c02f
-                                     &mcreds,
Nalin Dahyabhai fb7c02f
+                                     KRB5_TC_MATCH_AUTHDATA, &mcreds,
Nalin Dahyabhai fb7c02f
                                      &evidence_creds);
Nalin Dahyabhai fb7c02f
         if (code)
Nalin Dahyabhai fb7c02f
             goto cleanup;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
         assert(evidence_creds.ticket_flags & TKT_FLG_FORWARDABLE);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-        in_creds.client = cc_princ;
Nalin Dahyabhai fb7c02f
+        in_creds.client = cred->impersonator;
Nalin Dahyabhai fb7c02f
         in_creds.second_ticket = evidence_creds.ticket;
Nalin Dahyabhai fb7c02f
     } else {
Nalin Dahyabhai fb7c02f
         in_creds.client = cred->name->princ;
Nalin Dahyabhai fb7c02f
@@ -255,7 +249,6 @@ static krb5_error_code get_credentials(context, cred, server, now,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
 cleanup:
Nalin Dahyabhai fb7c02f
     krb5_free_authdata(context, in_creds.authdata);
Nalin Dahyabhai fb7c02f
-    krb5_free_principal(context, cc_princ);
Nalin Dahyabhai fb7c02f
     krb5_free_cred_contents(context, &evidence_creds);
Nalin Dahyabhai fb7c02f
     krb5_free_creds(context, result_creds);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/rel_cred.c b/src/lib/gssapi/krb5/rel_cred.c
Nalin Dahyabhai fb7c02f
index 5b2ea2f..4fd3694 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/rel_cred.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/rel_cred.c
Nalin Dahyabhai fb7c02f
@@ -71,6 +71,8 @@ krb5_gss_release_cred(minor_status, cred_handle)
Nalin Dahyabhai fb7c02f
     if (cred->name)
Nalin Dahyabhai fb7c02f
         kg_release_name(context, &cred->name);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
+    krb5_free_principal(context, cred->impersonator);
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
     if (cred->req_enctypes)
Nalin Dahyabhai fb7c02f
         free(cred->req_enctypes);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/s4u_gss_glue.c b/src/lib/gssapi/krb5/s4u_gss_glue.c
Nalin Dahyabhai fb7c02f
index 4ac2ce3..4b37c5a 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/s4u_gss_glue.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/s4u_gss_glue.c
Nalin Dahyabhai fb7c02f
@@ -169,6 +169,39 @@ krb5_gss_acquire_cred_impersonate_name(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
 }
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
+/*
Nalin Dahyabhai fb7c02f
+ * Set up cred to be an S4U2Proxy credential by copying in the impersonator's
Nalin Dahyabhai fb7c02f
+ * creds, setting a cache config variable with the impersonator principal name,
Nalin Dahyabhai fb7c02f
+ * and saving the impersonator principal name in the cred structure.
Nalin Dahyabhai fb7c02f
+ */
Nalin Dahyabhai fb7c02f
+static krb5_error_code
Nalin Dahyabhai fb7c02f
+make_proxy_cred(krb5_context context, krb5_gss_cred_id_t cred,
Nalin Dahyabhai fb7c02f
+                krb5_gss_cred_id_t impersonator_cred)
Nalin Dahyabhai fb7c02f
+{
Nalin Dahyabhai fb7c02f
+    krb5_error_code code;
Nalin Dahyabhai fb7c02f
+    krb5_data data;
Nalin Dahyabhai fb7c02f
+    char *str;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    code = krb5_cc_copy_creds(context, impersonator_cred->ccache,
Nalin Dahyabhai fb7c02f
+                              cred->ccache);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        return code;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    code = krb5_unparse_name(context, impersonator_cred->name->princ, &str);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        return code;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    data = string2data(str);
Nalin Dahyabhai fb7c02f
+    code = krb5_cc_set_config(context, cred->ccache, NULL,
Nalin Dahyabhai fb7c02f
+                              KRB5_CONF_PROXY_IMPERSONATOR, &data);
Nalin Dahyabhai fb7c02f
+    krb5_free_unparsed_name(context, str);
Nalin Dahyabhai fb7c02f
+    if (code)
Nalin Dahyabhai fb7c02f
+        return code;
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
+    return krb5_copy_principal(context, impersonator_cred->name->princ,
Nalin Dahyabhai fb7c02f
+                               &cred->impersonator);
Nalin Dahyabhai fb7c02f
+}
Nalin Dahyabhai fb7c02f
+
Nalin Dahyabhai fb7c02f
 OM_uint32
Nalin Dahyabhai fb7c02f
 kg_compose_deleg_cred(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
                       krb5_gss_cred_id_t impersonator_cred,
Nalin Dahyabhai fb7c02f
@@ -187,7 +220,7 @@ kg_compose_deleg_cred(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     if (!kg_is_initiator_cred(impersonator_cred) ||
Nalin Dahyabhai fb7c02f
         impersonator_cred->name == NULL ||
Nalin Dahyabhai fb7c02f
-        impersonator_cred->proxy_cred) {
Nalin Dahyabhai fb7c02f
+        impersonator_cred->impersonator != NULL) {
Nalin Dahyabhai fb7c02f
         code = G_BAD_USAGE;
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
     }
Nalin Dahyabhai fb7c02f
@@ -208,14 +241,7 @@ kg_compose_deleg_cred(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
     if (code != 0)
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-    /*
Nalin Dahyabhai fb7c02f
-     * Only return a "proxy" credential for use with constrained
Nalin Dahyabhai fb7c02f
-     * delegation if the subject credentials are forwardable.
Nalin Dahyabhai fb7c02f
-     * Submitting non-forwardable credentials to the KDC for use
Nalin Dahyabhai fb7c02f
-     * with constrained delegation will only return an error.
Nalin Dahyabhai fb7c02f
-     */
Nalin Dahyabhai fb7c02f
     cred->usage = GSS_C_INITIATE;
Nalin Dahyabhai fb7c02f
-    cred->proxy_cred = !!(subject_creds->ticket_flags & TKT_FLG_FORWARDABLE);
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     cred->tgt_expire = subject_creds->times.endtime;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
@@ -229,16 +255,18 @@ kg_compose_deleg_cred(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
     cred->destroy_ccache = 1;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-    code = krb5_cc_initialize(context, cred->ccache,
Nalin Dahyabhai fb7c02f
-                              cred->proxy_cred ? impersonator_cred->name->princ :
Nalin Dahyabhai fb7c02f
-                              subject_creds->client);
Nalin Dahyabhai fb7c02f
+    code = krb5_cc_initialize(context, cred->ccache, subject_creds->client);
Nalin Dahyabhai fb7c02f
     if (code != 0)
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-    if (cred->proxy_cred) {
Nalin Dahyabhai fb7c02f
-        /* Impersonator's TGT will be necessary for S4U2Proxy */
Nalin Dahyabhai fb7c02f
-        code = krb5_cc_copy_creds(context, impersonator_cred->ccache,
Nalin Dahyabhai fb7c02f
-                                  cred->ccache);
Nalin Dahyabhai fb7c02f
+    /*
Nalin Dahyabhai fb7c02f
+     * Only return a "proxy" credential for use with constrained
Nalin Dahyabhai fb7c02f
+     * delegation if the subject credentials are forwardable.
Nalin Dahyabhai fb7c02f
+     * Submitting non-forwardable credentials to the KDC for use
Nalin Dahyabhai fb7c02f
+     * with constrained delegation will only return an error.
Nalin Dahyabhai fb7c02f
+     */
Nalin Dahyabhai fb7c02f
+    if (subject_creds->ticket_flags & TKT_FLG_FORWARDABLE) {
Nalin Dahyabhai fb7c02f
+        code = make_proxy_cred(context, cred, impersonator_cred);
Nalin Dahyabhai fb7c02f
         if (code != 0)
Nalin Dahyabhai fb7c02f
             goto cleanup;
Nalin Dahyabhai fb7c02f
     }
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/store_cred.c b/src/lib/gssapi/krb5/store_cred.c
Nalin Dahyabhai fb7c02f
index bff3cde..d587589 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/store_cred.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/store_cred.c
Nalin Dahyabhai fb7c02f
@@ -91,7 +91,7 @@ copy_initiator_creds(OM_uint32 *minor_status,
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
     kcred = (krb5_gss_cred_id_t)input_cred_handle;
Nalin Dahyabhai fb7c02f
 
Nalin Dahyabhai fb7c02f
-    if (kcred->ccache == NULL || kcred->proxy_cred) {
Nalin Dahyabhai fb7c02f
+    if (kcred->ccache == NULL) {
Nalin Dahyabhai fb7c02f
         *minor_status = KG_CCACHE_NOMATCH;
Nalin Dahyabhai fb7c02f
         major_status = GSS_S_DEFECTIVE_CREDENTIAL;
Nalin Dahyabhai fb7c02f
         goto cleanup;
Nalin Dahyabhai fb7c02f
diff --git a/src/lib/gssapi/krb5/val_cred.c b/src/lib/gssapi/krb5/val_cred.c
Nalin Dahyabhai fb7c02f
index e87f249..46a9ae1 100644
Nalin Dahyabhai fb7c02f
--- a/src/lib/gssapi/krb5/val_cred.c
Nalin Dahyabhai fb7c02f
+++ b/src/lib/gssapi/krb5/val_cred.c
Nalin Dahyabhai fb7c02f
@@ -50,8 +50,7 @@ krb5_gss_validate_cred_1(OM_uint32 *minor_status, gss_cred_id_t cred_handle,
Nalin Dahyabhai fb7c02f
             *minor_status = code;
Nalin Dahyabhai fb7c02f
             return(GSS_S_DEFECTIVE_CREDENTIAL);
Nalin Dahyabhai fb7c02f
         }
Nalin Dahyabhai fb7c02f
-        if (!cred->proxy_cred &&
Nalin Dahyabhai fb7c02f
-            !krb5_principal_compare(context, princ, cred->name->princ)) {
Nalin Dahyabhai fb7c02f
+        if (!krb5_principal_compare(context, princ, cred->name->princ)) {
Nalin Dahyabhai fb7c02f
             k5_mutex_unlock(&cred->lock);
Nalin Dahyabhai fb7c02f
             *minor_status = KG_CCACHE_NOMATCH;
Nalin Dahyabhai fb7c02f
             return(GSS_S_DEFECTIVE_CREDENTIAL);