X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=049e53358fca441b9ae246d9bd27d956ef08251e;hb=7f06873592fcb03326301a0c7cc81bba1b87741d;hp=88aa180bd4bfaf29ca2b6a48ae478b601988eba5;hpb=db648eb8d96bd4414060b4a7a59da5a78749d98b;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index 88aa180..049e533 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -1,6 +1,5 @@ - /* - * Copyright 2001-2007 Internet2 + * Copyright 2001-2010 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +17,23 @@ /** * SAMLConfig.cpp * - * Library configuration + * Library configuration. */ #include "internal.h" + +#if defined(XMLTOOLING_LOG4SHIB) +# ifndef OPENSAML_LOG4SHIB +# error "Logging library mismatch (XMLTooling is using log4shib)." +# endif +#elif defined(XMLTOOLING_LOG4CPP) +# ifndef OPENSAML_LOG4CPP +# error "Logging library mismatch (XMLTooling is using log4cpp)." +# endif +#else +# error "No supported logging library." +#endif + #include "exceptions.h" #include "SAMLConfig.h" #include "binding/ArtifactMap.h" @@ -37,19 +49,22 @@ #include "saml2/metadata/MetadataProvider.h" #include "util/SAMLConstants.h" +#include #include +#include #include #include +#include +#include -#include #include #include #include using namespace opensaml; using namespace xmlsignature; +using namespace xmltooling::logging; using namespace xmltooling; -using namespace log4cpp; using namespace std; // Expose entry points when used as an extension library @@ -89,25 +104,61 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig() return g_config; } +SAMLConfig::SAMLConfig() : m_artifactMap(nullptr) +{ +} + +SAMLConfig::~SAMLConfig() +{ +} + +ArtifactMap* SAMLConfig::getArtifactMap() const +{ + return m_artifactMap; +} + void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap) { delete m_artifactMap; m_artifactMap = artifactMap; } +SAMLInternalConfig::SAMLInternalConfig() : m_initCount(0), m_lock(Mutex::create()) +{ +} + +SAMLInternalConfig::~SAMLInternalConfig() +{ + delete m_lock; +} + bool SAMLInternalConfig::init(bool initXMLTooling) { #ifdef _DEBUG xmltooling::NDC ndc("init"); #endif - Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); + Category& log=Category::getInstance(SAML_LOGCAT".Config"); + + Lock initLock(m_lock); + + if (m_initCount == LONG_MAX) { + log.crit("library initialized too many times"); + return false; + } + + if (m_initCount >= 1) { + ++m_initCount; + return true; + } + log.debug("library initialization started"); - if (initXMLTooling) { - XMLToolingConfig::getConfig().init(); - log.debug("XMLTooling library initialized"); + if (initXMLTooling && !XMLToolingConfig::getConfig().init()) { + return false; } + XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName("opensaml"); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md); @@ -129,7 +180,8 @@ bool SAMLInternalConfig::init(bool initXMLTooling) registerMessageDecoders(); registerSecurityPolicyRules(); - log.info("library initialization complete"); + log.info("%s library initialization complete", PACKAGE_STRING); + ++m_initCount; return true; } @@ -138,7 +190,15 @@ void SAMLInternalConfig::term(bool termXMLTooling) #ifdef _DEBUG xmltooling::NDC ndc("term"); #endif - Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); + + Lock initLock(m_lock); + if (m_initCount == 0) { + Category::getInstance(SAML_LOGCAT".Config").crit("term without corresponding init"); + return; + } + else if (--m_initCount > 0) { + return; + } MessageDecoderManager.deregisterFactories(); MessageEncoderManager.deregisterFactories(); @@ -148,13 +208,12 @@ void SAMLInternalConfig::term(bool termXMLTooling) MetadataProviderManager.deregisterFactories(); delete m_artifactMap; - m_artifactMap = NULL; + m_artifactMap = nullptr; - if (termXMLTooling) { + if (termXMLTooling) XMLToolingConfig::getConfig().term(); - log.debug("XMLTooling library shut down"); - } - log.info("library shutdown complete"); + + Category::getInstance(SAML_LOGCAT".Config").info("%s library shutdown complete", PACKAGE_STRING); } void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) @@ -192,29 +251,31 @@ XMLCh* SAMLInternalConfig::generateIdentifier() string SAMLInternalConfig::hashSHA1(const char* s, bool toHex) { - static char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - - auto_ptr hasher(XSECPlatformUtils::g_cryptoProvider->hashSHA1()); - if (hasher.get()) { - unsigned char buf[21]; - hasher->hash(reinterpret_cast(const_cast(s)),strlen(s)); - if (hasher->finish(buf,20)==20) { - string ret; - if (toHex) { - for (unsigned int i=0; i<20; i++) { - ret+=(DIGITS[((unsigned char)(0xF0 & buf[i])) >> 4 ]); - ret+=(DIGITS[0x0F & buf[i]]); - } - } - else { - for (unsigned int i=0; i<20; i++) { - ret+=buf[i]; - } - } - return ret; - } - } - throw XMLSecurityException("Unable to generate SHA-1 hash."); + return SecurityHelper::doHash("SHA1", s, strlen(s), toHex); +} + +SignableObject::SignableObject() +{ +} + +SignableObject::~SignableObject() +{ +} + +RootObject::RootObject() +{ +} + +RootObject::~RootObject() +{ +} + +Assertion::Assertion() +{ +} + +Assertion::~Assertion() +{ } using namespace saml2p; @@ -222,13 +283,13 @@ using namespace saml2md; void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow) { - const RoleDescriptor* role = NULL; + const RoleDescriptor* role = nullptr; if (entity) { const list& roles=entity->getOrderedChildren(); for (list::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) { role=dynamic_cast(*child); if (role && !role->isValid()) - role = NULL; + role = nullptr; } } annotateException(e, role, status, rethrow); @@ -247,8 +308,8 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r || XMLString::equals(ctype,ContactPerson::CONTACT_TECHNICAL))) { GivenName* fname=(*c)->getGivenName(); SurName* lname=(*c)->getSurName(); - auto_ptr_char first(fname ? fname->getName() : NULL); - auto_ptr_char last(lname ? lname->getName() : NULL); + auto_ptr_char first(fname ? fname->getName() : nullptr); + auto_ptr_char last(lname ? lname->getName() : nullptr); if (first.get() && last.get()) { string contact=string(first.get()) + ' ' + last.get(); e->addProperty("contactName",contact.c_str()); @@ -274,7 +335,7 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r } if (status) { - auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : NULL); + auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : nullptr); if (sc.get() && *sc.get()) e->addProperty("statusCode", sc.get()); if (status->getStatusCode()->getStatusCode()) {