+ major = radiusGetAttribute(minor, name, attr,
+ &authenticated, &complete,
+ &value, GSS_C_NO_BUFFER, &more);
+ if (major == GSS_S_COMPLETE) {
+ /* Do some prefixing? */
+ a = samlAttributeFromGssBuffers(attr, &value);
+ /* XXX leaky */
+ resolver->addAttribute(a);
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+static OM_uint32
+samlAddRadiusAttributes(OM_uint32 *minor,
+ gss_name_t name,
+ ShibbolethResolver *resolver)
+{
+ return radiusGetAttributeTypes(minor,
+ name,
+ samlAddRadiusAttribute,
+ (void *)resolver);
+}
+
+static OM_uint32
+samlInitAttrContextFromRadius(OM_uint32 *minor,
+ gss_name_t name,
+ gss_eap_saml_attr_ctx **pSamlCtx)
+{
+ OM_uint32 major;
+ int authenticated, complete, more = -1;
+ gss_buffer_desc value;
+
+ value.value = NULL;
+ value.length = 0;
+
+ major = radiusGetAttribute(minor, name, &gssEapRadiusAssertionAttr,
+ &authenticated, &complete,
+ &value, GSS_C_NO_BUFFER, &more);
+ if (major == GSS_S_UNAVAILABLE) {
+ /* No assertion provided via RADIUS. */
+ value.length = 0;
+ value.value = NULL;
+ } else if (GSS_ERROR(major)) {
+ /* Some other error */
+ return major;
+ }
+
+ *pSamlCtx = new gss_eap_saml_attr_ctx(&value);
+
+ gss_release_buffer(minor, &value);
+