From 3db3b747837c24b25f25b0ac945933cdc4873b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Thu, 6 Jul 2006 19:31:24 +0000 Subject: [PATCH] reimplement gss_spnego_inquire_names_for_mech add support function _gss_spnego_supported_mechs git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17810 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/gssapi/spnego/context_stubs.c | 77 +++++++++++++++++++++++++++++++ lib/gssapi/spnego/spnego_locl.h | 9 ++++ 2 files changed, 86 insertions(+) diff --git a/lib/gssapi/spnego/context_stubs.c b/lib/gssapi/spnego/context_stubs.c index 149e24528..b5f783a07 100644 --- a/lib/gssapi/spnego/context_stubs.c +++ b/lib/gssapi/spnego/context_stubs.c @@ -34,6 +34,39 @@ RCSID("$Id$"); +OM_uint32 +_gss_spnego_supported_mechs(OM_uint32 *minor_status, gss_OID_set *mechs) +{ + OM_uint32 ret, junk; + gss_OID_set m; + int i; + + ret = gss_indicate_mechs(minor_status, &m); + if (ret != GSS_S_COMPLETE) + return ret; + + ret = gss_create_empty_oid_set(minor_status, mechs); + if (ret != GSS_S_COMPLETE) { + gss_release_oid_set(&junk, &m); + return ret; + } + + for (i = 0; i < m->count; i++) { + if (gss_oid_equal(&m->elements[i], GSS_SPNEGO_MECHANISM)) + continue; + + ret = gss_add_oid_set_member(minor_status, &m->elements[i], mechs); + if (ret) { + gss_release_oid_set(&junk, &m); + gss_release_oid_set(&junk, mechs); + return ret; + } + } + return ret; +} + + + OM_uint32 gss_spnego_process_context_token (OM_uint32 *minor_status, const gss_ctx_id_t context_handle, @@ -439,6 +472,49 @@ OM_uint32 gss_spnego_import_sec_context ( return GSS_S_COMPLETE; } +OM_uint32 gss_spnego_inquire_names_for_mech ( + OM_uint32 * minor_status, + const gss_OID mechanism, + gss_OID_set * name_types + ) +{ + gss_OID_set mechs, names, n; + OM_uint32 ret, junk; + int i, j; + + *name_types = NULL; + + ret = _gss_spnego_supported_mechs(minor_status, &mechs); + if (ret != GSS_S_COMPLETE) + return ret; + + ret = gss_create_empty_oid_set(minor_status, &names); + if (ret != GSS_S_COMPLETE) + goto out; + + for (i = 0; i < mechs->count; i++) { + ret = gss_inquire_names_for_mech(minor_status, + &mechs->elements[i], + &n); + if (ret) + continue; + + for (j = 0; j < n->count; j++) + gss_add_oid_set_member(minor_status, + &n->elements[j], + &names); + gss_release_oid_set(&junk, &n); + } + + ret = GSS_S_COMPLETE; + *name_types = names; +out: + + gss_release_oid_set(&junk, &mechs); + + return GSS_S_COMPLETE; +} + OM_uint32 gss_spnego_inquire_mechs_for_name ( OM_uint32 * minor_status, const gss_name_t input_name, @@ -467,6 +543,7 @@ OM_uint32 gss_spnego_canonicalize_name ( gss_name_t * output_name ) { + /* XXX */ return gss_duplicate_name(minor_status, input_name, output_name); } diff --git a/lib/gssapi/spnego/spnego_locl.h b/lib/gssapi/spnego/spnego_locl.h index 744e13b77..b54842058 100644 --- a/lib/gssapi/spnego/spnego_locl.h +++ b/lib/gssapi/spnego/spnego_locl.h @@ -102,6 +102,9 @@ OM_uint32 _gss_spnego_select_mech(OM_uint32 *, MechType *, gss_OID *); OM_uint32 _gss_spnego_alloc_cred(OM_uint32 *, gss_cred_id_t, gss_cred_id_t *); OM_uint32 _gss_spnego_release_cred(OM_uint32 *, gss_cred_id_t *); +OM_uint32 _gss_spnego_supported_mechs(OM_uint32 *, gss_OID_set *); + + /* * Finally, function prototypes for the GSS-API routines. */ @@ -214,6 +217,12 @@ OM_uint32 gss_spnego_display_status gss_buffer_t /*status_string*/ ); +OM_uint32 gss_spnego_inquire_names_for_mech ( + OM_uint32 * minor_status, + const gss_OID mechanism, + gss_OID_set * name_types + ); + OM_uint32 gss_spnego_compare_name (OM_uint32 * /*minor_status*/, const gss_name_t /*name1*/,