[cpp-opensaml] branch master updated: CPPOST-106 Warn on bad inout to a Chaining provider

Rod Widdowson rdw at steadingsoftware.com
Mon Jan 29 10:28:02 EST 2018


This is an automated email from the git hooks/post-receive script.

rdw pushed a commit to branch master
in repository cpp-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=cpp-opensaml.git;a=commit;h=c95a1fd2470c99e50d2c47c11ac6d33062e7b062

The following commit(s) were added to refs/heads/master by this push:
       new  c95a1fd   CPPOST-106 Warn on bad inout to a Chaining provider
c95a1fd is described below

commit c95a1fd2470c99e50d2c47c11ac6d33062e7b062
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Mon Jan 29 15:26:38 2018 +0000

    CPPOST-106 Warn on bad inout to a Chaining provider
    
    https://issues.shibboleth.net/jira/browse/CPPOST-106
    
    Log the name of every child element if it isn't <MetadataProvider>
    Add test for same
---
 .../metadata/impl/ChainingMetadataProvider.cpp     | 39 ++++++++++++----------
 samltest/data/saml2/metadata/BadChain.xml          |  5 +++
 samltest/saml2/metadata/XMLMetadataProviderTest.h  | 18 ++++++++++
 3 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp b/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp
index 3a77bbc..106ce28 100644
--- a/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp
+++ b/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp
@@ -191,27 +191,32 @@ ChainingMetadataProvider::ChainingMetadataProvider(const DOMElement* e)
     if (XMLString::equals(e ? e->getAttributeNS(nullptr, precedence) : nullptr, last))
         m_firstMatch = false;
 
-    e = XMLHelper::getFirstChildElement(e, _MetadataProvider);
+    e = XMLHelper::getFirstChildElement(e);
     while (e) {
-        string t = XMLHelper::getAttrString(e, nullptr, _type);
-        if (!t.empty()) {
-            try {
-                m_log.info("building MetadataProvider of type %s", t.c_str());
-                auto_ptr<MetadataProvider> provider(SAMLConfig::getConfig().MetadataProviderManager.newPlugin(t.c_str(), e));
-                ObservableMetadataProvider* obs = dynamic_cast<ObservableMetadataProvider*>(provider.get());
-                if (obs)
-                    obs->addObserver(this);
-                m_providers.push_back(provider.get());
-                provider.release();
-            }
-            catch (std::exception& ex) {
-                m_log.error("error building MetadataProvider: %s", ex.what());
-            }
+        if (!XMLString::equals(_MetadataProvider, e->getLocalName())) {
+            auto_ptr_char name(e->getLocalName());
+            m_log.error("MetadataProvider child element of type %s ignored", name.get());
         }
         else {
-            m_log.error("MetadataProvider element missing type attribute");
+            string t = XMLHelper::getAttrString(e, nullptr, _type);
+            if (!t.empty()) {
+                try {
+                    m_log.info("building MetadataProvider of type %s", t.c_str());
+                    auto_ptr<MetadataProvider> provider(SAMLConfig::getConfig().MetadataProviderManager.newPlugin(t.c_str(), e));
+                    ObservableMetadataProvider* obs = dynamic_cast<ObservableMetadataProvider*>(provider.get());
+                    if (obs)
+                        obs->addObserver(this);
+                    m_providers.push_back(provider.get());
+                    provider.release();
+                } catch (std::exception& ex) {
+                    m_log.error("error building MetadataProvider: %s", ex.what());
+                }
+            }
+            else {
+                m_log.error("MetadataProvider element missing type attribute");
+            }
         }
-        e = XMLHelper::getNextSiblingElement(e, _MetadataProvider);
+        e = XMLHelper::getNextSiblingElement(e);
     }
 }
 
diff --git a/samltest/data/saml2/metadata/BadChain.xml b/samltest/data/saml2/metadata/BadChain.xml
new file mode 100644
index 0000000..7686f61
--- /dev/null
+++ b/samltest/data/saml2/metadata/BadChain.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MetadataProvider type="Chaining">
+    <MetadataFilter type="Signature" certificate="../../../samltest/data/incommon.pem" />
+    <MetadataFilter type="Signature" certificate="../../../samltest/data/incommon.pem" />
+</MetadataProvider>
diff --git a/samltest/saml2/metadata/XMLMetadataProviderTest.h b/samltest/saml2/metadata/XMLMetadataProviderTest.h
index a14e5fe..02503e4 100644
--- a/samltest/saml2/metadata/XMLMetadataProviderTest.h
+++ b/samltest/saml2/metadata/XMLMetadataProviderTest.h
@@ -75,6 +75,24 @@ public:
         }
     }
 
+    void testBadChain()
+    {
+        string config = data_path + "saml2/metadata/BadChain.xml";
+        ifstream in(config.c_str());
+        DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);
+        XercesJanitor<DOMDocument> janitor(doc);
+
+        auto_ptr<MetadataProvider> metadataProvider(
+            SAMLConfig::getConfig().MetadataProviderManager.newPlugin(CHAINING_METADATA_PROVIDER, doc->getDocumentElement())
+        );
+        try {
+            metadataProvider->init();
+        } catch (XMLToolingException& ex) {
+            TS_TRACE(ex.what());
+            throw;
+        }
+    }
+
     void testXMLProvider() {
         string config = data_path + "saml2/metadata/XMLMetadataProvider.xml";
         ifstream in(config.c_str());

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list