X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2Fimpl%2FMetadataProvider.cpp;h=efb923a3306cf12188d7738b127f741d42b7195b;hp=de18ceb60fe34f17342ea4ee8b7eb42e38d05d99;hb=1462057b3b9ae7e165d34d988e30b14c213672ca;hpb=d76fadfe73c89442f328a7540e7b0ae08e0fbae6 diff --git a/saml/saml2/metadata/impl/MetadataProvider.cpp b/saml/saml2/metadata/impl/MetadataProvider.cpp index de18ceb..efb923a 100644 --- a/saml/saml2/metadata/impl/MetadataProvider.cpp +++ b/saml/saml2/metadata/impl/MetadataProvider.cpp @@ -29,6 +29,7 @@ #include "saml2/metadata/MetadataProvider.h" #include +#include #include #include #include @@ -39,6 +40,8 @@ using namespace opensaml::saml2md; using namespace opensaml; using namespace xmltooling::logging; using namespace xmltooling; +using namespace boost::lambda; +using namespace boost; using namespace std; namespace opensaml { @@ -46,12 +49,14 @@ namespace opensaml { SAML_DLLLOCAL PluginManager::Factory XMLMetadataProviderFactory; SAML_DLLLOCAL PluginManager::Factory DynamicMetadataProviderFactory; SAML_DLLLOCAL PluginManager::Factory ChainingMetadataProviderFactory; + SAML_DLLLOCAL PluginManager::Factory FolderMetadataProviderFactory; SAML_DLLLOCAL PluginManager::Factory NullMetadataProviderFactory; SAML_DLLLOCAL PluginManager::Factory BlacklistMetadataFilterFactory; SAML_DLLLOCAL PluginManager::Factory WhitelistMetadataFilterFactory; SAML_DLLLOCAL PluginManager::Factory SignatureMetadataFilterFactory; SAML_DLLLOCAL PluginManager::Factory RequireValidUntilMetadataFilterFactory; SAML_DLLLOCAL PluginManager::Factory EntityRoleMetadataFilterFactory; + SAML_DLLLOCAL PluginManager::Factory EntityAttributesMetadataFilterFactory; }; }; @@ -61,6 +66,7 @@ void SAML_API opensaml::saml2md::registerMetadataProviders() conf.MetadataProviderManager.registerFactory(XML_METADATA_PROVIDER, XMLMetadataProviderFactory); conf.MetadataProviderManager.registerFactory(DYNAMIC_METADATA_PROVIDER, DynamicMetadataProviderFactory); conf.MetadataProviderManager.registerFactory(CHAINING_METADATA_PROVIDER, ChainingMetadataProviderFactory); + conf.MetadataProviderManager.registerFactory(FOLDER_METADATA_PROVIDER, FolderMetadataProviderFactory); conf.MetadataProviderManager.registerFactory(NULL_METADATA_PROVIDER, NullMetadataProviderFactory); } @@ -73,6 +79,8 @@ void SAML_API opensaml::saml2md::registerMetadataFilters() // additional name matching Java code SAMLConfig::getConfig().MetadataFilterManager.registerFactory("RequiredValidUntil", RequireValidUntilMetadataFilterFactory); SAMLConfig::getConfig().MetadataFilterManager.registerFactory(ENTITYROLE_METADATA_FILTER, EntityRoleMetadataFilterFactory); + SAMLConfig::getConfig().MetadataFilterManager.registerFactory(ENTITYATTR_METADATA_FILTER, EntityAttributesMetadataFilterFactory); + } static const XMLCh _MetadataFilter[] = UNICODE_LITERAL_14(M,e,t,a,d,a,t,a,F,i,l,t,e,r); @@ -81,14 +89,14 @@ static const XMLCh Whitelist[] = UNICODE_LITERAL_23(W,h,i,t,e,l,i,s,t,M,e static const XMLCh SigFilter[] = UNICODE_LITERAL_23(S,i,g,n,a,t,u,r,e,M,e,t,a,d,a,t,a,F,i,l,t,e,r); static const XMLCh Exclude[] = UNICODE_LITERAL_7(E,x,c,l,u,d,e); static const XMLCh Include[] = UNICODE_LITERAL_7(I,n,c,l,u,d,e); -static const XMLCh type[] = UNICODE_LITERAL_4(t,y,p,e); +static const XMLCh _type[] = UNICODE_LITERAL_4(t,y,p,e); -MetadataProvider::MetadataProvider(const DOMElement* e) +MetadataProvider::MetadataProvider(const DOMElement* e) : m_filterContext(nullptr) { #ifdef _DEBUG NDC ndc("MetadataProvider"); #endif - Category& log = Category::getInstance(SAML_LOGCAT".Metadata"); + Category& log = Category::getInstance(SAML_LOGCAT ".Metadata"); SAMLConfig& conf = SAMLConfig::getConfig(); // Locate any default recognized filters and plugins. @@ -96,10 +104,15 @@ MetadataProvider::MetadataProvider(const DOMElement* e) DOMElement* child = XMLHelper::getFirstChildElement(e); while (child) { if (XMLString::equals(child->getLocalName(), _MetadataFilter)) { - string t = XMLHelper::getAttrString(child, nullptr, type); + string t = XMLHelper::getAttrString(child, nullptr, _type); if (!t.empty()) { log.info("building MetadataFilter of type %s", t.c_str()); - m_filters.push_back(conf.MetadataFilterManager.newPlugin(t.c_str(), child)); + auto_ptr np(conf.MetadataFilterManager.newPlugin(t.c_str(), child)); + m_filters.push_back(np.get()); + np.release(); + } + else { + log.error("MetadataFilter element missing type attribute"); } } else if (XMLString::equals(child->getLocalName(), SigFilter)) { @@ -127,14 +140,12 @@ MetadataProvider::MetadataProvider(const DOMElement* e) } catch (XMLToolingException& ex) { log.error("caught exception while installing filters: %s", ex.what()); - for_each(m_filters.begin(),m_filters.end(),xmltooling::cleanup()); throw; } } MetadataProvider::~MetadataProvider() { - for_each(m_filters.begin(), m_filters.end(), xmltooling::cleanup()); } const char* MetadataProvider::getId() const @@ -149,24 +160,24 @@ void MetadataProvider::addMetadataFilter(MetadataFilter* newFilter) MetadataFilter* MetadataProvider::removeMetadataFilter(MetadataFilter* oldFilter) { - for (vector::iterator i=m_filters.begin(); i!=m_filters.end(); i++) { - if (oldFilter==(*i)) { - m_filters.erase(i); - return oldFilter; - } + ptr_vector::iterator i = find_if(m_filters.begin(), m_filters.end(), (&_1 == oldFilter)); + if (i != m_filters.end()) { + return m_filters.release(i).release(); } return nullptr; } +void MetadataProvider::setContext(const MetadataFilterContext* ctx) +{ + m_filterContext = ctx; +} + void MetadataProvider::doFilters(XMLObject& xmlObject) const { -#ifdef _DEBUG - NDC ndc("doFilters"); -#endif - Category& log=Category::getInstance(SAML_LOGCAT".Metadata"); - for (std::vector::const_iterator i=m_filters.begin(); i!=m_filters.end(); i++) { - log.info("applying metadata filter (%s)", (*i)->getId()); - (*i)->doFilter(xmlObject); + Category& log = Category::getInstance(SAML_LOGCAT ".Metadata"); + for (ptr_vector::const_iterator i = m_filters.begin(); i != m_filters.end(); i++) { + log.info("applying metadata filter (%s)", i->getId()); + i->doFilter(m_filterContext, xmlObject); } } @@ -206,13 +217,13 @@ MetadataProvider::Criteria::~Criteria() void MetadataProvider::Criteria::reset() { - entityID_unicode=nullptr; - entityID_ascii=nullptr; - artifact=nullptr; - role=nullptr; - protocol=nullptr; - protocol2=nullptr; - validOnly=true; + entityID_unicode = nullptr; + entityID_ascii = nullptr; + artifact = nullptr; + role = nullptr; + protocol = nullptr; + protocol2 = nullptr; + validOnly = true; } MetadataFilter::MetadataFilter() @@ -222,3 +233,22 @@ MetadataFilter::MetadataFilter() MetadataFilter::~MetadataFilter() { } + +void MetadataFilter::doFilter(const MetadataFilterContext* ctx, xmltooling::XMLObject& xmlObject) const +{ + // Default call into deprecated method. + doFilter(xmlObject); +} + +void MetadataFilter::doFilter(xmltooling::XMLObject& xmlObject) const +{ + // Empty default for deprecated method. +} + +MetadataFilterContext::MetadataFilterContext() +{ +} + +MetadataFilterContext::~MetadataFilterContext() +{ +}