]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add krb5_tkt_creds_get(). Still untested
authorGreg Hudson <ghudson@mit.edu>
Sun, 4 Apr 2010 20:18:12 +0000 (20:18 +0000)
committerGreg Hudson <ghudson@mit.edu>
Sun, 4 Apr 2010 20:18:12 +0000 (20:18 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/branches/iakerb@23857 dc483132-0cff-0310-8789-dd5450dbe970

src/include/krb5/krb5.hin
src/lib/krb5/krb/gc_frm_kdc_step.c

index 2f4488ecef8c97a1aee6183974158976870eec61..9eb734b0fb7036de5dabae70880ecaf0c8d4ff72 100644 (file)
@@ -2416,6 +2416,9 @@ krb5_error_code KRB5_CALLCONV
 krb5_tkt_creds_init(krb5_context context, krb5_ccache ccache,
                     krb5_creds *creds, int kdcopt, krb5_tkt_creds_context *ctx);
 
+krb5_error_code KRB5_CALLCONV
+krb5_tkt_creds_get(krb5_context context, krb5_tkt_creds_context ctx);
+
 krb5_error_code KRB5_CALLCONV
 krb5_tkt_creds_get_creds(krb5_context context, krb5_tkt_creds_context ctx,
                          krb5_creds *creds);
index 882707fe978b53dd81960186ad4bd8c468ef4a48..f1f0f59e6d81af0d786621ad754d123bb1e7cdd8 100644 (file)
@@ -394,7 +394,6 @@ try_fallback_realm(krb5_context context, krb5_tkt_creds_context ctx)
 {
     krb5_error_code code;
     char **hrealms;
-    krb5_creds *server_tgt;
 
     if (ctx->server->length < 2) {
         /* We need a type/host format principal to find a fallback realm. */
@@ -849,7 +848,6 @@ begin_get_tgt(krb5_context context, krb5_tkt_creds_context ctx)
 static krb5_error_code
 begin(krb5_context context, krb5_tkt_creds_context ctx)
 {
-    krb5_creds *server_tgt;
     krb5_error_code code;
 
     /* If the server realm is unspecified, start with the client realm. */
@@ -954,6 +952,42 @@ krb5_tkt_creds_free(krb5_context context, krb5_tkt_creds_context ctx)
     free(ctx);
 }
 
+krb5_error_code
+krb5_tkt_creds_get(krb5_context context, krb5_tkt_creds_context ctx)
+{
+    krb5_error_code code;
+    krb5_data request = empty_data(), reply = empty_data();
+    krb5_data realm = empty_data();
+    unsigned int flags = 0;
+    int tcp_only = 0, use_master;
+
+    for (;;) {
+        /* Get the next request and realm.  Turn on TCP if necessary. */
+        code = krb5_tkt_creds_step(context, ctx, &reply, &request, &realm,
+                                   &flags);
+        if (code == KRB5KRB_ERR_RESPONSE_TOO_BIG && !tcp_only)
+            tcp_only = 1;
+        else if (code != 0 || (flags & 1) == 0)
+            break;
+        krb5_free_data_contents(context, &reply);
+
+        /* Send it to a KDC for the appropriate realm. */
+        use_master = 0;
+        code = krb5_sendto_kdc(context, &request, &realm,
+                               &reply, &use_master, tcp_only);
+        if (code != 0)
+            break;
+
+        krb5_free_data_contents(context, &request);
+        krb5_free_data_contents(context, &realm);
+    }
+
+    krb5_free_data_contents(context, &request);
+    krb5_free_data_contents(context, &reply);
+    krb5_free_data_contents(context, &realm);
+    return code;
+}
+
 krb5_error_code KRB5_CALLCONV
 krb5_tkt_creds_step(krb5_context context, krb5_tkt_creds_context ctx,
                     krb5_data *in, krb5_data *out, krb5_data *realm,