From: Luke Howard Date: Wed, 8 Sep 2010 18:55:25 +0000 (+0200) Subject: Some more plumbing for name attributes X-Git-Url: http://www.project-moonshot.org/gitweb/?p=cyrus-sasl.git;a=commitdiff_plain;h=61b09b6743d10e9490cb4f9a1018db6d1c8d5ef2 Some more plumbing for name attributes --- diff --git a/mech_eap/get_name_attribute.c b/mech_eap/get_name_attribute.c index f2ea472..0987f15 100644 --- a/mech_eap/get_name_attribute.c +++ b/mech_eap/get_name_attribute.c @@ -43,14 +43,49 @@ gss_get_name_attribute(OM_uint32 *minor, int *more) { OM_uint32 major, tmpMinor; + gss_buffer_desc prefix, suffix; + enum gss_eap_attribute_type type; if (name == GSS_C_NO_NAME) { *minor = EINVAL; return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME; } + *authenticated = 0; + *complete = 0; + value->length = 0; + value->value = NULL; + display_value->length = 0; + display_value->value = NULL; + *more = -1; + GSSEAP_MUTEX_LOCK(&name->mutex); + major = decomposeAttributeName(minor, attr, &prefix, &suffix); + if (GSS_ERROR(major)) + goto cleanup; + + type = gssEapAttributePrefixToType(&prefix); + switch (type) { + case ATTR_TYPE_SAML_AAA_ASSERTION: + major = samlExportAssertion(minor, name->assertion, value); + break; + case ATTR_TYPE_SAML_ATTR: + major = samlGetAttribute(minor, name->assertion, &suffix, + authenticated, complete, + value, display_value, more); + break; + case ATTR_TYPE_RADIUS_AVP: + major = radiusGetAVP(minor, name->avps, &suffix, + authenticated, complete, + value, display_value, more); + break; + default: + *minor = ENOENT; + major = GSS_S_UNAVAILABLE; + break; + } + cleanup: GSSEAP_MUTEX_UNLOCK(&name->mutex); diff --git a/mech_eap/set_name_attribute.c b/mech_eap/set_name_attribute.c index 33772b8..385ead4 100644 --- a/mech_eap/set_name_attribute.c +++ b/mech_eap/set_name_attribute.c @@ -39,5 +39,39 @@ gss_set_name_attribute(OM_uint32 *minor, gss_buffer_t attr, gss_buffer_t value) { - GSSEAP_NOT_IMPLEMENTED; -} + OM_uint32 major, tmpMinor; + gss_buffer_desc prefix, suffix; + enum gss_eap_attribute_type type; + + if (name == GSS_C_NO_NAME) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME; + } + + GSSEAP_MUTEX_LOCK(&name->mutex); + + major = decomposeAttributeName(minor, attr, &prefix, &suffix); + if (GSS_ERROR(major)) + goto cleanup; + + type = gssEapAttributePrefixToType(&prefix); + switch (type) { + case ATTR_TYPE_SAML_ATTR: + major = samlSetAttribute(minor, name->assertion, + complete, &suffix, value); + break; + case ATTR_TYPE_RADIUS_AVP: + major = radiusSetAVP(minor, name->avps, + complete, &suffix, value); + break; + default: + *minor = ENOENT; + major = GSS_S_UNAVAILABLE; + break; + } + +cleanup: + GSSEAP_MUTEX_UNLOCK(&name->mutex); + + return major; +} diff --git a/mech_eap/util_radius.c b/mech_eap/util_radius.c index c18d1c5..87b5087 100644 --- a/mech_eap/util_radius.c +++ b/mech_eap/util_radius.c @@ -49,3 +49,26 @@ radiusFreeAVPs(OM_uint32 *minor, { GSSEAP_FREE(avps); } + +OM_uint32 +radiusGetAVP(OM_uint32 *minor, + struct eap_gss_avp_list *avps, + gss_buffer_t attr, + int *authenticated, + int *complete, + gss_buffer_t value, + gss_buffer_t display_value, + int *more) +{ + GSSEAP_NOT_IMPLEMENTED; +} + +OM_uint32 +radiusSetAVP(OM_uint32 *minor, + struct eap_gss_avp_list *avps, + int complete, + gss_buffer_t attr, + gss_buffer_t value) +{ + GSSEAP_NOT_IMPLEMENTED; +} diff --git a/mech_eap/util_radius.h b/mech_eap/util_radius.h index 4587869..931e779 100644 --- a/mech_eap/util_radius.h +++ b/mech_eap/util_radius.h @@ -46,4 +46,21 @@ OM_uint32 radiusFreeAVPs(OM_uint32 *minor, struct eap_gss_avp_list *in); +OM_uint32 +radiusGetAVP(OM_uint32 *minor, + struct eap_gss_avp_list *avps, + gss_buffer_t attr, + int *authenticated, + int *complete, + gss_buffer_t value, + gss_buffer_t display_value, + int *more); + +OM_uint32 +radiusSetAVP(OM_uint32 *minor, + struct eap_gss_avp_list *avps, + int complete, + gss_buffer_t attr, + gss_buffer_t value); + #endif /* _UTIL_RADIUS_H_ */ diff --git a/mech_eap/util_saml.c b/mech_eap/util_saml.c index c3128a7..cafb4ff 100644 --- a/mech_eap/util_saml.c +++ b/mech_eap/util_saml.c @@ -46,3 +46,34 @@ samlFreeAssertion(OM_uint32 *minor, { GSSEAP_NOT_IMPLEMENTED; } + +OM_uint32 +samlExportAssertion(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + gss_buffer_t buffer) +{ + GSSEAP_NOT_IMPLEMENTED; +} + +OM_uint32 +samlGetAttribute(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + gss_buffer_t attr, + int *authenticated, + int *complete, + gss_buffer_t value, + gss_buffer_t display_value, + int *more) +{ + GSSEAP_NOT_IMPLEMENTED; +} + +OM_uint32 +samlSetAttribute(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + int complete, + gss_buffer_t attr, + gss_buffer_t value) +{ + GSSEAP_NOT_IMPLEMENTED; +} diff --git a/mech_eap/util_saml.h b/mech_eap/util_saml.h index 3663c1d..374be78 100644 --- a/mech_eap/util_saml.h +++ b/mech_eap/util_saml.h @@ -43,7 +43,29 @@ samlDuplicateAssertion(OM_uint32 *minor, struct eap_gss_saml_assertion **out); OM_uint32 +samlExportAssertion(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + gss_buffer_t buffer); + +OM_uint32 samlFreeAssertion(OM_uint32 *minor, struct eap_gss_saml_assertion *assertion); +OM_uint32 +samlGetAttribute(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + gss_buffer_t attr, + int *authenticated, + int *complete, + gss_buffer_t value, + gss_buffer_t display_value, + int *more); + +OM_uint32 +samlSetAttribute(OM_uint32 *minor, + struct eap_gss_saml_assertion *assertion, + int complete, + gss_buffer_t attr, + gss_buffer_t value); + #endif /* _UTIL_SAML_H_ */