X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2FSAMLConfig.cpp;h=5842713815b92df0b255a4f670f6d7254146eaec;hb=f92e8ef00181805957c44a7d9cc7d82491c0b5cf;hp=12e60e1d706811ffbfa7204b3cd5f247b4eccfb9;hpb=840b05eda26529a8c06790960bbb227162523309;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/SAMLConfig.cpp b/saml/SAMLConfig.cpp index 12e60e1..5842713 100644 --- a/saml/SAMLConfig.cpp +++ b/saml/SAMLConfig.cpp @@ -1,18 +1,21 @@ - -/* - * Copyright 2001-2009 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 +/** + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 * - * 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. + * 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. */ /** @@ -56,6 +59,7 @@ #include #include #include +#include #include #include @@ -104,7 +108,7 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig() return g_config; } -SAMLConfig::SAMLConfig() : m_artifactMap(NULL) +SAMLConfig::SAMLConfig() : m_artifactMap(nullptr) { } @@ -123,16 +127,40 @@ void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap) m_artifactMap = artifactMap; } +SAMLInternalConfig::SAMLInternalConfig() : m_initCount(0), m_lock(Mutex::create()) +{ +} + +SAMLInternalConfig::~SAMLInternalConfig() +{ + delete m_lock; +} + bool SAMLInternalConfig::init(bool initXMLTooling) { #ifdef _DEBUG xmltooling::NDC ndc("init"); #endif - Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); + Category& log=Category::getInstance(SAML_LOGCAT".Config"); + + Lock initLock(m_lock); + + if (m_initCount == INT_MAX) { + log.crit("library initialized too many times"); + return false; + } + + if (m_initCount >= 1) { + ++m_initCount; + return true; + } + log.debug("library initialization started"); - if (initXMLTooling) - XMLToolingConfig::getConfig().init(); + if (initXMLTooling && !XMLToolingConfig::getConfig().init()) { + return false; + } + XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName("opensaml"); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml); @@ -157,6 +185,7 @@ bool SAMLInternalConfig::init(bool initXMLTooling) registerSecurityPolicyRules(); log.info("%s library initialization complete", PACKAGE_STRING); + ++m_initCount; return true; } @@ -165,7 +194,15 @@ void SAMLInternalConfig::term(bool termXMLTooling) #ifdef _DEBUG xmltooling::NDC ndc("term"); #endif - Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig"); + + Lock initLock(m_lock); + if (m_initCount == 0) { + Category::getInstance(SAML_LOGCAT".Config").crit("term without corresponding init"); + return; + } + else if (--m_initCount > 0) { + return; + } MessageDecoderManager.deregisterFactories(); MessageEncoderManager.deregisterFactories(); @@ -175,12 +212,12 @@ void SAMLInternalConfig::term(bool termXMLTooling) MetadataProviderManager.deregisterFactories(); delete m_artifactMap; - m_artifactMap = NULL; + m_artifactMap = nullptr; if (termXMLTooling) XMLToolingConfig::getConfig().term(); - log.info("%s library shutdown complete", PACKAGE_STRING); + Category::getInstance(SAML_LOGCAT".Config").info("%s library shutdown complete", PACKAGE_STRING); } void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) @@ -197,8 +234,8 @@ void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len) void SAMLInternalConfig::generateRandomBytes(std::string& buf, unsigned int len) { buf.erase(); - auto_ptr hold(new unsigned char[len]); - generateRandomBytes(hold.get(),len); + auto_arrayptr hold(new unsigned char[len]); + generateRandomBytes(const_cast(hold.get()), len); for (unsigned int i=0; i& roles=entity->getOrderedChildren(); for (list::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) { role=dynamic_cast(*child); if (role && !role->isValid()) - role = NULL; + role = nullptr; } } annotateException(e, role, status, rethrow); @@ -275,8 +312,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()); @@ -302,7 +339,7 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r } if (status) { - auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : NULL); + auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : nullptr); if (sc.get() && *sc.get()) e->addProperty("statusCode", sc.get()); if (status->getStatusCode()->getStatusCode()) {