X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2Fimpl%2FXMLMetadataProvider.cpp;h=03deb22fd1e5af0384584037047a0cbb5e0ab705;hp=adcdee8dd802f6809bb94b9a69e759969f96d184;hb=0d5e6d568cd0945e18a8b54b7d75e9f5a352c41b;hpb=529b003774ec45cad19910b845a52a70d273043d diff --git a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp index adcdee8..03deb22 100644 --- a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp @@ -41,16 +41,12 @@ using namespace std; namespace opensaml { namespace saml2md { - static const XMLCh requireValidUntil[] = UNICODE_LITERAL_17(r,e,q,u,i,r,e,V,a,l,i,d,U,n,t,i,l); - class SAML_DLLLOCAL XMLMetadataProvider : public AbstractMetadataProvider, public ReloadableXMLFile { public: XMLMetadataProvider(const DOMElement* e) : AbstractMetadataProvider(e), ReloadableXMLFile(e, Category::getInstance(SAML_LOGCAT".MetadataProvider.XML")), - m_object(NULL), m_requireValidUntil(false) { - const XMLCh* flag = e ? e->getAttributeNS(NULL,requireValidUntil) : NULL; - m_requireValidUntil = (flag && (*flag == chLatin_t || *flag == chDigit_1)); + m_object(NULL), m_maxCacheDuration(m_reloadInterval) { } virtual ~XMLMetadataProvider() { delete m_object; @@ -72,7 +68,7 @@ namespace opensaml { void index(); XMLObject* m_object; - bool m_requireValidUntil; + time_t m_maxCacheDuration; }; MetadataProvider* SAML_DLLLOCAL XMLMetadataProviderFactory(const DOMElement* const & e) @@ -104,12 +100,6 @@ pair XMLMetadataProvider::load() "Root of metadata instance not recognized: $1", params(1,xmlObject->getElementQName().toString().c_str()) ); - if (m_requireValidUntil) { - const TimeBoundSAMLObject* tbo = dynamic_cast(xmlObject.get()); - if (!tbo || tbo->getValidUntil() == NULL) - throw MetadataException("Root of metadata instance does not have validUntil atttribute."); - } - // Preprocess the metadata. doFilters(*xmlObject.get()); xmlObject->releaseThisAndChildrenDOM(); @@ -122,6 +112,16 @@ pair XMLMetadataProvider::load() index(); if (changed) emitChangeEvent(); + + // If a remote resource, reduce the reload interval if cacheDuration is set. + if (!m_local) { + const CacheableSAMLObject* cacheable = dynamic_cast(m_object); + if (cacheable && cacheable->getCacheDuration() && cacheable->getCacheDurationEpoch() < m_maxCacheDuration) + m_reloadInterval = cacheable->getCacheDurationEpoch(); + else + m_reloadInterval = m_maxCacheDuration; + } + return make_pair(false,(DOMElement*)NULL); }