From 5d891740d8a50c7e987d8b5c79bcd8e6f0b2c2ce Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Tue, 2 Jun 2009 21:05:42 +0000 Subject: [PATCH] https://issues.shibboleth.net/jira/browse/SSPCPP-209 --- shibsp/attribute/NameIDAttributeDecoder.cpp | 17 ++++++++++++----- .../attribute/NameIDFromScopedAttributeDecoder.cpp | 21 +++++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/shibsp/attribute/NameIDAttributeDecoder.cpp b/shibsp/attribute/NameIDAttributeDecoder.cpp index aa257e1..38ad01c 100644 --- a/shibsp/attribute/NameIDAttributeDecoder.cpp +++ b/shibsp/attribute/NameIDAttributeDecoder.cpp @@ -35,11 +35,17 @@ using namespace std; namespace shibsp { static const XMLCh formatter[] = UNICODE_LITERAL_9(f,o,r,m,a,t,t,e,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); class SHIBSP_DLLLOCAL NameIDAttributeDecoder : virtual public AttributeDecoder { public: - NameIDAttributeDecoder(const DOMElement* e) : AttributeDecoder(e), m_formatter(e ? e->getAttributeNS(NULL,formatter) : NULL) {} + NameIDAttributeDecoder(const DOMElement* e) + : AttributeDecoder(e), m_formatter(e ? e->getAttributeNS(NULL, formatter) : NULL), m_defaultQualifiers(false) { + const XMLCh* flag = e ? e->getAttributeNS(NULL, defaultQualifiers) : NULL; + if (flag && (*flag == chLatin_t || *flag == chDigit_1)) + m_defaultQualifiers = true; + } ~NameIDAttributeDecoder() {} shibsp::Attribute* decode( @@ -54,6 +60,7 @@ namespace shibsp { const NameIdentifier* n, vector& dest, const char* assertingParty, const char* relyingParty ) const; auto_ptr_char m_formatter; + bool m_defaultQualifiers; }; AttributeDecoder* SHIBSP_DLLLOCAL NameIDAttributeDecoderFactory(const DOMElement* const & e) @@ -181,14 +188,14 @@ void NameIDAttributeDecoder::extract( str = toUTF8(n->getNameQualifier()); if (str && *str) val.m_NameQualifier = str; - else if (assertingParty) + else if (m_defaultQualifiers && assertingParty) val.m_NameQualifier = assertingParty; delete[] str; str = toUTF8(n->getSPNameQualifier()); if (str && *str) val.m_SPNameQualifier = str; - else if (relyingParty) + else if (m_defaultQualifiers && relyingParty) val.m_SPNameQualifier = relyingParty; delete[] str; @@ -218,11 +225,11 @@ void NameIDAttributeDecoder::extract( str = toUTF8(n->getNameQualifier()); if (str && *str) val.m_NameQualifier = str; - else if (assertingParty) + else if (m_defaultQualifiers && assertingParty) val.m_NameQualifier = assertingParty; delete[] str; - if (relyingParty) + if (m_defaultQualifiers && relyingParty) val.m_SPNameQualifier = relyingParty; } } diff --git a/shibsp/attribute/NameIDFromScopedAttributeDecoder.cpp b/shibsp/attribute/NameIDFromScopedAttributeDecoder.cpp index 5711419..611bd5f 100644 --- a/shibsp/attribute/NameIDFromScopedAttributeDecoder.cpp +++ b/shibsp/attribute/NameIDFromScopedAttributeDecoder.cpp @@ -34,20 +34,28 @@ using namespace xmltooling; using namespace std; namespace shibsp { - static XMLCh format[] = UNICODE_LITERAL_6(f,o,r,m,a,t); - static XMLCh formatter[] = UNICODE_LITERAL_9(f,o,r,m,a,t,t,e,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); + static const XMLCh format[] = UNICODE_LITERAL_6(f,o,r,m,a,t); + static const XMLCh formatter[] = UNICODE_LITERAL_9(f,o,r,m,a,t,t,e,r); static const XMLCh Scope[] = UNICODE_LITERAL_5(S,c,o,p,e); static const XMLCh scopeDelimeter[] = UNICODE_LITERAL_14(s,c,o,p,e,D,e,l,i,m,e,t,e,r); class SHIBSP_DLLLOCAL NameIDFromScopedAttributeDecoder : virtual public AttributeDecoder { public: - NameIDFromScopedAttributeDecoder(const DOMElement* e) : AttributeDecoder(e), m_delimeter('@'), - m_format(e ? e->getAttributeNS(NULL,format) : NULL), m_formatter(e ? e->getAttributeNS(NULL,formatter) : NULL) { + NameIDFromScopedAttributeDecoder(const DOMElement* e) + : AttributeDecoder(e), + m_delimeter('@'), + m_format(e ? e->getAttributeNS(NULL,format) : NULL), + m_formatter(e ? e->getAttributeNS(NULL,formatter) : NULL), + m_defaultQualifiers(false) { if (e && e->hasAttributeNS(NULL,scopeDelimeter)) { auto_ptr_char d(e->getAttributeNS(NULL,scopeDelimeter)); m_delimeter = *(d.get()); } + const XMLCh* flag = e ? e->getAttributeNS(NULL, defaultQualifiers) : NULL; + if (flag && (*flag == chLatin_t || *flag == chDigit_1)) + m_defaultQualifiers = true; } ~NameIDFromScopedAttributeDecoder() {} @@ -59,6 +67,7 @@ namespace shibsp { char m_delimeter; auto_ptr_char m_format; auto_ptr_char m_formatter; + bool m_defaultQualifiers; }; AttributeDecoder* SHIBSP_DLLLOCAL NameIDFromScopedAttributeDecoderFactory(const DOMElement* const & e) @@ -135,9 +144,9 @@ shibsp::Attribute* NameIDFromScopedAttributeDecoder::decode( destval.m_Name = val; if (m_format.get() && *m_format.get()) destval.m_Format = m_format.get(); - if (assertingParty) + if (m_defaultQualifiers && assertingParty) destval.m_NameQualifier = assertingParty; - if (relyingParty) + if (m_defaultQualifiers && relyingParty) destval.m_SPNameQualifier = relyingParty; } else { -- 2.1.4