X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=eac17f89bc43bc64fd21548714701dacbad7539b;hb=e9554c255ad3c91c7c4976e7a1a54905903e66a2;hp=5d342219e5ed4117df029e4954d926236017a9e0;hpb=ceba6432d156e82a9016190c06ae4640c651a257;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index 5d34221..eac17f8 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -1,6 +1,6 @@ /* - * 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. @@ -18,39 +18,53 @@ /** * 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" #include "binding/MessageDecoder.h" #include "binding/MessageEncoder.h" #include "binding/SAMLArtifact.h" -#include "binding/URLEncoder.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 "security/TrustEngine.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 @@ -67,9 +81,14 @@ 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); +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; @@ -85,16 +104,23 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig() return g_config; } -void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap) +SAMLConfig::SAMLConfig() : m_artifactMap(nullptr) +{ +} + +SAMLConfig::~SAMLConfig() { - delete m_artifactMap; - m_artifactMap = artifactMap; } -void SAMLConfig::setURLEncoder(URLEncoder* urlEncoder) +ArtifactMap* SAMLConfig::getArtifactMap() const { - delete m_urlEncoder; - m_urlEncoder = urlEncoder; + return m_artifactMap; +} + +void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap) +{ + delete m_artifactMap; + m_artifactMap = artifactMap; } bool SAMLInternalConfig::init(bool initXMLTooling) @@ -105,14 +131,18 @@ bool SAMLInternalConfig::init(bool initXMLTooling) Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); log.debug("library initialization started"); - if (initXMLTooling) { + if (initXMLTooling) XMLToolingConfig::getConfig().init(); - log.debug("XMLTooling library initialized"); - } + XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName("opensaml"); - REGISTER_EXCEPTION_FACTORY(ArtifactException,opensaml); - REGISTER_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md); - REGISTER_EXCEPTION_FACTORY(BindingException,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(); @@ -122,14 +152,11 @@ bool SAMLInternalConfig::init(bool initXMLTooling) saml2md::registerMetadataProviders(); saml2md::registerMetadataFilters(); registerSAMLArtifacts(); - registerTrustEngines(); registerMessageEncoders(); registerMessageDecoders(); registerSecurityPolicyRules(); - - m_urlEncoder = new URLEncoder(); - log.info("library initialization complete"); + log.info("%s library initialization complete", PACKAGE_STRING); return true; } @@ -142,22 +169,18 @@ void SAMLInternalConfig::term(bool termXMLTooling) MessageDecoderManager.deregisterFactories(); MessageEncoderManager.deregisterFactories(); - TrustEngineManager.deregisterFactories(); SecurityPolicyRuleManager.deregisterFactories(); SAMLArtifactManager.deregisterFactories(); MetadataFilterManager.deregisterFactories(); MetadataProviderManager.deregisterFactories(); delete m_artifactMap; - m_artifactMap = NULL; - delete m_urlEncoder; - m_urlEncoder = NULL; + m_artifactMap = nullptr; - if (termXMLTooling) { + if (termXMLTooling) XMLToolingConfig::getConfig().term(); - log.debug("XMLTooling library shut down"); - } - log.info("library shutdown complete"); + + log.info("%s library shutdown complete", PACKAGE_STRING); } void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) @@ -195,100 +218,51 @@ 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); } -void opensaml::log_openssl() +SignableObject::SignableObject() { - 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); - } } +SignableObject::~SignableObject() +{ +} + +RootObject::RootObject() +{ +} + +RootObject::~RootObject() +{ +} + +Assertion::Assertion() +{ +} + +Assertion::~Assertion() +{ +} + +using namespace saml2p; using namespace saml2md; -void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, bool rethrow) +void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow) { + const RoleDescriptor* role = nullptr; if (entity) { - auto_ptr_char id(entity->getEntityID()); - e->addProperty("entityID",id.get()); const list& roles=entity->getOrderedChildren(); - for (list::const_iterator child=roles.begin(); child!=roles.end(); ++child) { - const RoleDescriptor* role=dynamic_cast(*child); - if (role && role->isValid()) { - 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() : NULL); - auto_ptr_char last(lname ? lname->getName() : NULL); - 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; - } - } - if (e->getProperty("contactName") || e->getProperty("contactEmail")) { - auto_ptr_char eurl(role->getErrorURL()); - if (eurl.get()) { - e->addProperty("errorURL",eurl.get()); - } - } - break; - } + for (list::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) { + role=dynamic_cast(*child); + if (role && !role->isValid()) + role = nullptr; } } - - if (rethrow) - e->raise(); + annotateException(e, role, status, rethrow); } -void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* role, bool 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()); @@ -301,8 +275,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()); @@ -327,6 +301,22 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r } } + 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(); }