gssEapLocalAttrProviderInit(&minor);
#endif
#ifdef HAVE_OPENSAML
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Calling gssEapSamlAttrProvidersInit()");
major = gssEapSamlAttrProvidersInit(&minor);
- if (GSS_ERROR(major))
+ if (GSS_ERROR(major)) {
+ wpa_printf(MSG_ERROR, "### gssEapAttrProvidersInitInternal(): Error returned from gssEapSamlAttrProvidersInit; major code is %08X; minor is %08X", major, minor);
goto cleanup;
+ }
+#else
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Don't have OpenSAML; not calling gssEapSamlAttrProvidersInit()");
#endif
cleanup:
GSSEAP_ASSERT(major == GSS_S_COMPLETE);
#endif
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Setting gssEapAttrProvidersInitStatus to %08X", major);
gssEapAttrProvidersInitStatus = major;
GSSEAP_ONCE_LEAVE;
return gssEapAttrProvidersInitStatus;
}
+
namespace {
+
class finalize_class {
public:
+
+ finalize_class() {
+ wpa_printf(MSG_INFO, "### finalize_class::finalize_class(): Constructing");
+ }
+
~finalize_class()
{
OM_uint32 minor = 0;
+
+ wpa_printf(MSG_INFO, "### ~finalize_class::~finalize_class() : initStatus=%08x", gssEapAttrProvidersInitStatus);
+
if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
-#ifdef HAVE_SHIBRESOLVER
- gssEapLocalAttrProviderFinalize(&minor);
-#endif
+ wpa_printf(MSG_INFO, "### ~finalize_class::~finalize_class() : really finalizing");
+
#ifdef HAVE_OPENSAML
gssEapSamlAttrProvidersFinalize(&minor);
#endif
using namespace xercesc;
#endif
+
+namespace {
+ bool shibInitialized;
+
+ class ShibFinalizer {
+ public:
+
+ ShibFinalizer() {
+ wpa_printf(MSG_INFO, "### ShibFinalizer::ShibFinalizer(): Constructing");
+
+ // Category::getInstance(MECHEAP_LOGCAT).debug("log4shib is now initialized");
+ }
+
+ ~ShibFinalizer() {
+ if (shibInitialized) {
+ wpa_printf(MSG_INFO, "### ShibFinalizer::~ShibFinalizer(): Destructing");
+ gss_eap_shib_attr_provider::finalize();
+ }
+ else {
+ wpa_printf(MSG_INFO, "### ShibFinalizer::~ShibFinalizer(): Shib is not initialized.");
+ }
+ }
+
+ };
+}
+
+
gss_eap_shib_attr_provider::gss_eap_shib_attr_provider(void)
{
m_initialized = false;
void
gss_eap_shib_attr_provider::finalize(void)
{
+ wpa_printf(MSG_INFO, "### gss_eap_shib_attr_provider::finalize(): calling ShibbolethResolver::term()");
gss_eap_attr_ctx::unregisterProvider(ATTR_TYPE_LOCAL);
ShibbolethResolver::term();
}
return dst;
}
+static void createShibFinalizer() {
+ // This object's constructor is invoked on the first call to this method.
+ // At exit, its destructor will terminate Shibboleth.
+ static ShibFinalizer finalizer;
+}
+
OM_uint32
gssEapLocalAttrProviderInit(OM_uint32 *minor)
{
+ if (shibInitialized) {
+ wpa_printf(MSG_INFO, "### gssEapLocalAttrProviderInit(): ShibResolver is already initialized.");
+ return GSS_S_COMPLETE;
+ }
+
+ wpa_printf(MSG_INFO, "### gssEapLocalAttrProviderInit(): Initializing ShibResolver");
if (!gss_eap_shib_attr_provider::init()) {
*minor = GSSEAP_SHIB_INIT_FAILURE;
return GSS_S_FAILURE;
}
- return GSS_S_COMPLETE;
-}
+ shibInitialized = true;
-OM_uint32
-gssEapLocalAttrProviderFinalize(OM_uint32 *minor)
-{
- gss_eap_shib_attr_provider::finalize();
+ // Construct a static object that, since it's being initialized after the ShibResolver,
+ // will be destroyed before static objects in the ShibResolver are destroyed.
+ // This will let us terminate the ShibResolver before its static objects are destructed.
+ createShibFinalizer();
- *minor = 0;
return GSS_S_COMPLETE;
}
+
+// static OM_uint32
+// gssEapLocalAttrProviderFinalize(OM_uint32 *minor)
+// {
+// gss_eap_shib_attr_provider::finalize();
+
+// *minor = 0;
+// return GSS_S_COMPLETE;
+// }