+DiscoverableMetadataProvider::DiscoverableMetadataProvider(const DOMElement* e) : MetadataProvider(e), m_legacyOrgNames(false)
+{
+ static const XMLCh legacyOrgNames[] = UNICODE_LITERAL_14(l,e,g,a,c,y,O,r,g,N,a,m,e,s);
+ static const XMLCh matcher[] = UNICODE_LITERAL_7(m,a,t,c,h,e,r);
+ static const XMLCh tagsInFeed[] = UNICODE_LITERAL_10(t,a,g,s,I,n,F,e,e,d);
+ static const XMLCh _type[] = UNICODE_LITERAL_4(t,y,p,e);
+ static const XMLCh DiscoveryFilter[] = UNICODE_LITERAL_15(D,i,s,c,o,v,e,r,y,F,i,l,t,e,r);
+
+ m_legacyOrgNames = XMLHelper::getAttrBool(e, false, legacyOrgNames);
+ m_entityAttributes = XMLHelper::getAttrBool(e, false, tagsInFeed);
+
+ e = e ? XMLHelper::getFirstChildElement(e, DiscoveryFilter) : nullptr;
+ while (e) {
+ string t(XMLHelper::getAttrString(e, nullptr, _type));
+ if (t == "Whitelist" || t == "Blacklist") {
+ string m(XMLHelper::getAttrString(e, nullptr, matcher));
+ if (!m.empty()) {
+ try {
+ boost::shared_ptr<EntityMatcher> temp(SAMLConfig::getConfig().EntityMatcherManager.newPlugin(m, e));
+ m_discoFilters.push_back(make_pair(t == "Whitelist", temp));
+ }
+ catch (std::exception& ex) {
+ Category::getInstance(SAML_LOGCAT".MetadataProvider.Discoverable").error(
+ "exception creating <DiscoveryFilter> EntityMatcher: %s", ex.what()
+ );
+ }
+ }
+ else {
+ Category::getInstance(SAML_LOGCAT".MetadataProvider.Discoverable").error("<DiscoveryFilter> requires matcher attribute");
+ }
+ }
+ else {
+ Category::getInstance(SAML_LOGCAT".MetadataProvider.Discoverable").error(
+ "unknown <DiscoveryFilter> type (%s)", t.empty() ? "none" : t.c_str()
+ );
+ }
+ e = XMLHelper::getNextSiblingElement(e, DiscoveryFilter);
+ }
+}
+
+DiscoverableMetadataProvider::~DiscoverableMetadataProvider()
+{
+}
+
+void DiscoverableMetadataProvider::generateFeed()
+{
+ m_feed.erase();
+ bool first = true;
+ const XMLObject* object = getMetadata();
+ discoGroup(m_feed, dynamic_cast<const EntitiesDescriptor*>(object), first);
+ discoEntity(m_feed, dynamic_cast<const EntityDescriptor*>(object), first);
+
+ SAMLConfig::getConfig().generateRandomBytes(m_feedTag, 4);
+ m_feedTag = SAMLArtifact::toHex(m_feedTag);
+}
+
+string DiscoverableMetadataProvider::getCacheTag() const
+{
+ return m_feedTag;
+}
+
+void DiscoverableMetadataProvider::outputFeed(ostream& os, bool& first, bool wrapArray) const
+{
+ if (wrapArray)
+ os << '[';
+ if (!m_feed.empty()) {
+ if (first)
+ first = false;
+ else
+ os << ",\n";
+ os << m_feed;
+ }
+ if (wrapArray)
+ os << "\n]";
+}
+