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;
