[cpp-opensaml COMMIT] /branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp

noreply at shibboleth.net noreply at shibboleth.net
Wed Feb 29 20:17:00 GMT 2012


Author: scantor
Date: Wed Feb 29 20:17:00 2012
New Revision: 716

URL: http://svn.shibboleth.net/view/cpp-opensaml?rev=716&view=rev
Log:
Simpler config and regex support in entity matcher

Modified:
    branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp

Modified: branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp
URL: http://svn.shibboleth.net/view/cpp-opensaml/branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp?rev=716&r1=715&r2=716&view=diff
==============================================================================
--- branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp (original)
+++ branches/REL_2/saml/saml2/metadata/impl/EntityAttributesEntityMatcher.cpp Wed Feb 29 20:17:00 2012
@@ -28,17 +28,21 @@
 #include "saml2/metadata/EntityMatcher.h"
 #include "saml2/metadata/Metadata.h"
 
+#include <boost/scoped_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/iterator/indirect_iterator.hpp>
 #include <boost/lambda/bind.hpp>
 #include <boost/lambda/casts.hpp>
 #include <boost/lambda/lambda.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/regx/RegularExpression.hpp>
+#include <xmltooling/logging.h>
 #include <xmltooling/util/XMLHelper.h>
 
 using namespace opensaml::saml2md;
 using namespace opensaml::saml2;
 using namespace opensaml;
+using namespace xmltooling::logging;
 using namespace xmltooling;
 using namespace boost::lambda;
 using namespace boost;
@@ -66,7 +70,12 @@
             return new EntityAttributesEntityMatcher(e);
         }
 
-        static const XMLCh trimTags[] = UNICODE_LITERAL_8(t,r,i,m,T,a,g,s);
+        static const XMLCh attributeName[] =        UNICODE_LITERAL_13(a,t,t,r,i,b,u,t,e,N,a,m,e);
+        static const XMLCh attributeNameFormat[] =  UNICODE_LITERAL_19(a,t,t,r,i,b,u,t,e,N,a,m,e,F,o,r,m,a,t);
+        static const XMLCh attributeValue[] =       UNICODE_LITERAL_14(a,t,t,r,i,b,u,t,e,V,a,l,u,e);
+        static const XMLCh attributeValueRegex[] =  UNICODE_LITERAL_19(a,t,t,r,i,b,u,t,e,V,a,l,u,e,R,e,g,e,x);
+        static const XMLCh regex[] =                UNICODE_LITERAL_5(r,e,g,e,x);
+        static const XMLCh trimTags[] =             UNICODE_LITERAL_8(t,r,i,m,T,a,g,s);
     };
 };
 
@@ -74,6 +83,25 @@
 EntityAttributesEntityMatcher::EntityAttributesEntityMatcher(const DOMElement* e)
     : m_trimTags(XMLHelper::getAttrBool(e, false, trimTags))
 {
+    // Check for shorthand syntax.
+    if (e && e->hasAttributeNS(nullptr, attributeName) && (e->hasAttributeNS(nullptr, attributeValue) || e->hasAttributeNS(nullptr, attributeValueRegex))) {
+        boost::shared_ptr<Attribute> np(AttributeBuilder::buildAttribute());
+        np->setName(e->getAttributeNS(nullptr, attributeName));
+        np->setNameFormat(e->getAttributeNS(nullptr, attributeNameFormat));
+        auto_ptr<AttributeValue> nval(AttributeValueBuilder::buildAttributeValue());
+        if (e->hasAttributeNS(nullptr, attributeValue)) {
+            nval->setTextContent(e->getAttributeNS(nullptr, attributeValue));
+        }
+        else {
+            nval->setTextContent(e->getAttributeNS(nullptr, attributeValueRegex));
+            // Use as a signal later that the value is a regex.
+            nval->setAttribute(xmltooling::QName(nullptr, regex), xmlconstants::XML_ONE);
+        }
+        np->getAttributeValues().push_back(nval.get());
+        nval.release();
+        m_tags.push_back(np);
+    }
+
     DOMElement* child = XMLHelper::getFirstChildElement(e, samlconstants::SAML20_NS, Attribute::LOCAL_NAME);
     while (child) {
         boost::shared_ptr<XMLObject> obj(AttributeBuilder::buildOneFromElement(child));
@@ -131,6 +159,10 @@
         // Track whether we've found every tag value.
         vector<bool> flags(tagvals.size());
 
+        // Holds the active regex, if any.
+        scoped_ptr<RegularExpression> re;
+        xmltooling::QName regexQName(nullptr, regex);
+
         // Check each attribute/tag in the candidate.
         for (indirect_iterator<vector<Attribute*>::const_iterator> a = make_indirect_iterator(attrs.begin());
                 a != make_indirect_iterator(attrs.end()); ++a) {
@@ -138,16 +170,45 @@
             if (XMLString::equals(a->getName(), tag->getName()) &&
                 (!tag->getNameFormat() || XMLString::equals(tag->getNameFormat(), Attribute::UNSPECIFIED) ||
                     XMLString::equals(tag->getNameFormat(), a->getNameFormat()))) {
+
                 // Check each tag value's simple content for a match.
                 for (vector<XMLObject*>::size_type tagindex = 0; tagindex < tagvals.size(); ++tagindex) {
                     const XMLObject* tagval = tagvals[tagindex];
                     const XMLCh* tagvalstr = (tagval->getDOM()) ? tagval->getDOM()->getTextContent() : tagval->getTextContent();
+                    re.reset();
+
+                    // Check for a regex flag.
+                    if (dynamic_cast<const AttributeExtensibleXMLObject*>(tagval)) {

[... 35 lines stripped ...]


More information about the commits mailing list