+ const gss_eap_saml_assertion_provider *saml;
+ const gss_eap_radius_attr_provider *radius;
+ gss_buffer_desc nameBuf = GSS_C_EMPTY_BUFFER;
+ ShibbolethResolver *resolver;
+ OM_uint32 minor;
+
+ if (!gss_eap_attr_provider::initFromGssContext(manager, gssCred, gssCtx))
+ return false;
+
+ saml = static_cast<const gss_eap_saml_assertion_provider *>
+ (manager->getProvider(ATTR_TYPE_SAML_ASSERTION));
+ radius = static_cast<const gss_eap_radius_attr_provider *>
+ (manager->getProvider(ATTR_TYPE_RADIUS));
+
+ resolver = ShibbolethResolver::create();
+
+ if (gssCred != GSS_C_NO_CREDENTIAL &&
+ gss_display_name(&minor, gssCred->name, &nameBuf, NULL) == GSS_S_COMPLETE)
+ resolver->setApplicationID((const char *)nameBuf.value);
+
+ m_authenticated = false;
+
+ if (radius != NULL) {
+ radius->getAttributeTypes(addRadiusAttribute, (void *)this);
+ m_authenticated = radius->authenticated();
+ }
+
+ if (saml != NULL && saml->getAssertion() != NULL) {
+ resolver->addToken(saml->getAssertion());
+ if (m_authenticated)
+ m_authenticated = saml->authenticated();
+ }
+
+ resolver->resolve();
+
+ m_attributes = resolver->getResolvedAttributes();
+ resolver->getResolvedAttributes().clear();
+
+ gss_release_buffer(&minor, &nameBuf);
+
+ delete resolver;
+
+#ifdef GSSEAP_DEBUG
+ gss_buffer_desc testattr = {
+ sizeof("urn:greet:greeting") - 1, (void *)"urn:greet:greeting" };
+ gss_buffer_desc testval =
+ { sizeof("Hello, GSS EAP.") - 1, (void *)"Hello, GSS EAP." };
+ setAttribute(true, &testattr, &testval);
+#endif /* GSSEAP_DEBUG */
+
+ return true;