X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=5d68230db40579daf0914329f8b26509942c457f;hb=1114253f9e24bc8b77967551ce9bceb0032d3bc5;hp=d17142bc3dc746993a98e29295f7b9c2792f2fcd;hpb=12d8e6ed0125ea986a8eb78ea177b6d6f0251fd6;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index d17142b..5d68230 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -1,3 +1,4 @@ + /* * Copyright 2001-2006 Internet2 * @@ -20,16 +21,19 @@ * Library configuration */ -#define SAML_DECLARE_VALIDATORS - #include "internal.h" #include "exceptions.h" #include "SAMLConfig.h" +#include "binding/ArtifactMap.h" +#include "binding/MessageEncoder.h" +#include "binding/SAMLArtifact.h" +#include "binding/URLEncoder.h" #include "saml1/core/Assertions.h" #include "saml1/core/Protocols.h" #include "saml2/core/Protocols.h" #include "saml2/metadata/Metadata.h" #include "saml2/metadata/MetadataProvider.h" +#include "security/TrustEngine.h" #include "util/SAMLConstants.h" #include @@ -38,7 +42,9 @@ #include #include +#include #include +#include using namespace opensaml; using namespace xmlsignature; @@ -46,7 +52,23 @@ 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_EXCEPTION_FACTORY(ArtifactException,opensaml); +DECL_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md); +DECL_EXCEPTION_FACTORY(BindingException,opensaml); namespace opensaml { SAMLInternalConfig g_config; @@ -62,7 +84,19 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig() return g_config; } -bool SAMLInternalConfig::init() +void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap) +{ + delete m_artifactMap; + m_artifactMap = artifactMap; +} + +void SAMLConfig::setURLEncoder(URLEncoder* urlEncoder) +{ + delete m_urlEncoder; + m_urlEncoder = urlEncoder; +} + +bool SAMLInternalConfig::init(bool initXMLTooling) { #ifdef _DEBUG xmltooling::NDC ndc("init"); @@ -70,9 +104,17 @@ bool SAMLInternalConfig::init() Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); log.debug("library initialization started"); - XMLToolingConfig::getConfig().init(); - log.debug("XMLTooling library initialized"); + if (initXMLTooling) { + XMLToolingConfig::getConfig().init(); + log.debug("XMLTooling library initialized"); + } + + REGISTER_EXCEPTION_FACTORY(ArtifactException,opensaml); + REGISTER_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md); + REGISTER_EXCEPTION_FACTORY(BindingException,opensaml); + registerMessageEncoders(); + registerSAMLArtifacts(); saml1::registerAssertionClasses(); saml1p::registerProtocolClasses(); saml2::registerAssertionClasses(); @@ -80,24 +122,42 @@ bool SAMLInternalConfig::init() saml2md::registerMetadataClasses(); saml2md::registerMetadataProviders(); saml2md::registerMetadataFilters(); + registerTrustEngines(); + + m_urlEncoder = new URLEncoder(); log.info("library initialization complete"); return true; } -void SAMLInternalConfig::term() +void SAMLInternalConfig::term(bool termXMLTooling) { #ifdef _DEBUG xmltooling::NDC ndc("term"); #endif + Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); saml1::AssertionSchemaValidators.destroyValidators(); saml1p::ProtocolSchemaValidators.destroyValidators(); saml2::AssertionSchemaValidators.destroyValidators(); saml2md::MetadataSchemaValidators.destroyValidators(); - - XMLToolingConfig::getConfig().term(); - Category::getInstance(SAML_LOGCAT".SAMLConfig").info("library shutdown complete"); + + TrustEngineManager.deregisterFactories(); + MetadataFilterManager.deregisterFactories(); + MetadataProviderManager.deregisterFactories(); + SAMLArtifactManager.deregisterFactories(); + MessageEncoderManager.deregisterFactories(); + + delete m_artifactMap; + m_artifactMap = NULL; + delete m_urlEncoder; + m_urlEncoder = NULL; + + if (termXMLTooling) { + XMLToolingConfig::getConfig().term(); + log.debug("XMLTooling library shut down"); + } + log.info("library shutdown complete"); } void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) @@ -132,3 +192,47 @@ XMLCh* SAMLInternalConfig::generateIdentifier() hexform[33]=0; return XMLString::transcode(hexform); } + +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()) { + auto_ptr dup(strdup(s)); + unsigned char buf[21]; + hasher->hash(reinterpret_cast(dup.get()),strlen(dup.get())); + 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."); +} + +void opensaml::log_openssl() +{ + const char* file; + const char* data; + int flags,line; + + unsigned long code=ERR_get_error_line_data(&file,&line,&data,&flags); + while (code) { + Category& log=Category::getInstance("OpenSSL"); + log.errorStream() << "error code: " << code << " in " << file << ", line " << line << CategoryStream::ENDLINE; + if (data && (flags & ERR_TXT_STRING)) + log.errorStream() << "error data: " << data << CategoryStream::ENDLINE; + code=ERR_get_error_line_data(&file,&line,&data,&flags); + } +}