summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2011-04-08 16:50:13 +0000
committerGreg Hudson <ghudson@mit.edu>2011-04-08 16:50:13 +0000
commitd6e26457b71c41531a500965cd6eb67c00bda1c3 (patch)
tree5266ace706c67baf32ec64e2484d50f04f18670c
parentb7208a8261ed15d9e3136c75ce7c252d9717effb (diff)
downloadkrb5-d6e26457b71c41531a500965cd6eb67c00bda1c3.tar.gz
krb5-d6e26457b71c41531a500965cd6eb67c00bda1c3.tar.xz
krb5-d6e26457b71c41531a500965cd6eb67c00bda1c3.zip
Add k5_kt_get_principal, an internal krb5 interface to try to get a
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
-rw-r--r--src/include/k5-int.h3
-rw-r--r--src/lib/krb5/keytab/ktfns.c32
-rw-r--r--src/lib/krb5/krb/vfy_increds.c25
-rw-r--r--src/lib/krb5/libkrb5.exports1
-rw-r--r--src/lib/krb5_32.def1
5 files changed, 39 insertions, 23 deletions
diff --git a/src/include/k5-int.h b/src/include/k5-int.h
index 5e1324b2e4..29f6ae5af0 100644
--- a/src/include/k5-int.h
+++ b/src/include/k5-int.h
@@ -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 *);
diff --git a/src/lib/krb5/keytab/ktfns.c b/src/lib/krb5/keytab/ktfns.c
index a06689c4dc..53d0b83648 100644
--- a/src/lib/krb5/keytab/ktfns.c
+++ b/src/lib/krb5/keytab/ktfns.c
@@ -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 */
diff --git a/src/lib/krb5/krb/vfy_increds.c b/src/lib/krb5/krb/vfy_increds.c
index 1f4313fc38..207b3094d5 100644
--- a/src/lib/krb5/krb/vfy_increds.c
+++ b/src/lib/krb5/krb/vfy_increds.c
@@ -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. */
diff --git a/src/lib/krb5/libkrb5.exports b/src/lib/krb5/libkrb5.exports
index 98f914d9d3..b531b70b5c 100644
--- a/src/lib/krb5/libkrb5.exports
+++ b/src/lib/krb5/libkrb5.exports
@@ -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
diff --git a/src/lib/krb5_32.def b/src/lib/krb5_32.def
index 8c8a8f5033..032faf759c 100644
--- a/src/lib/krb5_32.def
+++ b/src/lib/krb5_32.def
@@ -408,3 +408,4 @@ EXPORTS
; new in 1.10
krb5_sname_match @384
+ k5_kt_get_principal @385 ; PRIVATE GSSAPI