Imported Upstream version 2.3+dfsg
[shibboleth/sp.git] / shibsp / attribute / filtering / impl / AttributeIssuerStringFunctor.cpp
index c2b193f..e4cb12d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2007 Internet2
+ *  Copyright 2001-2009 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "exceptions.h"
 #include "attribute/filtering/FilteringContext.h"
 #include "attribute/filtering/FilterPolicyContext.h"
+#include "attribute/filtering/MatchFunctor.h"
 
 namespace shibsp {
 
     static const XMLCh value[] = UNICODE_LITERAL_5(v,a,l,u,e);
+    static const XMLCh ignoreCase[] = UNICODE_LITERAL_10(i,g,n,o,r,e,C,a,s,e);
 
     /**
      * A match function that matches the attribute issuer's name against the specified value.
@@ -35,19 +37,25 @@ namespace shibsp {
     class SHIBSP_DLLLOCAL AttributeIssuerStringFunctor : public MatchFunctor
     {
         const XMLCh* m_value;
+        bool m_ignoreCase;
     public:
         AttributeIssuerStringFunctor(const DOMElement* e) {
             m_value = e ? e->getAttributeNS(NULL,value) : NULL;
             if (!m_value || !*m_value)
                 throw ConfigurationException("AttributeIssuerString MatchFunctor requires non-empty value attribute.");
+            const XMLCh* flag = e ? e->getAttributeNS(NULL,ignoreCase) : NULL;
+            m_ignoreCase = (flag && (*flag == chLatin_t || *flag == chDigit_1)); 
         }
 
         bool evaluatePolicyRequirement(const FilteringContext& filterContext) const {
-            return XMLString::equals(m_value, filterContext.getAttributeIssuer());
+            if (m_ignoreCase)
+                return (XMLString::compareIString(m_value, filterContext.getAttributeIssuer()) == 0);
+            else
+                return XMLString::equals(m_value, filterContext.getAttributeIssuer());
         }
 
         bool evaluatePermitValue(const FilteringContext& filterContext, const Attribute& attribute, size_t index) const {
-            return XMLString::equals(m_value, filterContext.getAttributeIssuer());
+            return evaluatePolicyRequirement(filterContext);
         }
     };