X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=049e53358fca441b9ae246d9bd27d956ef08251e;hb=7f06873592fcb03326301a0c7cc81bba1b87741d;hp=5695db86ff7e24f7ec644a11a0ec253cc08c019b;hpb=096d14037ebd2271f8e116d13f742be853435816;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index 5695db8..049e533 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 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. @@ -17,32 +17,78 @@ /** * SAMLConfig.cpp * - * Library configuration + * Library configuration. */ -#define SAML_DECLARE_VALIDATORS - #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" +#include "binding/MessageDecoder.h" +#include "binding/MessageEncoder.h" +#include "binding/SAMLArtifact.h" +#include "binding/SecurityPolicyRule.h" #include "saml1/core/Assertions.h" +#include "saml1/core/Protocols.h" +#include "saml2/core/Protocols.h" +#include "saml2/metadata/Metadata.h" +#include "saml2/metadata/MetadataFilter.h" +#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; -//DECL_EXCEPTION_FACTORY(XMLParserException,xmltooling); +// Expose entry points when used as an extension library + +extern "C" int SAML_API xmltooling_extension_init(void*) +{ + if (SAMLConfig::getConfig().init(false)) + return 0; + return -1; +} + +extern "C" void SAML_API xmltooling_extension_term() +{ + SAMLConfig::getConfig().term(false); +} + +DECL_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md); +DECL_XMLTOOLING_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md); +DECL_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml); namespace opensaml { SAMLInternalConfig g_config; @@ -58,30 +104,116 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig() return g_config; } -bool SAMLInternalConfig::init() +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"); - 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); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml); saml1::registerAssertionClasses(); + saml1p::registerProtocolClasses(); + saml2::registerAssertionClasses(); + saml2p::registerProtocolClasses(); + saml2md::registerMetadataClasses(); + saml2md::registerMetadataProviders(); + saml2md::registerMetadataFilters(); + registerSAMLArtifacts(); + registerMessageEncoders(); + registerMessageDecoders(); + registerSecurityPolicyRules(); - log.info("library initialization complete"); + log.info("%s library initialization complete", PACKAGE_STRING); + ++m_initCount; return true; } -void SAMLInternalConfig::term() +void SAMLInternalConfig::term(bool termXMLTooling) { #ifdef _DEBUG xmltooling::NDC ndc("term"); #endif - XMLToolingConfig::getConfig().term(); - Category::getInstance(SAML_LOGCAT".SAMLConfig").info("library shutdown complete"); + + 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(); + SecurityPolicyRuleManager.deregisterFactories(); + SAMLArtifactManager.deregisterFactories(); + MetadataFilterManager.deregisterFactories(); + MetadataProviderManager.deregisterFactories(); + + delete m_artifactMap; + m_artifactMap = nullptr; + + if (termXMLTooling) + XMLToolingConfig::getConfig().term(); + + Category::getInstance(SAML_LOGCAT".Config").info("%s library shutdown complete", PACKAGE_STRING); } void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) @@ -116,3 +248,108 @@ XMLCh* SAMLInternalConfig::generateIdentifier() hexform[33]=0; return XMLString::transcode(hexform); } + +string SAMLInternalConfig::hashSHA1(const char* s, bool toHex) +{ + return SecurityHelper::doHash("SHA1", s, strlen(s), toHex); +} + +SignableObject::SignableObject() +{ +} + +SignableObject::~SignableObject() +{ +} + +RootObject::RootObject() +{ +} + +RootObject::~RootObject() +{ +} + +Assertion::Assertion() +{ +} + +Assertion::~Assertion() +{ +} + +using namespace saml2p; +using namespace saml2md; + +void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow) +{ + 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 = nullptr; + } + } + annotateException(e, role, status, rethrow); +} + +void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* role, const Status* status, bool rethrow) +{ + if (role) { + auto_ptr_char id(dynamic_cast(role->getParent())->getEntityID()); + e->addProperty("entityID",id.get()); + + const vector& contacts=role->getContactPersons(); + for (vector::const_iterator c=contacts.begin(); c!=contacts.end(); ++c) { + const XMLCh* ctype=(*c)->getContactType(); + if (ctype && (XMLString::equals(ctype,ContactPerson::CONTACT_SUPPORT) + || XMLString::equals(ctype,ContactPerson::CONTACT_TECHNICAL))) { + GivenName* fname=(*c)->getGivenName(); + SurName* lname=(*c)->getSurName(); + 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()); + } + else if (first.get()) + e->addProperty("contactName",first.get()); + else if (last.get()) + e->addProperty("contactName",last.get()); + const vector& emails=const_cast(*c)->getEmailAddresss(); + if (!emails.empty()) { + auto_ptr_char email(emails.front()->getAddress()); + if (email.get()) + e->addProperty("contactEmail",email.get()); + } + break; + } + } + + auto_ptr_char eurl(role->getErrorURL()); + if (eurl.get()) { + e->addProperty("errorURL",eurl.get()); + } + } + + if (status) { + auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : nullptr); + if (sc.get() && *sc.get()) + e->addProperty("statusCode", sc.get()); + if (status->getStatusCode()->getStatusCode()) { + auto_ptr_char sc2(status->getStatusCode()->getStatusCode()->getValue()); + if (sc2.get() && *sc.get()) + e->addProperty("statusCode2", sc2.get()); + } + if (status->getStatusMessage()) { + auto_ptr_char msg(status->getStatusMessage()->getMessage()); + if (msg.get() && *msg.get()) + e->addProperty("statusMessage", msg.get()); + } + } + + if (rethrow) + e->raise(); +}