X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=5d342219e5ed4117df029e4954d926236017a9e0;hb=ceba6432d156e82a9016190c06ae4640c651a257;hp=6f4bf768c40e86ef095767036881b2462ade9228;hpb=cec17382f1fd55105c849e5967d39d5d25eb2c1f;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index 6f4bf76..5d34221 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -23,8 +23,12 @@ #include "internal.h" #include "exceptions.h" -#include "SAMLArtifact.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 "saml1/core/Assertions.h" #include "saml1/core/Protocols.h" #include "saml2/core/Protocols.h" @@ -49,8 +53,23 @@ using namespace xmltooling; using namespace log4cpp; using namespace std; +// 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; @@ -66,7 +85,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"); @@ -74,13 +105,15 @@ 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); - registerSAMLArtifacts(); saml1::registerAssertionClasses(); saml1p::registerProtocolClasses(); saml2::registerAssertionClasses(); @@ -88,30 +121,43 @@ bool SAMLInternalConfig::init() saml2md::registerMetadataClasses(); saml2md::registerMetadataProviders(); saml2md::registerMetadataFilters(); + registerSAMLArtifacts(); registerTrustEngines(); + registerMessageEncoders(); + registerMessageDecoders(); + registerSecurityPolicyRules(); + + 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(); - + MessageDecoderManager.deregisterFactories(); + MessageEncoderManager.deregisterFactories(); + TrustEngineManager.deregisterFactories(); + SecurityPolicyRuleManager.deregisterFactories(); SAMLArtifactManager.deregisterFactories(); MetadataFilterManager.deregisterFactories(); MetadataProviderManager.deregisterFactories(); - TrustEngineManager.deregisterFactories(); - XMLToolingConfig::getConfig().term(); - Category::getInstance(SAML_LOGCAT".SAMLConfig").info("library shutdown complete"); + 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) @@ -153,9 +199,8 @@ string SAMLInternalConfig::hashSHA1(const char* s, bool toHex) 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())); + hasher->hash(reinterpret_cast(const_cast(s)),strlen(s)); if (hasher->finish(buf,20)==20) { string ret; if (toHex) { @@ -190,3 +235,98 @@ void opensaml::log_openssl() code=ERR_get_error_line_data(&file,&line,&data,&flags); } } + +using namespace saml2md; + +void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, bool rethrow) +{ + 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; + } + } + } + + if (rethrow) + e->raise(); +} + +void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* role, 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() : 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; + } + } + + auto_ptr_char eurl(role->getErrorURL()); + if (eurl.get()) { + e->addProperty("errorURL",eurl.get()); + } + } + + if (rethrow) + e->raise(); +}