X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2Fimpl%2FXMLMetadataProvider.cpp;h=2f410bd862defb0f5052989d69b91a8670ab3454;hb=0f3c25302b5938c77530b5779732e94d535e5ef9;hp=b6fa61b86e4fd3d81e38f4a58805d4b04a6471ff;hpb=efdb2506230cf895ed3e68b759c7869a0c9d7ab1;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp index b6fa61b..2f410bd 100644 --- a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp @@ -25,10 +25,13 @@ #include "saml2/metadata/Metadata.h" #include "saml2/metadata/MetadataFilter.h" #include "saml2/metadata/AbstractMetadataProvider.h" +#include "saml2/metadata/DiscoverableMetadataProvider.h" #include +#include #include #include +#include #include #include #include @@ -46,10 +49,8 @@ using namespace std; namespace opensaml { namespace saml2md { - static const XMLCh minRefreshDelay[] = UNICODE_LITERAL_15(m,i,n,R,e,f,r,e,s,h,D,e,l,a,y); - 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); - - class SAML_DLLLOCAL XMLMetadataProvider : public AbstractMetadataProvider, public ReloadableXMLFile + class SAML_DLLLOCAL XMLMetadataProvider + : public AbstractMetadataProvider, public DiscoverableMetadataProvider, public ReloadableXMLFile { public: XMLMetadataProvider(const DOMElement* e); @@ -60,8 +61,14 @@ namespace opensaml { } void init() { - background_load(); - startup(); + try { + background_load(); + startup(); + } + catch (...) { + startup(); + throw; + } } const XMLObject* getMetadata() const { @@ -78,6 +85,7 @@ namespace opensaml { time_t computeNextRefresh(); XMLObject* m_object; + bool m_discoveryFeed; double m_refreshDelayFactor; unsigned int m_backoffFactor; time_t m_minRefreshDelay,m_maxRefreshDelay,m_lastValidUntil; @@ -88,6 +96,9 @@ namespace opensaml { return new XMLMetadataProvider(e); } + static const XMLCh discoveryFeed[] = UNICODE_LITERAL_13(d,i,s,c,o,v,e,r,y,F,e,e,d); + static const XMLCh minRefreshDelay[] = UNICODE_LITERAL_15(m,i,n,R,e,f,r,e,s,h,D,e,l,a,y); + 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); }; }; @@ -96,12 +107,14 @@ namespace opensaml { #endif XMLMetadataProvider::XMLMetadataProvider(const DOMElement* e) - : AbstractMetadataProvider(e), ReloadableXMLFile(e, Category::getInstance(SAML_LOGCAT".MetadataProvider.XML"), false), - m_object(nullptr), m_refreshDelayFactor(0.75), m_backoffFactor(1), m_minRefreshDelay(600), + : AbstractMetadataProvider(e), DiscoverableMetadataProvider(e), ReloadableXMLFile(e, Category::getInstance(SAML_LOGCAT".MetadataProvider.XML"), false), + m_object(nullptr), m_discoveryFeed(XMLHelper::getAttrBool(e, true, discoveryFeed)), + m_refreshDelayFactor(0.75), m_backoffFactor(1), + m_minRefreshDelay(XMLHelper::getAttrInt(e, 600, minRefreshDelay)), m_maxRefreshDelay(m_reloadInterval), m_lastValidUntil(SAMLTIME_MAX) { if (!m_local && m_maxRefreshDelay) { - const XMLCh* setting = e ? e->getAttributeNS(nullptr, refreshDelayFactor) : NULL; + const XMLCh* setting = e->getAttributeNS(nullptr, refreshDelayFactor); if (setting && *setting) { auto_ptr_char delay(setting); m_refreshDelayFactor = atof(delay.get()); @@ -110,17 +123,10 @@ XMLMetadataProvider::XMLMetadataProvider(const DOMElement* e) m_refreshDelayFactor = 0.75; } } - setting = e ? e->getAttributeNS(nullptr, minRefreshDelay) : NULL; - if (setting && *setting) { - m_minRefreshDelay = XMLString::parseInt(setting); - if (m_minRefreshDelay == 0) { - m_log.error("invalid minRefreshDelay setting, using default"); - m_minRefreshDelay = 600; - } - else if (m_minRefreshDelay > m_maxRefreshDelay) { - m_log.error("minRefreshDelay setting exceeds maxRefreshDelay/refreshInterval setting, lowering to match it"); - m_minRefreshDelay = m_maxRefreshDelay; - } + + if (m_minRefreshDelay > m_maxRefreshDelay) { + m_log.error("minRefreshDelay setting exceeds maxRefreshDelay/refreshInterval setting, lowering to match it"); + m_minRefreshDelay = m_maxRefreshDelay; } } } @@ -201,6 +207,8 @@ pair XMLMetadataProvider::load(bool backup) m_object = xmlObject.release(); m_lastValidUntil = SAMLTIME_MAX; index(m_lastValidUntil); + if (m_discoveryFeed) + generateFeed(); if (changed) emitChangeEvent(); @@ -253,17 +261,6 @@ pair XMLMetadataProvider::background_load() } } -void XMLMetadataProvider::index(time_t& validUntil) -{ - clearDescriptorIndex(); - EntitiesDescriptor* group=dynamic_cast(m_object); - if (group) { - indexGroup(group, validUntil); - return; - } - indexEntity(dynamic_cast(m_object), validUntil); -} - time_t XMLMetadataProvider::computeNextRefresh() { time_t now = time(nullptr); @@ -291,3 +288,14 @@ time_t XMLMetadataProvider::computeNextRefresh() return ret; } } + +void XMLMetadataProvider::index(time_t& validUntil) +{ + clearDescriptorIndex(); + EntitiesDescriptor* group=dynamic_cast(m_object); + if (group) { + indexGroup(group, validUntil); + return; + } + indexEntity(dynamic_cast(m_object), validUntil); +}