Imported Upstream version 2.2.1+dfsg
[shibboleth/sp.git] / shibsp / attribute / NameIDAttributeDecoder.cpp
index 440fa57..903bc33 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- *  Copyright 2001-2007 Internet2\r
+ *  Copyright 2001-2009 Internet2\r
  *\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
@@ -34,12 +34,18 @@ using namespace xmltooling;
 using namespace std;\r
 \r
 namespace shibsp {\r
-    static XMLCh formatter[] = UNICODE_LITERAL_9(f,o,r,m,a,t,t,e,r);\r
+    static const XMLCh formatter[] = UNICODE_LITERAL_9(f,o,r,m,a,t,t,e,r);\r
+    static const XMLCh defaultQualifiers[] = UNICODE_LITERAL_17(d,e,f,a,u,l,t,Q,u,a,l,i,f,i,e,r,s);\r
 \r
     class SHIBSP_DLLLOCAL NameIDAttributeDecoder : virtual public AttributeDecoder\r
     {\r
     public:\r
-        NameIDAttributeDecoder(const DOMElement* e) : AttributeDecoder(e), m_formatter(e ? e->getAttributeNS(NULL,formatter) : NULL) {}\r
+        NameIDAttributeDecoder(const DOMElement* e)\r
+                : AttributeDecoder(e), m_formatter(e ? e->getAttributeNS(NULL, formatter) : NULL), m_defaultQualifiers(false) {\r
+            const XMLCh* flag = e ? e->getAttributeNS(NULL, defaultQualifiers) : NULL;\r
+            if (flag && (*flag == chLatin_t || *flag == chDigit_1))\r
+                m_defaultQualifiers = true;\r
+        }\r
         ~NameIDAttributeDecoder() {}\r
 \r
         shibsp::Attribute* decode(\r
@@ -54,6 +60,7 @@ namespace shibsp {
             const NameIdentifier* n, vector<NameIDAttribute::Value>& dest, const char* assertingParty, const char* relyingParty\r
             ) const;\r
         auto_ptr_char m_formatter;\r
+        bool m_defaultQualifiers;\r
     };\r
 \r
     AttributeDecoder* SHIBSP_DLLLOCAL NameIDAttributeDecoderFactory(const DOMElement* const & e)\r
@@ -69,7 +76,6 @@ shibsp::Attribute* NameIDAttributeDecoder::decode(
     auto_ptr<NameIDAttribute> nameid(\r
         new NameIDAttribute(ids, (m_formatter.get() && *m_formatter.get()) ? m_formatter.get() : DEFAULT_NAMEID_FORMATTER)\r
         );\r
-    nameid->setCaseSensitive(m_caseSensitive);\r
     vector<NameIDAttribute::Value>& dest = nameid->getValues();\r
     vector<XMLObject*>::const_iterator v,stop;\r
 \r
@@ -131,7 +137,7 @@ shibsp::Attribute* NameIDAttributeDecoder::decode(
             }\r
         }\r
 \r
-        return dest.empty() ? NULL : nameid.release();\r
+        return dest.empty() ? NULL : _decode(nameid.release());\r
     }\r
 \r
     const NameIDType* saml2name = dynamic_cast<const NameIDType*>(xmlObject);\r
@@ -160,7 +166,7 @@ shibsp::Attribute* NameIDAttributeDecoder::decode(
         }\r
     }\r
 \r
-    return dest.empty() ? NULL : nameid.release();\r
+    return dest.empty() ? NULL : _decode(nameid.release());\r
 }\r
 \r
 void NameIDAttributeDecoder::extract(\r
@@ -181,14 +187,14 @@ void NameIDAttributeDecoder::extract(
         str = toUTF8(n->getNameQualifier());\r
         if (str && *str)\r
             val.m_NameQualifier = str;\r
-        else if (assertingParty)\r
+        else if (m_defaultQualifiers && assertingParty)\r
             val.m_NameQualifier = assertingParty;\r
         delete[] str;\r
 \r
         str = toUTF8(n->getSPNameQualifier());\r
         if (str && *str)\r
             val.m_SPNameQualifier = str;\r
-        else if (relyingParty)\r
+        else if (m_defaultQualifiers && relyingParty)\r
             val.m_SPNameQualifier = relyingParty;\r
         delete[] str;\r
 \r
@@ -218,11 +224,11 @@ void NameIDAttributeDecoder::extract(
         str = toUTF8(n->getNameQualifier());\r
         if (str && *str)\r
             val.m_NameQualifier = str;\r
-        else if (assertingParty)\r
+        else if (m_defaultQualifiers && assertingParty)\r
             val.m_NameQualifier = assertingParty;\r
         delete[] str;\r
 \r
-        if (relyingParty)\r
+        if (m_defaultQualifiers && relyingParty)\r
             val.m_SPNameQualifier = relyingParty;\r
     }\r
 }\r