Make work.
authorLove Hörnquist Åstrand <lha@kth.se>
Wed, 28 Jun 2006 16:20:41 +0000 (16:20 +0000)
committerLove Hörnquist Åstrand <lha@kth.se>
Wed, 28 Jun 2006 16:20:41 +0000 (16:20 +0000)
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17726 ec53bebd-3082-4978-b11e-865c3cabbd6b

lib/gssapi/mech/gss_inquire_cred_by_oid.c
lib/gssapi/mech/gss_set_cred_option.c

index 4fc6850be7007ae0480e83a630d702fece675864..357c31600e000ed8df90ddc89ab1ac6c1d2dd7dc 100644 (file)
@@ -39,27 +39,44 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,
                         const gss_OID desired_object,
                         gss_buffer_set_t *data_set)
 {
-       struct _gss_mechanism_cred *cred =
-           (struct _gss_mechanism_cred *) cred_handle;
-       OM_uint32               major_status;
+       struct _gss_cred *cred = (struct _gss_cred *) cred_handle;
+       OM_uint32               status = GSS_S_COMPLETE;
+       struct _gss_mechanism_cred *mc;
        gssapi_mech_interface   m;
+       gss_buffer_set_t set = GSS_C_NO_BUFFER_SET;
 
        *minor_status = 0;
 
        if (cred == NULL)
                return GSS_S_NO_CRED;
 
-       m = cred->gmc_mech;
+       SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {
+               gss_buffer_set_t rset = GSS_C_NO_BUFFER_SET;
+               int i;
 
-       if (m == NULL)
-               return GSS_S_BAD_MECH;
+               m = mc->gmc_mech;
+               if (m == NULL)
+                       return GSS_S_BAD_MECH;
 
-       if (m->gm_inquire_cred_by_oid != NULL)
-               major_status = m->gm_inquire_cred_by_oid(minor_status,
-                   cred->gmc_cred, desired_object, data_set);
-       else
-               major_status = GSS_S_BAD_MECH;
+               if (m->gm_inquire_cred_by_oid == NULL)
+                       continue;
 
-       return major_status;
+               status = m->gm_inquire_cred_by_oid(minor_status,
+                   mc->gmc_cred, desired_object, &rset);
+               if (status != GSS_S_COMPLETE)
+                       continue;
+
+               for (i = 0; i < rset->count; i++) { 
+                       status = gss_add_buffer_set_member(minor_status,
+                            &rset->elements[i], &set);
+                       if (status != GSS_S_COMPLETE)
+                               break;
+               }
+               gss_release_buffer_set(minor_status, &rset);
+       }
+       if (set == GSS_C_NO_BUFFER_SET)
+               status = GSS_S_FAILURE;
+       *data_set = set;
+       return status;
 }
 
index 42613b198a58cfb44597cbe412f79653bec008cc..8110f728bf09af2b063a220deb0d7da7b4238e97 100644 (file)
@@ -39,27 +39,36 @@ gss_set_cred_option (OM_uint32 *minor_status,
                     const gss_OID object,
                     const gss_buffer_t value)
 {
-       struct _gss_mechanism_cred *cred =
-           (struct _gss_mechanism_cred *) cred_handle;
-       OM_uint32               major_status;
+       struct _gss_cred *cred = (struct _gss_cred *) cred_handle;
+       OM_uint32               major_status = GSS_S_COMPLETE;
+       struct _gss_mechanism_cred *mc;
        gssapi_mech_interface   m;
+       int one_ok = 0;
 
        *minor_status = 0;
 
        if (cred == NULL)
                return GSS_S_NO_CRED;
 
-       m = cred->gmc_mech;
+       SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {
 
-       if (m == NULL)
-               return GSS_S_BAD_MECH;
+               m = mc->gmc_mech;
 
-       if (m->gm_set_cred_option != NULL)
-               major_status = m->gm_set_cred_option(minor_status,
-                   &cred->gmc_cred, object, value);
-       else
-               major_status = GSS_S_BAD_MECH;
+               if (m == NULL)
+                       return GSS_S_BAD_MECH;
+
+               if (m->gm_set_cred_option == NULL)
+                       continue;
 
+               major_status = m->gm_set_cred_option(minor_status,
+                   &mc->gmc_cred, object, value);
+               if (major_status == GSS_S_BAD_MECH)
+                       one_ok = 1;
+       }
+       if (one_ok) {
+               *minor_status = 0;
+               return GSS_S_COMPLETE;
+       }
        return major_status;
 }