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=6986b9dd0d1a041463871b3726185fc16ff32002;hp=86c9601c9e5f90bbc2600feac705863037af6ea4;hb=1462057b3b9ae7e165d34d988e30b14c213672ca;hpb=3f107084066988f951c36f1671d5ef5b19e498a1 diff --git a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp index 86c9601..6986b9d 100644 --- a/saml/saml2/metadata/impl/XMLMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/XMLMetadataProvider.cpp @@ -71,57 +71,13 @@ namespace opensaml { shutdown(); } - void init() { - try { - if (!m_id.empty()) { - string threadid("["); - threadid += m_id + ']'; - logging::NDC::push(threadid); - } - background_load(); - startup(); - } - catch (...) { - startup(); - if (!m_id.empty()) { - logging::NDC::pop(); - } - throw; - } - - if (!m_id.empty()) { - logging::NDC::pop(); - } - } + void init(); const char* getId() const { return m_id.c_str(); } - void outputStatus(ostream& os) const { - os << " 0) { - DateTime ts(m_lastUpdate); - ts.parseDateTime(); - auto_ptr_char timestamp(ts.getFormattedString()); - os << " lastUpdate='" << timestamp.get() << "'"; - } - - if (!m_local && m_reloadInterval > 0) { - os << " reloadInterval='" << m_reloadInterval << "'"; - } - - os << "/>"; - } + void outputStatus(ostream& os) const; const XMLObject* getMetadata() const { return m_object.get(); @@ -152,6 +108,29 @@ namespace opensaml { static const XMLCh dropDOM[] = UNICODE_LITERAL_7(d,r,o,p,D,O,M); 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); + + // TODO: need to move this into xmltooling as a utility function + static void xml_encode(ostream& os, const char* start) + { + size_t pos; + while (start && *start) { + pos = strcspn(start, "\"<>&"); + if (pos > 0) { + os.write(start,pos); + start += pos; + } + else { + switch (*start) { + case '"': os << """; break; + case '<': os << "<"; break; + case '>': os << ">"; break; + case '&': os << "&"; break; + default: os << *start; + } + start++; + } + } + } }; }; @@ -161,7 +140,7 @@ namespace opensaml { XMLMetadataProvider::XMLMetadataProvider(const DOMElement* e) : MetadataProvider(e), AbstractMetadataProvider(e), DiscoverableMetadataProvider(e), - ReloadableXMLFile(e, Category::getInstance(SAML_LOGCAT".MetadataProvider.XML"), false), + ReloadableXMLFile(e, Category::getInstance(SAML_LOGCAT ".MetadataProvider.XML"), false), m_discoveryFeed(XMLHelper::getAttrBool(e, true, discoveryFeed)), m_dropDOM(XMLHelper::getAttrBool(e, true, dropDOM)), m_refreshDelayFactor(0.75), m_backoffFactor(1), @@ -186,6 +165,30 @@ XMLMetadataProvider::XMLMetadataProvider(const DOMElement* e) } } +void XMLMetadataProvider::init() +{ + try { + if (!m_id.empty()) { + string threadid("["); + threadid += m_id + ']'; + logging::NDC::push(threadid); + } + background_load(); + startup(); + } + catch (...) { + startup(); + if (!m_id.empty()) { + logging::NDC::pop(); + } + throw; + } + + if (!m_id.empty()) { + logging::NDC::pop(); + } +} + pair XMLMetadataProvider::load(bool backup) { if (!backup) { @@ -213,7 +216,7 @@ pair XMLMetadataProvider::load(bool backup) SchemaValidators.validate(xmlObject.get()); } catch (std::exception& ex) { - m_log.error("metadata intance failed manual validation checking: %s", ex.what()); + m_log.error("metadata instance failed manual validation checking: %s", ex.what()); throw MetadataException("Metadata instance failed manual validation checking."); } @@ -313,14 +316,16 @@ pair XMLMetadataProvider::background_load() return load(true); throw; } - catch (std::exception&) { + catch (std::exception& ex) { if (!m_local) { m_reloadInterval = m_minRefreshDelay * m_backoffFactor++; if (m_reloadInterval > m_maxRefreshDelay) m_reloadInterval = m_maxRefreshDelay; m_log.warn("adjusted reload interval to %u seconds", m_reloadInterval); - if (!m_loaded && !m_backing.empty()) + if (!m_loaded && !m_backing.empty()) { + m_log.warn("trying backup file, exception loading remote resource: %s", ex.what()); return load(true); + } } throw; } @@ -364,3 +369,29 @@ void XMLMetadataProvider::index(time_t& validUntil) } indexEntity(dynamic_cast(m_object.get()), validUntil); } + +void XMLMetadataProvider::outputStatus(ostream& os) const +{ + os << " 0) { + DateTime ts(m_lastUpdate); + ts.parseDateTime(); + auto_ptr_char timestamp(ts.getFormattedString()); + os << " lastUpdate='" << timestamp.get() << "'"; + } + + if (!m_local && m_reloadInterval > 0) { + os << " reloadInterval='" << m_reloadInterval << "'"; + } + + os << "/>"; +}