Author: abartlet
Date: 2005-06-22 02:09:49 +0000 (Wed, 22 Jun 2005)
New Revision: 348

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=lorikeet&rev=348

Log:
Add a new 'wildcard' varient on the in-memory keytab.  This will match
on kvno, but not on the name.  This avoids us trying to list all the
names we may be known under.

Perhaps not a perfect solution (we should know the list of names we
have registered in the kerberos server) but it gets us going for now.

Andrew Bartlett

Modified:
   trunk/heimdal/lib/krb5/context.c
   trunk/heimdal/lib/krb5/keytab_memory.c
   trunk/heimdal/lib/krb5/krb5.h


Changeset:
Modified: trunk/heimdal/lib/krb5/context.c
===================================================================
--- trunk/heimdal/lib/krb5/context.c    2005-06-18 11:04:54 UTC (rev 347)
+++ trunk/heimdal/lib/krb5/context.c    2005-06-22 02:09:49 UTC (rev 348)
@@ -231,6 +231,7 @@
     krb5_kt_register (p, &krb5_wrfkt_ops);
     krb5_kt_register (p, &krb5_javakt_ops);
     krb5_kt_register (p, &krb5_mkt_ops);
+    krb5_kt_register (p, &krb5_mktw_ops);
     krb5_kt_register (p, &krb5_akf_ops);
     krb5_kt_register (p, &krb4_fkt_ops);
     krb5_kt_register (p, &krb5_srvtab_fkt_ops);

Modified: trunk/heimdal/lib/krb5/keytab_memory.c
===================================================================
--- trunk/heimdal/lib/krb5/keytab_memory.c      2005-06-18 11:04:54 UTC (rev 
347)
+++ trunk/heimdal/lib/krb5/keytab_memory.c      2005-06-22 02:09:49 UTC (rev 
348)
@@ -174,3 +174,56 @@
     mkt_add_entry,
     mkt_remove_entry
 };
+
+static krb5_error_code 
+mktw_get_entry(krb5_context context,
+              krb5_keytab id,
+              krb5_const_principal principal,
+              krb5_kvno kvno,
+              krb5_enctype enctype,
+              krb5_keytab_entry *entry)
+{
+    krb5_keytab_entry tmp;
+    krb5_error_code ret;
+    krb5_kt_cursor cursor;
+
+    ret = krb5_kt_start_seq_get (context, id, &cursor);
+    if (ret)
+       return KRB5_KT_NOTFOUND; /* XXX i.e. file not found */
+
+    entry->vno = 0;
+    while (krb5_kt_next_entry(context, id, &tmp, &cursor) == 0) {
+       if (krb5_kt_compare(context, &tmp, NULL, 0, enctype)) {
+           if (kvno == tmp.vno) {
+               krb5_kt_copy_entry_contents (context, &tmp, entry);
+               krb5_kt_free_entry (context, &tmp);
+               krb5_kt_end_seq_get(context, id, &cursor);
+               return 0;
+           } else if (kvno == 0 && tmp.vno > entry->vno) {
+               if (entry->vno)
+                   krb5_kt_free_entry (context, entry);
+               krb5_kt_copy_entry_contents (context, &tmp, entry);
+           }
+       }
+       krb5_kt_free_entry(context, &tmp);
+    }
+    krb5_kt_end_seq_get (context, id, &cursor);
+    if (entry->vno) {
+       return 0;
+    } else {
+           return KRB5_KT_NOTFOUND;
+    }
+};
+
+const krb5_kt_ops krb5_mktw_ops = {
+    "MEMORY_WILDCARD",
+    mkt_resolve,
+    mkt_get_name,
+    mkt_close,
+    mktw_get_entry, /* get */
+    mkt_start_seq_get,
+    mkt_next_entry,
+    mkt_end_seq_get,
+    mkt_add_entry,
+    mkt_remove_entry
+};

Modified: trunk/heimdal/lib/krb5/krb5.h
===================================================================
--- trunk/heimdal/lib/krb5/krb5.h       2005-06-18 11:04:54 UTC (rev 347)
+++ trunk/heimdal/lib/krb5/krb5.h       2005-06-22 02:09:49 UTC (rev 348)
@@ -698,6 +698,7 @@
 extern const krb5_kt_ops krb5_wrfkt_ops;
 extern const krb5_kt_ops krb5_javakt_ops;
 extern const krb5_kt_ops krb5_mkt_ops;
+extern const krb5_kt_ops krb5_mktw_ops;
 extern const krb5_kt_ops krb5_akf_ops;
 extern const krb5_kt_ops krb4_fkt_ops;
 extern const krb5_kt_ops krb5_srvtab_fkt_ops;

Reply via email to