]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add krb5_kt_have_content API
authorGreg Hudson <ghudson@mit.edu>
Sat, 2 Jun 2012 18:06:58 +0000 (14:06 -0400)
committerGreg Hudson <ghudson@mit.edu>
Sat, 2 Jun 2012 18:08:08 +0000 (14:08 -0400)
Add the krb5_kt_have_content API from Heimdal, which can be used to
test whether a keytab exists and contains entries.  Add tests to
t_keytab.c.

There is a deviation from Heimdal in the function signature.
Heimdal's signature returns a krb5_boolean at the moment, because the
Heimdal implementation actually returns a krb5_error_code.  These are
generally the same type anyway (int).

ticket: 7158 (new)

doc/rst_source/krb_appldev/refs/api/index.rst
src/include/krb5/krb5.hin
src/lib/krb5/keytab/ktfns.c
src/lib/krb5/keytab/t_keytab.c
src/lib/krb5/libkrb5.exports
src/lib/krb5_32.def

index 743de67c41e018250c6ae0b867b608f824e8d156..67e32cf412f3ca775cf12fb0136316fc5348d2e6 100644 (file)
@@ -215,6 +215,7 @@ Rarely used public interfaces
    krb5_kt_add_entry.rst
    krb5_kt_end_seq_get.rst
    krb5_kt_get_entry.rst
+   krb5_kt_have_content.rst
    krb5_kt_next_entry.rst
    krb5_kt_read_service_key.rst
    krb5_kt_remove_entry.rst
index 3208be54c49d9681bf7aa2c7a8d261f48dc0abc7..ca5ccbd0ea90c6fd2c92bdcdcc3671fbba706be6 100644 (file)
@@ -2872,6 +2872,18 @@ krb5_error_code KRB5_CALLCONV
 krb5_kt_end_seq_get(krb5_context context, krb5_keytab keytab,
                     krb5_kt_cursor *cursor);
 
+/**
+ * Check if a keytab exists and contains entries.
+ *
+ * @param [in]  context         Library context
+ * @param [in]  keytab          Key table handle
+ *
+ * @retval 0 Keytab exists and contains entries
+ * @retval KRB5_KT_NOTFOUND Keytab does not contain entries
+ */
+krb5_error_code KRB5_CALLCONV
+krb5_kt_have_content(krb5_context context, krb5_keytab keytab);
+
 /*
  * end "keytab.h"
  */
index ecf0acfc5d7b8eb174fecac067984a789445f164..e0c411efebdab895d8083536a864645b2f6505a2 100644 (file)
@@ -98,6 +98,29 @@ krb5_kt_end_seq_get(krb5_context context, krb5_keytab keytab,
     return krb5_x((keytab)->ops->end_get,(context, keytab, cursor));
 }
 
+krb5_error_code KRB5_CALLCONV
+krb5_kt_have_content(krb5_context context, krb5_keytab keytab)
+{
+    krb5_keytab_entry entry;
+    krb5_kt_cursor cursor;
+    krb5_error_code ret;
+
+    /* If the keytab is not iterable, assume that it has content. */
+    if (keytab->ops->start_seq_get == NULL)
+        return 0;
+
+    /* See if we can get at least one entry via iteration. */
+    ret = krb5_kt_start_seq_get(context, keytab, &cursor);
+    if (ret)
+       return KRB5_KT_NOTFOUND;
+    ret = krb5_kt_next_entry(context, keytab, &entry, &cursor);
+    krb5_kt_end_seq_get(context, keytab, &cursor);
+    if (ret)
+       return KRB5_KT_NOTFOUND;
+    krb5_kt_free_entry(context, &entry);
+    return 0;
+}
+
 /*
  * 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
index 6b64d52f4d71b8b0fca15322005904983af567e8..80a94eafe6fc052f375090a455b3ea959a81ee9c 100644 (file)
@@ -132,6 +132,9 @@ kt_test(krb5_context context, const char *name)
         CHECK_ERR(kret, KRB5_KT_NOTFOUND, "Getting non-existent entry");
     }
 
+    kret = krb5_kt_have_content(context, kt);
+    CHECK_ERR(kret, KRB5_KT_NOTFOUND, "Checking for keytab content (empty)");
+
 
     /* ===================   Add entries to keytab ================= */
     /*
@@ -169,6 +172,9 @@ kt_test(krb5_context context, const char *name)
 
     /* ==============   Test iterating over contents of keytab ========= */
 
+    kret = krb5_kt_have_content(context, kt);
+    CHECK(kret, "Checking for keytab content (full)");
+
     kret = krb5_kt_start_seq_get(context, kt, &cursor);
     CHECK(kret, "Start sequence get");
 
index 337e781d27959567c914ce3e5b5a4f113c584109..d294e1eedb5f052a62105209334b615e08d05ee3 100644 (file)
@@ -400,6 +400,7 @@ krb5_kt_free_entry
 krb5_kt_get_entry
 krb5_kt_get_name
 krb5_kt_get_type
+krb5_kt_have_content
 krb5_kt_next_entry
 krb5_kt_read_service_key
 krb5_kt_register
index e3da5c2fe57cd712c009024a34aae075a772f3f5..54fd081de6f7ff9286c096d8bfc19852f43d30ed 100644 (file)
@@ -427,3 +427,4 @@ EXPORTS
 
 ; new in 1.11 (note that 399-400 are used above)
        krb5_chpw_message                               @398
+       krb5_kt_have_content                            @401