[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