From: Scott Cantor Date: Wed, 21 Sep 2011 17:11:10 +0000 (+0000) Subject: Add provider Id, track last update, report in status method. X-Git-Tag: 2.5.0~69 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=commitdiff_plain;h=d76fadfe73c89442f328a7540e7b0ae08e0fbae6 Add provider Id, track last update, report in status method. --- diff --git a/saml/saml2/metadata/AbstractMetadataProvider.h b/saml/saml2/metadata/AbstractMetadataProvider.h index 9670e57..8e256cd 100644 --- a/saml/saml2/metadata/AbstractMetadataProvider.h +++ b/saml/saml2/metadata/AbstractMetadataProvider.h @@ -81,6 +81,7 @@ namespace opensaml { using MetadataProvider::getEntityDescriptor; using MetadataProvider::getEntitiesDescriptor; + void outputStatus(std::ostream& os) const; void emitChangeEvent() const; std::pair getEntityDescriptor(const Criteria& criteria) const; const EntitiesDescriptor* getEntitiesDescriptor(const char* name, bool requireValidMetadata=true) const; @@ -90,6 +91,9 @@ namespace opensaml { ) const; protected: + /** Time of last update for reporting. */ + mutable time_t m_lastUpdate; + /** Embedded KeyInfoResolver instance. */ xmltooling::KeyInfoResolver* m_resolver; diff --git a/saml/saml2/metadata/DynamicMetadataProvider.h b/saml/saml2/metadata/DynamicMetadataProvider.h index 26c8f2a..179bc2e 100644 --- a/saml/saml2/metadata/DynamicMetadataProvider.h +++ b/saml/saml2/metadata/DynamicMetadataProvider.h @@ -54,6 +54,7 @@ namespace opensaml { void init(); xmltooling::Lockable* lock(); void unlock(); + const char* getId() const; const xmltooling::XMLObject* getMetadata() const; std::pair getEntityDescriptor(const Criteria& criteria) const; @@ -70,6 +71,7 @@ namespace opensaml { virtual EntityDescriptor* resolve(const Criteria& criteria) const; private: + std::string m_id; mutable xmltooling::RWLock* m_lock; double m_refreshDelayFactor; time_t m_minCacheDuration, m_maxCacheDuration; diff --git a/saml/saml2/metadata/MetadataProvider.h b/saml/saml2/metadata/MetadataProvider.h index 63c74e7..571d4bd 100644 --- a/saml/saml2/metadata/MetadataProvider.h +++ b/saml/saml2/metadata/MetadataProvider.h @@ -97,6 +97,13 @@ namespace opensaml { virtual ~MetadataProvider(); /** + * Returns an identifier for the provider for logging/status purposes. + * + * @return an identifier, or null + */ + virtual const char* getId() const; + + /** * Adds a metadata filter to apply to any resolved metadata. Will not be applied * to metadata that is already loaded. * diff --git a/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp b/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp index d642634..9dd9bc4 100644 --- a/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -50,7 +51,7 @@ static const XMLCh _KeyInfoResolver[] = UNICODE_LITERAL_15(K,e,y,I,n,f,o,R,e,s,o static const XMLCh type[] = UNICODE_LITERAL_4(t,y,p,e); AbstractMetadataProvider::AbstractMetadataProvider(const DOMElement* e) - : ObservableMetadataProvider(e), m_resolver(nullptr), m_credentialLock(nullptr) + : ObservableMetadataProvider(e), m_lastUpdate(0), m_resolver(nullptr), m_credentialLock(nullptr) { e = XMLHelper::getFirstChildElement(e, _KeyInfoResolver); if (e) { @@ -71,6 +72,24 @@ AbstractMetadataProvider::~AbstractMetadataProvider() delete m_resolver; } +void AbstractMetadataProvider::outputStatus(ostream& os) const +{ + os << " 0) { + DateTime ts(m_lastUpdate); + ts.parseDateTime(); + auto_ptr_char timestamp(ts.getFormattedString()); + os << " lastUpdate='" << timestamp.get() << "'"; + } + + os << "/>"; +} + void AbstractMetadataProvider::emitChangeEvent() const { for (credmap_t::iterator c = m_credentialMap.begin(); c!=m_credentialMap.end(); ++c) diff --git a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp index a6af29e..9a65d01 100644 --- a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp @@ -47,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); @@ -64,6 +65,7 @@ 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)), @@ -116,6 +118,11 @@ 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"); @@ -235,6 +242,8 @@ pair DynamicMetadataProvider::get cacheExp = SAMLTIME_MAX; indexEntity(entity2.release(), cacheExp, true); + m_lastUpdate = now; + // Downgrade back to a read lock. m_lock->unlock(); m_lock->rdlock(); diff --git a/saml/saml2/metadata/impl/MetadataProvider.cpp b/saml/saml2/metadata/impl/MetadataProvider.cpp index 6498750..de18ceb 100644 --- a/saml/saml2/metadata/impl/MetadataProvider.cpp +++ b/saml/saml2/metadata/impl/MetadataProvider.cpp @@ -137,6 +137,11 @@ MetadataProvider::~MetadataProvider() for_each(m_filters.begin(), m_filters.end(), xmltooling::cleanup()); } +const char* MetadataProvider::getId() const +{ + return nullptr; +} + void MetadataProvider::addMetadataFilter(MetadataFilter* newFilter) { m_filters.push_back(newFilter); diff --git a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp index f0e5963..45e9fab 100644 --- a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp @@ -93,6 +93,10 @@ namespace opensaml { } } + const char* getId() const { + return m_id.c_str(); + } + const XMLObject* getMetadata() const { return m_object; } @@ -236,6 +240,7 @@ pair XMLMetadataProvider::load(bool backup) generateFeed(); if (changed) emitChangeEvent(); + m_lastUpdate = time(nullptr); // Tracking cacheUntil through the tree is TBD, but // validUntil is the tightest interval amongst the children.