Nalin Dahyabhai 2eb0567
commit 7dad0bee30fbbde8cfc0eacd2d1487c198a004a1
Nalin Dahyabhai 2eb0567
Author: Simo Sorce <simo@redhat.com>
Nalin Dahyabhai 2eb0567
Date:   Thu Dec 26 19:05:34 2013 -0500
Nalin Dahyabhai 2eb0567
Nalin Dahyabhai 2eb0567
    Add rcache feature to gss_acquire_cred_from
Nalin Dahyabhai 2eb0567
    
Nalin Dahyabhai 2eb0567
    The "rcache" cred store entry can specify a replay cache type and name
Nalin Dahyabhai 2eb0567
    to be used with the credentials being acquired.
Nalin Dahyabhai 2eb0567
    
Nalin Dahyabhai 2eb0567
    [ghudson@mit.edu: split up, simplified, and altered to fit preparatory
Nalin Dahyabhai 2eb0567
    commits]
Nalin Dahyabhai 2eb0567
    
Nalin Dahyabhai 2eb0567
    ticket: 7819 (new)
Nalin Dahyabhai 2eb0567
Nalin Dahyabhai 2eb0567
diff --git a/src/lib/gssapi/krb5/acquire_cred.c b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
index f625c0c..5d680f9 100644
Nalin Dahyabhai 2eb0567
--- a/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
+++ b/src/lib/gssapi/krb5/acquire_cred.c
Nalin Dahyabhai 2eb0567
@@ -180,7 +180,8 @@ cleanup:
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
 static OM_uint32
Nalin Dahyabhai 2eb0567
 acquire_accept_cred(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
-                    krb5_keytab req_keytab, krb5_gss_cred_id_rec *cred)
Nalin Dahyabhai 2eb0567
+                    krb5_keytab req_keytab, const char *rcname,
Nalin Dahyabhai 2eb0567
+                    krb5_gss_cred_id_rec *cred)
Nalin Dahyabhai 2eb0567
 {
Nalin Dahyabhai 2eb0567
     OM_uint32 major;
Nalin Dahyabhai 2eb0567
     krb5_error_code code;
Nalin Dahyabhai 2eb0567
@@ -189,6 +190,20 @@ acquire_accept_cred(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     assert(cred->keytab == NULL);
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
+    /* If we have an explicit rcache name, open it. */
Nalin Dahyabhai 2eb0567
+    if (rcname != NULL) {
Nalin Dahyabhai 2eb0567
+        code = krb5_rc_resolve_full(context, &rc, rcname);
Nalin Dahyabhai 2eb0567
+        if (code) {
Nalin Dahyabhai 2eb0567
+            major = GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
+            goto cleanup;
Nalin Dahyabhai 2eb0567
+        }
Nalin Dahyabhai 2eb0567
+        code = krb5_rc_recover_or_initialize(context, rc, context->clockskew);
Nalin Dahyabhai 2eb0567
+        if (code) {
Nalin Dahyabhai 2eb0567
+            major = GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
+            goto cleanup;
Nalin Dahyabhai 2eb0567
+        }
Nalin Dahyabhai 2eb0567
+    }
Nalin Dahyabhai 2eb0567
+
Nalin Dahyabhai 2eb0567
     if (req_keytab != NULL) {
Nalin Dahyabhai 2eb0567
         code = krb5_kt_dup(context, req_keytab, &kt;;
Nalin Dahyabhai 2eb0567
     } else {
Nalin Dahyabhai 2eb0567
@@ -221,12 +236,14 @@ acquire_accept_cred(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
             goto cleanup;
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
-        /* Open the replay cache for this principal. */
Nalin Dahyabhai 2eb0567
-        code = krb5_get_server_rcache(context, &cred->name->princ->data[0],
Nalin Dahyabhai 2eb0567
-                                      &rc);
Nalin Dahyabhai 2eb0567
-        if (code) {
Nalin Dahyabhai 2eb0567
-            major = GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
-            goto cleanup;
Nalin Dahyabhai 2eb0567
+        if (rc == NULL) {
Nalin Dahyabhai 2eb0567
+            /* Open the replay cache for this principal. */
Nalin Dahyabhai 2eb0567
+            code = krb5_get_server_rcache(context, &cred->name->princ->data[0],
Nalin Dahyabhai 2eb0567
+                                          &rc);
Nalin Dahyabhai 2eb0567
+            if (code) {
Nalin Dahyabhai 2eb0567
+                major = GSS_S_FAILURE;
Nalin Dahyabhai 2eb0567
+                goto cleanup;
Nalin Dahyabhai 2eb0567
+            }
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
     } else {
Nalin Dahyabhai 2eb0567
         /* Make sure we have a keytab with keys in it. */
Nalin Dahyabhai 2eb0567
@@ -718,8 +735,8 @@ acquire_cred_context(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
                      gss_name_t desired_name, gss_buffer_t password,
Nalin Dahyabhai 2eb0567
                      OM_uint32 time_req, gss_cred_usage_t cred_usage,
Nalin Dahyabhai 2eb0567
                      krb5_ccache ccache, krb5_keytab client_keytab,
Nalin Dahyabhai 2eb0567
-                     krb5_keytab keytab, krb5_boolean iakerb,
Nalin Dahyabhai 2eb0567
-                     gss_cred_id_t *output_cred_handle,
Nalin Dahyabhai 2eb0567
+                     krb5_keytab keytab, const char *rcname,
Nalin Dahyabhai 2eb0567
+                     krb5_boolean iakerb, gss_cred_id_t *output_cred_handle,
Nalin Dahyabhai 2eb0567
                      OM_uint32 *time_rec)
Nalin Dahyabhai 2eb0567
 {
Nalin Dahyabhai 2eb0567
     krb5_gss_cred_id_t cred = NULL;
Nalin Dahyabhai 2eb0567
@@ -775,7 +792,7 @@ acquire_cred_context(krb5_context context, OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
      * in cred->name if desired_princ is specified.
Nalin Dahyabhai 2eb0567
      */
Nalin Dahyabhai 2eb0567
     if (cred_usage == GSS_C_ACCEPT || cred_usage == GSS_C_BOTH) {
Nalin Dahyabhai 2eb0567
-        ret = acquire_accept_cred(context, minor_status, keytab, cred);
Nalin Dahyabhai 2eb0567
+        ret = acquire_accept_cred(context, minor_status, keytab, rcname, cred);
Nalin Dahyabhai 2eb0567
         if (ret != GSS_S_COMPLETE)
Nalin Dahyabhai 2eb0567
             goto error_out;
Nalin Dahyabhai 2eb0567
     }
Nalin Dahyabhai 2eb0567
@@ -867,7 +884,7 @@ acquire_cred(OM_uint32 *minor_status, gss_name_t desired_name,
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     ret = acquire_cred_context(context, minor_status, desired_name, password,
Nalin Dahyabhai 2eb0567
                                time_req, cred_usage, ccache, NULL, keytab,
Nalin Dahyabhai 2eb0567
-                               iakerb, output_cred_handle, time_rec);
Nalin Dahyabhai 2eb0567
+                               NULL, iakerb, output_cred_handle, time_rec);
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
 out:
Nalin Dahyabhai 2eb0567
     krb5_free_context(context);
Nalin Dahyabhai 2eb0567
@@ -1135,7 +1152,7 @@ krb5_gss_acquire_cred_from(OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
     krb5_keytab client_keytab = NULL;
Nalin Dahyabhai 2eb0567
     krb5_keytab keytab = NULL;
Nalin Dahyabhai 2eb0567
     krb5_ccache ccache = NULL;
Nalin Dahyabhai 2eb0567
-    const char *value;
Nalin Dahyabhai 2eb0567
+    const char *rcname, *value;
Nalin Dahyabhai 2eb0567
     OM_uint32 ret;
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
     code = gss_krb5int_initialize_library();
Nalin Dahyabhai 2eb0567
@@ -1191,9 +1208,14 @@ krb5_gss_acquire_cred_from(OM_uint32 *minor_status,
Nalin Dahyabhai 2eb0567
         }
Nalin Dahyabhai 2eb0567
     }
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
+    ret = kg_value_from_cred_store(cred_store, KRB5_CS_RCACHE_URN, &rcname);
Nalin Dahyabhai 2eb0567
+    if (GSS_ERROR(ret))
Nalin Dahyabhai 2eb0567
+        goto out;
Nalin Dahyabhai 2eb0567
+
Nalin Dahyabhai 2eb0567
     ret = acquire_cred_context(context, minor_status, desired_name, NULL,
Nalin Dahyabhai 2eb0567
                                time_req, cred_usage, ccache, client_keytab,
Nalin Dahyabhai 2eb0567
-                               keytab, 0, output_cred_handle, time_rec);
Nalin Dahyabhai 2eb0567
+                               keytab, rcname, 0, output_cred_handle,
Nalin Dahyabhai 2eb0567
+                               time_rec);
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
 out:
Nalin Dahyabhai 2eb0567
     if (ccache != NULL)
Nalin Dahyabhai 2eb0567
diff --git a/src/lib/gssapi/krb5/gssapiP_krb5.h b/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai 2eb0567
index 0167816..8e4f6d9 100644
Nalin Dahyabhai 2eb0567
--- a/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai 2eb0567
+++ b/src/lib/gssapi/krb5/gssapiP_krb5.h
Nalin Dahyabhai 2eb0567
@@ -1260,6 +1260,7 @@ data_to_gss(krb5_data *input_k5data, gss_buffer_t output_buffer)
Nalin Dahyabhai 2eb0567
 #define KRB5_CS_CLI_KEYTAB_URN "client_keytab"
Nalin Dahyabhai 2eb0567
 #define KRB5_CS_KEYTAB_URN "keytab"
Nalin Dahyabhai 2eb0567
 #define KRB5_CS_CCACHE_URN "ccache"
Nalin Dahyabhai 2eb0567
+#define KRB5_CS_RCACHE_URN "rcache"
Nalin Dahyabhai 2eb0567
 
Nalin Dahyabhai 2eb0567
 OM_uint32
Nalin Dahyabhai 2eb0567
 kg_value_from_cred_store(gss_const_key_value_set_t cred_store,