X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2FSPConfig.cpp;h=097704c937f1dfa7344c1c99aeb543f56a7f3bed;hb=be7c4eeba340f531e8d3410b1a38db8beda4f030;hp=34728fbbe8845075e7957df9a047e72723abf25b;hpb=5e9effa89c8863b16112fec370d63a64b5803744;p=shibboleth%2Fsp.git diff --git a/shibsp/SPConfig.cpp b/shibsp/SPConfig.cpp index 34728fb..097704c 100644 --- a/shibsp/SPConfig.cpp +++ b/shibsp/SPConfig.cpp @@ -1,7 +1,7 @@ /* - * 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. * You may obtain a copy of the License at @@ -17,31 +17,86 @@ /** * SPConfig.cpp - * - * Library configuration + * + * Library configuration. */ #include "internal.h" + +#if defined(XMLTOOLING_LOG4SHIB) +# ifndef SHIBSP_LOG4SHIB +# error "Logging library mismatch (XMLTooling is using log4shib)." +# endif +#elif defined(XMLTOOLING_LOG4CPP) +# ifndef SHIBSP_LOG4CPP +# error "Logging library mismatch (XMLTooling is using log4cpp)." +# endif +#else +# error "No supported logging library." +#endif + #include "exceptions.h" -#include "ListenerService.h" -#include "MetadataExt.h" +#include "version.h" +#include "AccessControl.h" +#include "RequestMapper.h" +#include "ServiceProvider.h" +#include "SessionCache.h" #include "SPConfig.h" +#include "TransactionLog.h" +#include "attribute/Attribute.h" +#include "binding/ProtocolProvider.h" +#include "handler/LogoutInitiator.h" +#include "handler/SessionInitiator.h" +#include "remoting/ListenerService.h" + +#ifndef SHIBSP_LITE +# include "attribute/AttributeDecoder.h" +# include "attribute/filtering/AttributeFilter.h" +# include "attribute/filtering/MatchFunctor.h" +# include "attribute/resolver/AttributeExtractor.h" +# include "attribute/resolver/AttributeResolver.h" +# include "binding/ArtifactResolver.h" +# include "metadata/MetadataExt.h" +# include "security/PKIXTrustEngine.h" +# include "security/SecurityPolicyProvider.h" +# include +# include +#endif -#include -#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include using namespace shibsp; using namespace opensaml; using namespace xmltooling; -using namespace log4cpp; +using namespace std; +DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeException,shibsp); +DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeExtractionException,shibsp); +DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeFilteringException,shibsp); +DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeResolutionException,shibsp); DECL_XMLTOOLING_EXCEPTION_FACTORY(ConfigurationException,shibsp); DECL_XMLTOOLING_EXCEPTION_FACTORY(ListenerException,shibsp); +#ifdef SHIBSP_LITE +DECL_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml); +DECL_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md); +#endif + namespace shibsp { - SPInternalConfig g_config; + SPConfig g_config; } SPConfig& SPConfig::getConfig() @@ -49,64 +104,343 @@ SPConfig& SPConfig::getConfig() return g_config; } -SPInternalConfig& SPInternalConfig::getInternalConfig() +SPConfig::SPConfig() : attribute_value_delimeter(';'), m_serviceProvider(nullptr), +#ifndef SHIBSP_LITE + m_artifactResolver(nullptr), +#endif + m_features(0), m_configDoc(nullptr) { - return g_config; +} + +SPConfig::~SPConfig() +{ +} + +void SPConfig::setFeatures(unsigned long enabled) +{ + m_features = enabled; +} + +unsigned long SPConfig::getFeatures() const { + return m_features; +} + +bool SPConfig::isEnabled(components_t feature) const +{ + return (m_features & feature)>0; +} + +ServiceProvider* SPConfig::getServiceProvider() const +{ + return m_serviceProvider; } void SPConfig::setServiceProvider(ServiceProvider* serviceProvider) { - //delete m_serviceProvider; + delete m_serviceProvider; m_serviceProvider = serviceProvider; } -bool SPInternalConfig::init(const char* catalog_path) +#ifndef SHIBSP_LITE +void SPConfig::setArtifactResolver(MessageDecoder::ArtifactResolver* artifactResolver) +{ + delete m_artifactResolver; + m_artifactResolver = artifactResolver; +} + +const MessageDecoder::ArtifactResolver* SPConfig::getArtifactResolver() const +{ + return m_artifactResolver; +} +#endif + +bool SPConfig::init(const char* catalog_path, const char* inst_prefix) { #ifdef _DEBUG NDC ndc("init"); #endif - Category& log=Category::getInstance(SHIBSP_LOGCAT".Config"); - log.debug("library initialization started"); + if (!inst_prefix) + inst_prefix = getenv("SHIBSP_PREFIX"); + if (!inst_prefix) + inst_prefix = SHIBSP_PREFIX; + std::string inst_prefix2; + while (*inst_prefix) { + inst_prefix2.push_back((*inst_prefix=='\\') ? ('/') : (*inst_prefix)); + ++inst_prefix; + } const char* loglevel=getenv("SHIBSP_LOGGING"); if (!loglevel) loglevel = SHIBSP_LOGGING; - XMLToolingConfig::getConfig().log_config(loglevel); + std::string ll(loglevel); + PathResolver localpr; + localpr.setDefaultPrefix(inst_prefix2.c_str()); + inst_prefix = getenv("SHIBSP_CFGDIR"); + if (!inst_prefix) + inst_prefix = SHIBSP_CFGDIR; + localpr.setCfgDir(inst_prefix); + XMLToolingConfig::getConfig().log_config(localpr.resolve(ll, PathResolver::XMLTOOLING_CFG_FILE, PACKAGE_NAME).c_str()); - if (catalog_path) - XMLToolingConfig::getConfig().catalog_path = catalog_path; + Category& log=Category::getInstance(SHIBSP_LOGCAT".Config"); + log.debug("%s library initialization started", PACKAGE_STRING); + if (!catalog_path) + catalog_path = getenv("SHIBSP_SCHEMAS"); + if (!catalog_path) + catalog_path = SHIBSP_SCHEMAS; + XMLToolingConfig::getConfig().catalog_path = catalog_path; + +#ifndef SHIBSP_LITE + XMLToolingConfig::getConfig().user_agent = string(PACKAGE_NAME) + '/' + PACKAGE_VERSION + + " OpenSAML/" + OPENSAML_FULLVERSIONDOT + + " XMLTooling/" + XMLTOOLING_FULLVERSIONDOT + + " XML-Security-C/" + XSEC_FULLVERSIONDOT + + " Xerces-C/" + XERCES_FULLVERSIONDOT + +#if defined(LOG4SHIB_VERSION) + " log4shib/" + LOG4SHIB_VERSION; +#elif defined(LOG4CPP_VERSION) + " log4cpp/" + LOG4CPP_VERSION; +#endif if (!SAMLConfig::getConfig().init()) { log.fatal("failed to initialize OpenSAML library"); return false; } +#else + XMLToolingConfig::getConfig().user_agent = string(PACKAGE_NAME) + '/' + PACKAGE_VERSION + + " XMLTooling/" + XMLTOOLING_FULLVERSIONDOT + + " Xerces-C/" + XERCES_FULLVERSIONDOT + +#if defined(LOG4SHIB_VERSION) + " log4shib/" + LOG4SHIB_VERSION; +#elif defined(LOG4CPP_VERSION) + " log4cpp/" + LOG4CPP_VERSION; +#endif + if (!XMLToolingConfig::getConfig().init()) { + log.fatal("failed to initialize XMLTooling library"); + return false; + } +#endif + PathResolver* pr = XMLToolingConfig::getConfig().getPathResolver(); + pr->setDefaultPackageName(PACKAGE_NAME); + pr->setDefaultPrefix(inst_prefix2.c_str()); + pr->setCfgDir(inst_prefix); + inst_prefix = getenv("SHIBSP_LIBDIR"); + if (!inst_prefix) + inst_prefix = SHIBSP_LIBDIR; + pr->setLibDir(inst_prefix); + inst_prefix = getenv("SHIBSP_LOGDIR"); + if (!inst_prefix) + inst_prefix = SHIBSP_LOGDIR; + pr->setLogDir(inst_prefix); + inst_prefix = getenv("SHIBSP_RUNDIR"); + if (!inst_prefix) + inst_prefix = SHIBSP_RUNDIR; + pr->setRunDir(inst_prefix); + inst_prefix = getenv("SHIBSP_XMLDIR"); + if (!inst_prefix) + inst_prefix = SHIBSP_XMLDIR; + pr->setXMLDir(inst_prefix); XMLToolingConfig::getConfig().setTemplateEngine(new TemplateEngine()); XMLToolingConfig::getConfig().getTemplateEngine()->setTagPrefix("shibmlp"); - + + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeException,shibsp); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeExtractionException,shibsp); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeFilteringException,shibsp); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeResolutionException,shibsp); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ConfigurationException,shibsp); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ListenerException,shibsp); - - registerListenerServices(); - registerMetadataExtClasses(); - log.info("library initialization complete"); +#ifdef SHIBSP_LITE + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md); +#endif + +#ifndef SHIBSP_LITE + if (isEnabled(Metadata)) + registerMetadataExtClasses(); + if (isEnabled(Trust)) + registerPKIXTrustEngine(); +#endif + + registerAttributeFactories(); + + if (isEnabled(Handlers)) { + registerHandlers(); + registerLogoutInitiators(); + registerSessionInitiators(); + registerProtocolProviders(); + } + + registerServiceProviders(); + +#ifndef SHIBSP_LITE + if (isEnabled(AttributeResolution)) { + registerAttributeExtractors(); + registerAttributeDecoders(); + registerAttributeResolvers(); + registerAttributeFilters(); + registerMatchFunctors(); + } + registerSecurityPolicyProviders(); +#endif + + if (isEnabled(Listener)) + registerListenerServices(); + + if (isEnabled(RequestMapping)) { + registerAccessControls(); + registerRequestMappers(); + } + + if (isEnabled(Caching)) + registerSessionCaches(); + +#ifndef SHIBSP_LITE + if (isEnabled(OutOfProcess)) + m_artifactResolver = new ArtifactResolver(); +#endif + srand(static_cast(std::time(nullptr))); + + log.info("%s library initialization complete", PACKAGE_STRING); return true; } -void SPInternalConfig::term() +void SPConfig::term() { #ifdef _DEBUG NDC ndc("term"); #endif Category& log=Category::getInstance(SHIBSP_LOGCAT".Config"); - log.info("shutting down the library"); + log.info("%s library shutting down", PACKAGE_STRING); + + setServiceProvider(nullptr); + if (m_configDoc) + m_configDoc->release(); + m_configDoc = nullptr; +#ifndef SHIBSP_LITE + setArtifactResolver(nullptr); +#endif + + if (isEnabled(Handlers)) { + ArtifactResolutionServiceManager.deregisterFactories(); + AssertionConsumerServiceManager.deregisterFactories(); + LogoutInitiatorManager.deregisterFactories(); + ManageNameIDServiceManager.deregisterFactories(); + SessionInitiatorManager.deregisterFactories(); + SingleLogoutServiceManager.deregisterFactories(); + HandlerManager.deregisterFactories(); + ProtocolProviderManager.deregisterFactories(); + } + + ServiceProviderManager.deregisterFactories(); + Attribute::deregisterFactories(); + +#ifndef SHIBSP_LITE + SecurityPolicyProviderManager.deregisterFactories(); + if (isEnabled(AttributeResolution)) { + MatchFunctorManager.deregisterFactories(); + AttributeFilterManager.deregisterFactories(); + AttributeDecoderManager.deregisterFactories(); + AttributeExtractorManager.deregisterFactories(); + AttributeResolverManager.deregisterFactories(); + } +#endif + + if (isEnabled(Listener)) + ListenerServiceManager.deregisterFactories(); + + if (isEnabled(RequestMapping)) { + AccessControlManager.deregisterFactories(); + RequestMapperManager.deregisterFactories(); + } - //delete m_serviceProvider; - m_serviceProvider = NULL; - - ListenerServiceManager.deregisterFactories(); + if (isEnabled(Caching)) + SessionCacheManager.deregisterFactories(); +#ifndef SHIBSP_LITE SAMLConfig::getConfig().term(); - log.info("library shutdown complete"); +#else + XMLToolingConfig::getConfig().term(); +#endif + log.info("%s library shutdown complete", PACKAGE_STRING); +} + +bool SPConfig::instantiate(const char* config, bool rethrow) +{ +#ifdef _DEBUG + NDC ndc("instantiate"); +#endif + if (!config) + config = getenv("SHIBSP_CONFIG"); + if (!config) + config = SHIBSP_CONFIG; + try { + xercesc::DOMDocument* dummydoc; + if (*config == '"' || *config == '\'') { + throw ConfigurationException("The value of SHIBSP_CONFIG started with a quote."); + } + else if (*config != '<') { + + // Mock up some XML. + string resolved(config); + stringstream snippet; + snippet + << ""; + dummydoc = XMLToolingConfig::getConfig().getParser().parse(snippet); + XercesJanitor docjanitor(dummydoc); + setServiceProvider(ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER, dummydoc->getDocumentElement())); + if (m_configDoc) + m_configDoc->release(); + m_configDoc = docjanitor.release(); + } + else { + stringstream snippet(config); + dummydoc = XMLToolingConfig::getConfig().getParser().parse(snippet); + XercesJanitor docjanitor(dummydoc); + static const XMLCh _type[] = UNICODE_LITERAL_4(t,y,p,e); + auto_ptr_char type(dummydoc->getDocumentElement()->getAttributeNS(nullptr,_type)); + if (type.get() && *type.get()) + setServiceProvider(ServiceProviderManager.newPlugin(type.get(), dummydoc->getDocumentElement())); + else + throw ConfigurationException("The supplied XML bootstrapping configuration did not include a type attribute."); + if (m_configDoc) + m_configDoc->release(); + m_configDoc = docjanitor.release(); + } + + getServiceProvider()->init(); + return true; + } + catch (exception& ex) { + if (rethrow) + throw; + Category::getInstance(SHIBSP_LOGCAT".Config").fatal("caught exception while loading configuration: %s", ex.what()); + } + return false; +} + +TransactionLog::TransactionLog() : log(logging::Category::getInstance(SHIBSP_TX_LOGCAT)), m_lock(Mutex::create()) +{ +} + +TransactionLog::~TransactionLog() +{ + delete m_lock; +} + +Lockable* TransactionLog::lock() +{ + m_lock->lock(); + return this; +} + +void TransactionLog::unlock() +{ + m_lock->unlock(); }