-
-/*
- * Copyright 2001-2010 Internet2
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
*
- * 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
+ * UCAID licenses this file to you 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
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
*/
/**
# error "No supported logging library."
#endif
-#include "AccessControl.h"
#include "exceptions.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"
# include "binding/ArtifactResolver.h"
# include "metadata/MetadataExt.h"
# include "security/PKIXTrustEngine.h"
+# include "security/SecurityPolicyProvider.h"
+# include <saml/version.h>
# include <saml/SAMLConfig.h>
#endif
#include <ctime>
#include <xercesc/util/XMLUniDefs.hpp>
+#include <xmltooling/version.h>
#include <xmltooling/XMLToolingConfig.h>
#include <xmltooling/util/NDC.h>
#include <xmltooling/util/ParserPool.h>
using namespace shibsp;
using namespace opensaml;
using namespace xmltooling;
+using namespace boost;
using namespace std;
DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeException,shibsp);
#endif
namespace shibsp {
- SPConfig g_config;
+ class SHIBSP_DLLLOCAL SPInternalConfig : public SPConfig
+ {
+ public:
+ SPInternalConfig() : m_initCount(0), m_lock(Mutex::create()) {}
+ ~SPInternalConfig() {}
+
+ bool init(const char* catalog_path=nullptr, const char* inst_prefix=nullptr);
+ void term();
+
+ private:
+ int m_initCount;
+ scoped_ptr<Mutex> m_lock;
+ };
+
+ SPInternalConfig g_config;
}
SPConfig& SPConfig::getConfig()
m_features = enabled;
}
-bool SPConfig::isEnabled(components_t feature)
+unsigned long SPConfig::getFeatures() const {
+ return m_features;
+}
+
+bool SPConfig::isEnabled(components_t feature) const
{
return (m_features & feature)>0;
}
bool SPConfig::init(const char* catalog_path, const char* inst_prefix)
{
-#ifdef _DEBUG
- NDC ndc("init");
-#endif
if (!inst_prefix)
inst_prefix = getenv("SHIBSP_PREFIX");
if (!inst_prefix)
++inst_prefix;
}
- const char* loglevel=getenv("SHIBSP_LOGGING");
- if (!loglevel)
- loglevel = SHIBSP_LOGGING;
- std::string ll(loglevel);
+ const char* logconf = getenv("SHIBSP_LOGGING");
+ if (!logconf || !*logconf) {
+ if (isEnabled(SPConfig::Logging) && isEnabled(SPConfig::OutOfProcess) && !isEnabled(SPConfig::InProcess))
+ logconf = SHIBSP_OUTOFPROC_LOGGING;
+ else if (isEnabled(SPConfig::Logging) && isEnabled(SPConfig::InProcess) && !isEnabled(SPConfig::OutOfProcess))
+ logconf = SHIBSP_INPROC_LOGGING;
+ else
+ logconf = SHIBSP_LOGGING;
+ }
PathResolver localpr;
localpr.setDefaultPrefix(inst_prefix2.c_str());
inst_prefix = getenv("SHIBSP_CFGDIR");
- if (!inst_prefix)
+ if (!inst_prefix || !*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());
+ std::string lc(logconf);
+ XMLToolingConfig::getConfig().log_config(localpr.resolve(lc, PathResolver::XMLTOOLING_CFG_FILE, PACKAGE_NAME).c_str());
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/" + gOpenSAMLDotVersionStr +
+ " XMLTooling/" + gXMLToolingDotVersionStr +
+ " 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/" + gXMLToolingDotVersionStr +
+ " 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
+ if (!catalog_path)
+ catalog_path = getenv("SHIBSP_SCHEMAS");
+ if (!catalog_path || !*catalog_path)
+ catalog_path = SHIBSP_SCHEMAS;
+ if (!XMLToolingConfig::getConfig().getValidatingParser().loadCatalogs(catalog_path)) {
+ log.warn("failed to load schema catalogs into validating parser");
+ }
+
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)
+ if (!inst_prefix || !*inst_prefix)
inst_prefix = SHIBSP_LIBDIR;
pr->setLibDir(inst_prefix);
inst_prefix = getenv("SHIBSP_LOGDIR");
- if (!inst_prefix)
+ if (!inst_prefix || !*inst_prefix)
inst_prefix = SHIBSP_LOGDIR;
pr->setLogDir(inst_prefix);
inst_prefix = getenv("SHIBSP_RUNDIR");
- if (!inst_prefix)
+ if (!inst_prefix || !*inst_prefix)
inst_prefix = SHIBSP_RUNDIR;
pr->setRunDir(inst_prefix);
+ inst_prefix = getenv("SHIBSP_CACHEDIR");
+ if (!inst_prefix || !*inst_prefix)
+ inst_prefix = SHIBSP_CACHEDIR;
+ pr->setCacheDir(inst_prefix);
inst_prefix = getenv("SHIBSP_XMLDIR");
- if (!inst_prefix)
+ if (!inst_prefix || !*inst_prefix)
inst_prefix = SHIBSP_XMLDIR;
pr->setXMLDir(inst_prefix);
#endif
registerAttributeFactories();
- registerHandlers();
- registerSessionInitiators();
+
+ if (isEnabled(Handlers)) {
+ registerHandlers();
+ registerLogoutInitiators();
+ registerSessionInitiators();
+ registerProtocolProviders();
+ }
+
registerServiceProviders();
#ifndef SHIBSP_LITE
registerAttributeFilters();
registerMatchFunctors();
}
+ if (isEnabled(Logging)) {
+ registerEvents();
+ }
+ registerSecurityPolicyProviders();
#endif
if (isEnabled(Listener))
void SPConfig::term()
{
-#ifdef _DEBUG
- NDC ndc("term");
-#endif
Category& log=Category::getInstance(SHIBSP_LOGCAT".Config");
log.info("%s library shutting down", PACKAGE_STRING);
setArtifactResolver(nullptr);
#endif
- ArtifactResolutionServiceManager.deregisterFactories();
- AssertionConsumerServiceManager.deregisterFactories();
- LogoutInitiatorManager.deregisterFactories();
- ManageNameIDServiceManager.deregisterFactories();
- SessionInitiatorManager.deregisterFactories();
- SingleLogoutServiceManager.deregisterFactories();
- HandlerManager.deregisterFactories();
+ 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(Logging)) {
+ EventManager.deregisterFactories();
+ }
if (isEnabled(AttributeResolution)) {
MatchFunctorManager.deregisterFactories();
AttributeFilterManager.deregisterFactories();
return false;
}
-TransactionLog::TransactionLog() : log(logging::Category::getInstance(SHIBSP_TX_LOGCAT)), m_lock(Mutex::create())
+bool SPInternalConfig::init(const char* catalog_path, const char* inst_prefix)
{
-}
+#ifdef _DEBUG
+ xmltooling::NDC ndc("init");
+#endif
-TransactionLog::~TransactionLog()
-{
- delete m_lock;
-}
+ Lock initLock(m_lock);
-Lockable* TransactionLog::lock()
-{
- m_lock->lock();
- return this;
+ if (m_initCount == INT_MAX) {
+ Category::getInstance(SHIBSP_LOGCAT".Config").crit("library initialized too many times");
+ return false;
+ }
+
+ if (m_initCount >= 1) {
+ ++m_initCount;
+ return true;
+ }
+
+ if (!SPConfig::init(catalog_path, inst_prefix)) {
+ return false;
+ }
+
+ ++m_initCount;
+ return true;
}
-void TransactionLog::unlock()
+void SPInternalConfig::term()
{
- m_lock->unlock();
+#ifdef _DEBUG
+ xmltooling::NDC ndc("term");
+#endif
+
+ Lock initLock(m_lock);
+ if (m_initCount == 0) {
+ Category::getInstance(SHIBSP_LOGCAT".Config").crit("term without corresponding init");
+ return;
+ }
+ else if (--m_initCount > 0) {
+ return;
+ }
+
+ SPConfig::term();
}