Add k5_kt_get_principal, an internal krb5 interface to try to get a
authorGreg Hudson <ghudson@mit.edu>
Fri, 8 Apr 2011 16:50:13 +0000 (16:50 +0000)
committerGreg Hudson <ghudson@mit.edu>
Fri, 8 Apr 2011 16:50:13 +0000 (16:50 +0000)
principal name from a keytab.  Used currently by vfy_increds.c (in
place of its static helper); will also be used when querying the name
of the default gss-krb5 acceptor cred.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@24859 dc483132-0cff-0310-8789-dd5450dbe970

src/include/k5-int.h
src/lib/krb5/keytab/ktfns.c
src/lib/krb5/krb/vfy_increds.c
src/lib/krb5/libkrb5.exports
src/lib/krb5_32.def

index 5e1324b2e4a65300c772ca7c3d317904cdb16f0e..29f6ae5af09254d0067eaa5ba99d47f0446e311b 100644 (file)
@@ -2618,6 +2618,9 @@ krb5_error_code krb5_generate_seq_number(krb5_context, const krb5_keyblock *,
 krb5_error_code KRB5_CALLCONV krb5_kt_register(krb5_context,
                                                const struct _krb5_kt_ops *);
 
+krb5_error_code k5_kt_get_principal(krb5_context context, krb5_keytab keytab,
+                                    krb5_principal *princ_out);
+
 krb5_error_code krb5_principal2salt_norealm(krb5_context, krb5_const_principal,
                                             krb5_data *);
 
index a06689c4dcf5162fee9eab5b5eadda7c1faba21d..53d0b8364805860d861993d1bb08ae5a48651299 100644 (file)
@@ -97,4 +97,36 @@ krb5_kt_end_seq_get(krb5_context context, krb5_keytab keytab,
 {
     return krb5_x((keytab)->ops->end_get,(context, keytab, cursor));
 }
+
+/*
+ * In a couple of places we need to get a principal name from a keytab: when
+ * verifying credentials against a keytab, and when querying the name of a
+ * default GSS acceptor cred.  Keytabs do not have the concept of a default
+ * principal like ccaches do, so for now we just return the first principal
+ * listed in the keytab, or an error if it's not iterable.  In the future we
+ * could consider elevating this to a public API and giving keytab types an
+ * operation to return a default principal, and maybe extending the file format
+ * and tools to support it.  Returns KRB5_KT_NOTFOUND if the keytab is empty
+ * or non-iterable.
+ */
+krb5_error_code
+k5_kt_get_principal(krb5_context context, krb5_keytab keytab,
+                    krb5_principal *princ_out)
+{
+    krb5_error_code ret;
+    krb5_kt_cursor cursor;
+    krb5_keytab_entry kte;
+
+    *princ_out = NULL;
+    ret = krb5_kt_start_seq_get(context, keytab, &cursor);
+    if (ret)
+        return KRB5_KT_NOTFOUND;
+    ret = krb5_kt_next_entry(context, keytab, &kte, &cursor);
+    (void)krb5_kt_end_seq_get(context, keytab, &cursor);
+    if (ret)
+        return (ret == KRB5_KT_END) ? KRB5_KT_NOTFOUND : ret;
+    ret = krb5_copy_principal(context, kte.principal, princ_out);
+    krb5_kt_free_entry(context, &kte);
+    return ret;
+}
 #endif /* LEAN_CLIENT */
index 1f4313fc382a71e7b7a5dd5d7d979c36d0281e87..207b3094d5b91a1122dbb1ed4773d3b89f9e9aa9 100644 (file)
@@ -20,27 +20,6 @@ nofail(krb5_context context, krb5_verify_init_creds_opt *options,
     return FALSE;
 }
 
-/* Set *server_out to the first principal name in keytab. */
-static krb5_error_code
-get_first_keytab_princ(krb5_context context, krb5_keytab keytab,
-                       krb5_principal *server_out)
-{
-    krb5_error_code ret;
-    krb5_kt_cursor cursor;
-    krb5_keytab_entry kte;
-
-    ret = krb5_kt_start_seq_get(context, keytab, &cursor);
-    if (ret)
-        return ret;
-    ret = krb5_kt_next_entry(context, keytab, &kte, &cursor);
-    (void)krb5_kt_end_seq_get(context, keytab, &cursor);
-    if (ret)
-        return ret;
-    ret = krb5_copy_principal(context, kte.principal, server_out);
-    krb5_kt_free_entry(context, &kte);
-    return ret;
-}
-
 static krb5_error_code
 copy_creds_except(krb5_context context, krb5_ccache incc,
                   krb5_ccache outcc, krb5_principal princ)
@@ -128,8 +107,8 @@ krb5_verify_init_creds(krb5_context context,
         if (ret)
             goto cleanup;
     } else {
-        /* Use the first principal name in the keytab. */
-        ret = get_first_keytab_princ(context, keytab, &server);
+        /* Use a principal name from the keytab. */
+        ret = k5_kt_get_principal(context, keytab, &server);
         if (ret) {
             /* There's no keytab, or it's empty, or we can't read it.
              * Allow this unless configuration demands verification. */
index 98f914d9d37485c4bf3e4a5ab155d79f6f31a0d7..b531b70b5ccc040c1a9aad02039db0be17b12cbf 100644 (file)
@@ -108,6 +108,7 @@ initialize_k5e1_error_table
 initialize_kv5m_error_table
 initialize_prof_error_table
 k5_free_serverlist
+k5_kt_get_principal
 k5_locate_kdc
 k5_plugin_free_modules
 k5_plugin_load
index 8c8a8f5033b62a1ebaaaf68cc46e0081cb92d735..032faf759c87769f1c83b227a80cbf2c4a2a564e 100644 (file)
@@ -408,3 +408,4 @@ EXPORTS
 
 ; new in 1.10
        krb5_sname_match                                @384
+       k5_kt_get_principal                             @385 ; PRIVATE GSSAPI