+ m_attributes = duplicateAttributes(shib->getAttributes());
+
+ return true;
+}
+
+bool
+addRadiusAttribute(const gss_eap_attr_provider *provider,
+ const gss_buffer_t attribute,
+ void *data)
+{
+ const gss_eap_shib_attr_provider *shib;
+ const gss_eap_radius_attr_provider *radius;
+ int authenticated, complete, more = -1;
+ vector <string> attributeIds(1);
+ SimpleAttribute *a;
+
+ radius = dynamic_cast<const gss_eap_radius_attr_provider *>(provider);
+ shib = static_cast<const gss_eap_shib_attr_provider *>(data);
+
+ assert(radius != NULL && shib != NULL);
+
+ string attributeName =
+ gss_eap_attr_ctx::composeAttributeName(ATTR_TYPE_RADIUS, attribute);
+
+ attributeIds.push_back(attributeName);
+ a = new SimpleAttribute(attributeIds);
+ if (a == NULL)
+ return false;
+
+ while (more != 0) {
+ gss_buffer_desc value = GSS_C_EMPTY_BUFFER;
+ OM_uint32 minor;
+
+ if (!radius->getAttribute(attribute,
+ &authenticated,
+ &complete,
+ &value,
+ NULL,
+ &more))
+ return false;
+
+ string attributeValue((char *)value.value, value.length);
+ a->getValues().push_back(attributeValue);
+
+ gss_release_buffer(&minor, &value);
+ }
+
+ shib->getAttributes().push_back(a);