X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=inquire_name.c;h=6c640f33e155b22ad795c197629eee7d61e8128f;hb=1f273eda615c04331df6849cfbf3cfad069ea8b0;hp=c41d2464059be6cfe433502ae067bb8ab557c7c8;hpb=c581903743f5bf281548368f49bc5d37d338a4ea;p=mech_eap.git diff --git a/inquire_name.c b/inquire_name.c index c41d246..6c640f3 100644 --- a/inquire_name.c +++ b/inquire_name.c @@ -32,8 +32,8 @@ #include "gssapiP_eap.h" -struct eap_gss_attribute_args { - gss_buffer_t prefix; +struct gss_eap_attribute_args { + enum gss_eap_attribute_type type; gss_buffer_set_t attrs; }; @@ -43,23 +43,30 @@ struct eap_gss_attribute_args { */ static OM_uint32 addAttribute(OM_uint32 *minor, - void *data, - gss_buffer_t attribute) + gss_name_t name, + gss_buffer_t attribute, + void *data) { - struct eap_gss_attribute_args *args = (struct eap_gss_attribute_args *)data; + struct gss_eap_attribute_args *args = (struct gss_eap_attribute_args *)data; OM_uint32 major, tmpMinor; gss_buffer_desc qualifiedAttr; + gss_buffer_t prefix; + + if (args->type != ATTR_TYPE_NONE) + prefix = gssEapAttributeTypeToPrefix(args->type); + else + prefix = GSS_C_NO_BUFFER; - if (attribute != GSS_C_NO_BUFFER) { - major = composeAttributeName(minor, args->prefix, attribute, &qualifiedAttr); + if (prefix != GSS_C_NO_BUFFER && attribute != GSS_C_NO_BUFFER) { + major = composeAttributeName(minor, prefix, attribute, &qualifiedAttr); if (GSS_ERROR(major)) return major; - major = gss_add_buffer_set_member(minor, &qualifiedAttr, &args->attrs); gss_release_buffer(&tmpMinor, &qualifiedAttr); } else { - major = gss_add_buffer_set_member(minor, args->prefix, &args->attrs); + assert(prefix != GSS_C_NO_BUFFER); + major = gss_add_buffer_set_member(minor, prefix, &args->attrs); } return major; @@ -73,7 +80,7 @@ OM_uint32 gss_inquire_name(OM_uint32 *minor, { OM_uint32 major, tmpMinor; krb5_context krbContext; - struct eap_gss_attribute_args args; + struct gss_eap_attribute_args args; *name_is_MN = 1; *MN_mech = GSS_EAP_MECHANISM; @@ -93,16 +100,36 @@ OM_uint32 gss_inquire_name(OM_uint32 *minor, args.attrs = *attrs; - if (name->samlCtx != NULL) { - args.prefix = gssEapAttributeTypeToPrefix(ATTR_TYPE_SAML_AAA_ASSERTION); + if (name->flags & NAME_FLAG_SAML_ATTRIBUTES) { + /* The assertion itself */ + args.type = ATTR_TYPE_SAML_AAA_ASSERTION; - major = addAttribute(minor, &args, GSS_C_NO_BUFFER); + major = addAttribute(minor, name, GSS_C_NO_BUFFER, &args); if (GSS_ERROR(major)) goto cleanup; - args.prefix = gssEapAttributeTypeToPrefix(ATTR_TYPE_SAML_ATTR); - major = samlGetAttributeTypes(minor, name->samlCtx, - &args, addAttribute); + /* Raw SAML attributes */ +#if 0 + args.type = ATTR_TYPE_SAML_ATTR; + major = samlGetAttributeTypes(minor, args.type, + name, addAttribute, &args); + if (GSS_ERROR(major)) + goto cleanup; +#endif + + /* Cooked local attributes */ + args.type = ATTR_TYPE_NONE; + major = samlGetAttributeTypes(minor, name, args.type, + addAttribute, &args); + if (GSS_ERROR(major)) + goto cleanup; + } + + if (name->flags & NAME_FLAG_RADIUS_ATTRIBUTES) { + /* Raw RADIUS attributes */ + args.type = ATTR_TYPE_RADIUS_AVP; + major = radiusGetAttributeTypes(minor, name, + addAttribute, &args); if (GSS_ERROR(major)) goto cleanup; }