chLatin_R, chLatin_u, chLatin_l, chLatin_e, chNull
};
+const XMLCh XML::Literals::CaseSensitive[] =
+{ chLatin_C, chLatin_a, chLatin_s, chLatin_e,
+ chLatin_S, chLatin_e, chLatin_n, chLatin_s, chLatin_i, chLatin_t, chLatin_i, chLatin_v, chLatin_e, chNull
+};
+
const XMLCh XML::Literals::Factory[]=
{ chLatin_F, chLatin_a, chLatin_c, chLatin_t, chLatin_o, chLatin_r, chLatin_y, chNull };
const char* getFactory() const { return m_factory.get(); }
const char* getAlias() const { return m_alias.get(); }
const char* getHeader() const { return m_header.get(); }
+ bool getCaseSensitive() const { return m_caseSensitive; }
void apply(const IProvider* originSite, SAMLAttribute& attribute) const;
enum value_type { literal, regexp, xpath };
auto_ptr_char m_factory;
auto_ptr_char m_alias;
auto_ptr_char m_header;
+ bool m_caseSensitive;
value_type toValueType(const DOMElement* e);
bool scopeCheck(const IProvider* originSite, const DOMElement* e) const;
m_header(e->hasAttributeNS(NULL,SHIB_L(Header)) ? e->getAttributeNS(NULL,SHIB_L(Header)) : NULL)
{
- static const XMLCh wTrue[] = {chLatin_t, chLatin_r, chLatin_u, chLatin_e, chNull};
-
m_name=e->getAttributeNS(NULL,SHIB_L(Name));
m_namespace=e->getAttributeNS(NULL,SHIB_L(Namespace));
if (!m_namespace || !*m_namespace)
m_namespace=Constants::SHIB_ATTRIBUTE_NAMESPACE_URI;
+ const XMLCh* caseSensitive=e->getAttributeNS(NULL,SHIB_L(CaseSensitive));
+ m_caseSensitive=(!caseSensitive || !*caseSensitive || *caseSensitive==chDigit_1 || *caseSensitive==chLatin_t);
+
// Check for an AnySite rule.
DOMNode* anysite = e->getFirstChild();
while (anysite && anysite->getNodeType()!=DOMNode::ELEMENT_NODE)
if (valnode && valnode->getNodeType()==DOMNode::TEXT_NODE)
{
const XMLCh* accept=se->getAttributeNS(NULL,SHIB_L(Accept));
- if (!accept || !*accept || *accept==chDigit_1 || !XMLString::compareString(accept,wTrue))
+ if (!accept || !*accept || *accept==chDigit_1 || *accept==chLatin_t)
m_anySiteRule.scopeAccepts.push_back(pair<value_type,const XMLCh*>(toValueType(se),valnode->getNodeValue()));
else
m_anySiteRule.scopeDenials.push_back(pair<value_type,const XMLCh*>(toValueType(se),valnode->getNodeValue()));
if (valnode && valnode->getNodeType()==DOMNode::TEXT_NODE)
{
const XMLCh* accept=se->getAttributeNS(NULL,SHIB_L(Accept));
- if (!accept || *accept==chDigit_1 || !XMLString::compareString(accept,wTrue))
+ if (!accept || !*accept || *accept==chDigit_1 || *accept==chLatin_t)
srule.scopeAccepts.push_back(pair<value_type,const XMLCh*>(toValueType(se),valnode->getNodeValue()));
else
srule.scopeDenials.push_back(pair<value_type,const XMLCh*>(toValueType(se),valnode->getNodeValue()));
return scopeCheck(originSite,e);
}
- for (i=srule->second.valueRules.begin(); bSimple && i!=srule->second.valueRules.end(); i++)
- {
- if ((i->first==literal && !XMLString::compareString(i->second,n->getNodeValue())) ||
- (i->first==regexp && match(i->second,n->getNodeValue())))
- {
- log.debug("matching site, value match");
- return scopeCheck(originSite,e);
+ for (i=srule->second.valueRules.begin(); bSimple && i!=srule->second.valueRules.end(); i++) {
+ switch (i->first) {
+ case literal:
+ if ((m_caseSensitive && !XMLString::compareString(i->second,n->getNodeValue())) ||
+ (!m_caseSensitive && !XMLString::compareIString(i->second,n->getNodeValue()))) {
+ log.debug("matching site, value match");
+ return scopeCheck(originSite,e);
+ }
+ break;
+
+ case regexp:
+ if (match(i->second,n->getNodeValue())) {
+ log.debug("matching site, value match");
+ return scopeCheck(originSite,e);
+ }
+ break;
+
+ case xpath:
+ log.warn("implementation does not support XPath value rules");
+ break;
}
- else if (i->first==xpath)
- log.warn("implementation does not support XPath value rules");
}
if (log.isWarnEnabled())