X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2Fimpl%2FDynamicMetadataProvider.cpp;h=2768440a13d5a2cecf4cf330d50ce03ab461c221;hp=ff5cfa2932c45eeb7c5499b16944168dd695fa82;hb=1462057b3b9ae7e165d34d988e30b14c213672ca;hpb=bf0e419cb97f60cfea8722d2bb6b1ff6d0a94e33 diff --git a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp index ff5cfa2..2768440 100644 --- a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp @@ -1,17 +1,21 @@ -/* - * 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. */ /** @@ -43,6 +47,7 @@ using namespace std; # define min(a,b) (((a) < (b)) ? (a) : (b)) # endif +static const XMLCh id[] = UNICODE_LITERAL_2(i,d); static const XMLCh maxCacheDuration[] = UNICODE_LITERAL_16(m,a,x,C,a,c,h,e,D,u,r,a,t,i,o,n); static const XMLCh minCacheDuration[] = UNICODE_LITERAL_16(m,i,n,C,a,c,h,e,D,u,r,a,t,i,o,n); static const XMLCh refreshDelayFactor[] = UNICODE_LITERAL_18(r,e,f,r,e,s,h,D,e,l,a,y,F,a,c,t,o,r); @@ -60,13 +65,14 @@ namespace opensaml { DynamicMetadataProvider::DynamicMetadataProvider(const DOMElement* e) : AbstractMetadataProvider(e), m_validate(XMLHelper::getAttrBool(e, false, validate)), + m_id(XMLHelper::getAttrString(e, "Dynamic", id)), m_lock(RWLock::create()), m_refreshDelayFactor(0.75), m_minCacheDuration(XMLHelper::getAttrInt(e, 600, minCacheDuration)), m_maxCacheDuration(XMLHelper::getAttrInt(e, 28800, maxCacheDuration)) { if (m_minCacheDuration > m_maxCacheDuration) { - Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error( + Category::getInstance(SAML_LOGCAT ".MetadataProvider.Dynamic").error( "minCacheDuration setting exceeds maxCacheDuration setting, lowering to match it" ); m_minCacheDuration = m_maxCacheDuration; @@ -77,7 +83,7 @@ DynamicMetadataProvider::DynamicMetadataProvider(const DOMElement* e) auto_ptr_char temp(delay); m_refreshDelayFactor = atof(temp.get()); if (m_refreshDelayFactor <= 0.0 || m_refreshDelayFactor >= 1.0) { - Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error( + Category::getInstance(SAML_LOGCAT ".MetadataProvider.Dynamic").error( "invalid refreshDelayFactor setting, using default" ); m_refreshDelayFactor = 0.75; @@ -89,7 +95,6 @@ DynamicMetadataProvider::~DynamicMetadataProvider() { // Each entity in the map is unique (no multimap semantics), so this is safe. clearDescriptorIndex(true); - delete m_lock; } const XMLObject* DynamicMetadataProvider::getMetadata() const @@ -112,9 +117,14 @@ void DynamicMetadataProvider::init() { } +const char* DynamicMetadataProvider::getId() const +{ + return m_id.c_str(); +} + pair DynamicMetadataProvider::getEntityDescriptor(const Criteria& criteria) const { - Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic"); + Category& log = Category::getInstance(SAML_LOGCAT ".MetadataProvider.Dynamic"); // First we check the underlying cache. pair entity = AbstractMetadataProvider::getEntityDescriptor(criteria); @@ -193,7 +203,7 @@ pair DynamicMetadataProvider::get } // Filter it, which may throw. - doFilters(*entity2.get()); + doFilters(*entity2); time_t now = time(nullptr); if (entity2->getValidUntil() && entity2->getValidUntilEpoch() < now + 60) @@ -222,14 +232,17 @@ pair DynamicMetadataProvider::get m_lock->wrlock(); // Notify observers. - emitChangeEvent(); + emitChangeEvent(*entity2); // Record the proper refresh time. m_cacheMap[entity2->getEntityID()] = now + cacheExp; // Make sure we clear out any existing copies, including stale metadata or if somebody snuck in. cacheExp = SAMLTIME_MAX; - indexEntity(entity2.release(), cacheExp, true); + indexEntity(entity2.get(), cacheExp, true); + entity2.release(); + + m_lastUpdate = now; // Downgrade back to a read lock. m_lock->unlock(); @@ -299,7 +312,7 @@ EntityDescriptor* DynamicMetadataProvider::resolve(const Criteria& criteria) con } catch (XMLException& e) { auto_ptr_char msg(e.getMessage()); - Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error( + Category::getInstance(SAML_LOGCAT ".MetadataProvider.Dynamic").error( "Xerces error while resolving entityID (%s): %s", name.c_str(), msg.get() ); throw MetadataException(msg.get());