X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=saml%2Fsaml1%2Fcore%2Fimpl%2FProtocolsImpl.cpp;h=badec51e9271bd1027496f5ee37e4e277e4aa4a9;hb=e3441d806df3147cbe2554a7febf2a58d821c504;hp=1ed52c79937c772c716605016181d585306df062;hpb=335291aa66a9f8eae1a4604aa3502ccc948841e9;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml1/core/impl/ProtocolsImpl.cpp b/saml/saml1/core/impl/ProtocolsImpl.cpp index 1ed52c7..badec51 100644 --- a/saml/saml1/core/impl/ProtocolsImpl.cpp +++ b/saml/saml1/core/impl/ProtocolsImpl.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2001-2006 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. * You may obtain a copy of the License at @@ -16,21 +16,23 @@ /** * ProtocolsImpl.cpp - * - * Implementation classes for SAML 1.x Protocols schema + * + * Implementation classes for SAML 1.x Protocols schema. */ #include "internal.h" #include "exceptions.h" +#include "saml1/core/Assertions.h" #include "saml1/core/Protocols.h" +#include "signature/ContentReference.h" -#include #include -#include #include #include #include #include +#include +#include #include #include @@ -38,10 +40,14 @@ using namespace opensaml::saml1p; using namespace opensaml::saml1; -using namespace opensaml; using namespace xmlsignature; using namespace xmltooling; using namespace std; +using xmlconstants::XMLSIG_NS; +using xmlconstants::XML_ONE; +using samlconstants::SAML1P_NS; +using samlconstants::SAML1_NS; +using samlconstants::SAML1P_PREFIX; #if defined (_MSC_VER) #pragma warning( push ) @@ -50,37 +56,36 @@ using namespace std; namespace opensaml { namespace saml1p { - + DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact); DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage); class SAML_DLLLOCAL RespondWithImpl : public virtual RespondWith, - protected AbstractSimpleElement, - public AbstractChildlessElement, + public AbstractSimpleElement, public AbstractDOMCachingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { - QName* m_qname; + xmltooling::QName* m_qname; public: virtual ~RespondWithImpl() { delete m_qname; } - - RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) { } - + RespondWithImpl(const RespondWithImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(NULL) { setQName(src.getQName()); } - - QName* getQName() const { + + xmltooling::QName* getQName() const { return m_qname; } - - void setQName(const QName* qname) { + + void setQName(const xmltooling::QName* qname) { m_qname=prepareForAssignment(m_qname,qname); if (m_qname) { auto_ptr_XMLCh temp(m_qname->toString().c_str()); @@ -89,9 +94,22 @@ namespace opensaml { else setTextContent(NULL); } - + IMPL_XMLOBJECT_CLONE(RespondWith); - IMPL_XMLOBJECT_CONTENT; + }; + + class SAML_DLLLOCAL QueryImpl : public virtual Query, public AnyElementImpl + { + public: + virtual ~QueryImpl() {} + + QueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + } + + QueryImpl(const QueryImpl& src) : AbstractXMLObject(src), AnyElementImpl(src) {} + + IMPL_XMLOBJECT_CLONE(Query); }; class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, @@ -111,23 +129,24 @@ namespace opensaml { } public: virtual ~SubjectQueryImpl() {} - - SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - - SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { + + SubjectQueryImpl(const SubjectQueryImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); if (src.getSubject()) setSubject(src.getSubject()->cloneSubject()); } - + IMPL_TYPED_CHILD(Subject); - + protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true); + PROC_TYPED_CHILD(Subject,SAML1_NS,true); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } }; @@ -141,17 +160,17 @@ namespace opensaml { virtual ~AuthenticationQueryImpl() { XMLString::release(&m_AuthenticationMethod); } - - AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - + AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setAuthenticationMethod(src.getAuthenticationMethod()); } - + IMPL_XMLOBJECT_CLONE(AuthenticationQuery); SubjectQuery* cloneSubjectQuery() const { return cloneAuthenticationQuery(); @@ -160,13 +179,13 @@ namespace opensaml { return cloneAuthenticationQuery(); } IMPL_STRING_ATTRIB(AuthenticationMethod); - + protected: void marshallAttributes(DOMElement* domElement) const { MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL); SubjectQueryImpl::marshallAttributes(domElement); } - + void processAttribute(const DOMAttr* attribute) { PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL); SubjectQueryImpl::processAttribute(attribute); @@ -182,12 +201,12 @@ namespace opensaml { virtual ~AttributeQueryImpl() { XMLString::release(&m_Resource); } - - AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - + AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setResource(src.getResource()); @@ -198,7 +217,7 @@ namespace opensaml { } } } - + IMPL_XMLOBJECT_CLONE(AttributeQuery); SubjectQuery* cloneSubjectQuery() const { return cloneAttributeQuery(); @@ -208,18 +227,18 @@ namespace opensaml { } IMPL_STRING_ATTRIB(Resource); IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end()); - + protected: void marshallAttributes(DOMElement* domElement) const { MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL); SubjectQueryImpl::marshallAttributes(domElement); } - + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILDREN(AttributeDesignator,SAMLConstants::SAML1_NS,true); + PROC_TYPED_CHILDREN(AttributeDesignator,SAML1_NS,true); SubjectQueryImpl::processChildElement(childXMLObject,root); } - + void processAttribute(const DOMAttr* attribute) { PROC_STRING_ATTRIB(Resource,RESOURCE,NULL); SubjectQueryImpl::processAttribute(attribute); @@ -239,12 +258,12 @@ namespace opensaml { virtual ~AuthorizationDecisionQueryImpl() { XMLString::release(&m_Resource); } - - AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - + AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setResource(src.getResource()); @@ -257,7 +276,7 @@ namespace opensaml { } } } - + IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery); SubjectQuery* cloneSubjectQuery() const { return cloneAuthorizationDecisionQuery(); @@ -268,19 +287,19 @@ namespace opensaml { IMPL_STRING_ATTRIB(Resource); IMPL_TYPED_CHILD(Evidence); IMPL_TYPED_CHILDREN(Action, m_pos_Evidence); - + protected: void marshallAttributes(DOMElement* domElement) const { MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL); SubjectQueryImpl::marshallAttributes(domElement); } - + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false); - PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false); + PROC_TYPED_CHILD(Evidence,SAML1_NS,false); + PROC_TYPED_CHILDREN(Action,SAML1_NS,false); SubjectQueryImpl::processChildElement(childXMLObject,root); } - + void processAttribute(const DOMAttr* attribute) { PROC_STRING_ATTRIB(Resource,RESOURCE,NULL); SubjectQueryImpl::processAttribute(attribute); @@ -311,13 +330,14 @@ namespace opensaml { XMLString::release(&m_RequestID); delete m_IssueInstant; } - - RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - - RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { + + RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setMinorVersion(src.m_MinorVersion); setRequestID(src.getRequestID()); @@ -331,7 +351,7 @@ namespace opensaml { } } } - + //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: @@ -341,7 +361,7 @@ namespace opensaml { Signature* getSignature() const { return m_Signature; } - + void setSignature(Signature* sig) { prepareForAssignment(m_Signature,sig); *m_pos_Signature=m_Signature=sig; @@ -351,20 +371,34 @@ namespace opensaml { } IMPL_INTEGER_ATTRIB(MinorVersion); - IMPL_ID_ATTRIB(RequestID); + IMPL_STRING_ATTRIB(RequestID); // have to special-case getXMLID + const XMLCh* getXMLID() const { + pair v = getMinorVersion(); + return (!v.first || v.second > 0) ? m_RequestID : NULL; + } + const XMLCh* getID() const { + return getRequestID(); + } IMPL_DATETIME_ATTRIB(IssueInstant,0); IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature); - + protected: void marshallAttributes(DOMElement* domElement) const { static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n); - domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE); + domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE); if (!m_MinorVersion) - const_cast(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE); + const_cast(this)->m_MinorVersion=XMLString::replicate(XML_ONE); MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); if (!m_RequestID) const_cast(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier(); - MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL); + domElement->setAttributeNS(NULL, REQUESTID_ATTRIB_NAME, m_RequestID); + if (*m_MinorVersion!=chDigit_0) { +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + domElement->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME, true); +#else + domElement->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); +#endif + } if (!m_IssueInstant) { const_cast(this)->m_IssueInstantEpoch=time(NULL); const_cast(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch); @@ -373,19 +407,31 @@ namespace opensaml { } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILDREN(RespondWith,SAMLConstants::SAML1P_NS,false); - PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false); + PROC_TYPED_CHILDREN(RespondWith,SAML1P_NS,false); + PROC_TYPED_CHILD(Signature,XMLSIG_NS,false); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } + void unmarshallAttributes(const DOMElement* domElement) { + // Standard processing, but then we check IDness. + AbstractXMLObjectUnmarshaller::unmarshallAttributes(domElement); + if (m_RequestID && (!m_MinorVersion || *m_MinorVersion!=chDigit_0)) { +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + const_cast(domElement)->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME, true); +#else + const_cast(domElement)->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); +#endif + } + } + void processAttribute(const DOMAttr* attribute) { static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n); if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) { - if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE)) + if (!XMLString::equals(attribute->getValue(),XML_ONE)) throw UnmarshallingException("Request has invalid major version."); } PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); - PROC_ID_ATTRIB(RequestID,REQUESTID,NULL); + PROC_STRING_ATTRIB(RequestID,REQUESTID,NULL); PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); } }; @@ -400,12 +446,12 @@ namespace opensaml { } public: virtual ~RequestImpl() {} - - RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - + RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { init(); if (src.getQuery()) @@ -423,13 +469,13 @@ namespace opensaml { } } } - + IMPL_XMLOBJECT_CLONE(Request); RequestAbstractType* cloneRequestAbstractType() const { return cloneRequest(); } IMPL_TYPED_CHILD(Query); - + SubjectQuery* getSubjectQuery() const { return dynamic_cast(getQuery()); } @@ -455,15 +501,15 @@ namespace opensaml { void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) { setQuery(q); } - + IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end()); IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end()); - + protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Query,SAMLConstants::SAML1P_NS,true); - PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false); - PROC_TYPED_CHILDREN(AssertionArtifact,SAMLConstants::SAML1P_NS,false); + PROC_TYPED_CHILD(Query,SAML1P_NS,true); + PROC_TYPED_CHILDREN(AssertionIDReference,SAML1_NS,false); + PROC_TYPED_CHILDREN(AssertionArtifact,SAML1P_NS,false); RequestAbstractTypeImpl::processChildElement(childXMLObject,root); } }; @@ -484,30 +530,31 @@ namespace opensaml { virtual ~StatusCodeImpl() { delete m_Value; } - - StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - - StatusCodeImpl(const StatusCodeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { + + StatusCodeImpl(const StatusCodeImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setValue(src.getValue()); if (src.getStatusCode()) setStatusCode(src.getStatusCode()->cloneStatusCode()); } - + IMPL_XMLOBJECT_CLONE(StatusCode); - IMPL_XMLOBJECT_ATTRIB(Value,QName); + IMPL_XMLOBJECT_ATTRIB(Value,xmltooling::QName); IMPL_TYPED_CHILD(StatusCode); - + protected: void marshallAttributes(DOMElement* domElement) const { MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,true); + PROC_TYPED_CHILD(StatusCode,SAML1P_NS,true); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } @@ -524,26 +571,24 @@ namespace opensaml { { public: virtual ~StatusDetailImpl() {} - - StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { } - - StatusDetailImpl(const StatusDetailImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { - VectorOf(XMLObject) v=getDetails(); - for (vector::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) { - if (*i) { - v.push_back((*i)->clone()); - } - } + + StatusDetailImpl(const StatusDetailImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { + VectorOf(XMLObject) v=getUnknownXMLObjects(); + for (vector::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i) + v.push_back((*i)->clone()); } - + IMPL_XMLOBJECT_CLONE(StatusDetail); - IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end()); - + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - getDetails().push_back(childXMLObject); + getUnknownXMLObjects().push_back(childXMLObject); } }; @@ -568,13 +613,14 @@ namespace opensaml { } public: virtual ~StatusImpl() {} - - StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - - StatusImpl(const StatusImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { + + StatusImpl(const StatusImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); if (src.getStatusCode()) setStatusCode(src.getStatusCode()->cloneStatusCode()); @@ -583,17 +629,17 @@ namespace opensaml { if (src.getStatusDetail()) setStatusDetail(src.getStatusDetail()->cloneStatusDetail()); } - + IMPL_XMLOBJECT_CLONE(Status); IMPL_TYPED_CHILD(StatusCode); IMPL_TYPED_CHILD(StatusMessage); IMPL_TYPED_CHILD(StatusDetail); - + protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,false); - PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML1P_NS,false); - PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML1P_NS,false); + PROC_TYPED_CHILD(StatusCode,SAML1P_NS,false); + PROC_TYPED_CHILD(StatusMessage,SAML1P_NS,false); + PROC_TYPED_CHILD(StatusDetail,SAML1P_NS,false); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } }; @@ -626,13 +672,14 @@ namespace opensaml { XMLString::release(&m_Recipient); delete m_IssueInstant; } - - ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - - ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) { + + ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setMinorVersion(src.m_MinorVersion); setResponseID(src.getResponseID()); @@ -652,7 +699,7 @@ namespace opensaml { Signature* getSignature() const { return m_Signature; } - + void setSignature(Signature* sig) { prepareForAssignment(m_Signature,sig); *m_pos_Signature=m_Signature=sig; @@ -662,21 +709,35 @@ namespace opensaml { } IMPL_INTEGER_ATTRIB(MinorVersion); - IMPL_ID_ATTRIB(ResponseID); + IMPL_STRING_ATTRIB(ResponseID); // have to special-case getXMLID + const XMLCh* getXMLID() const { + pair v = getMinorVersion(); + return (!v.first || v.second > 0) ? m_ResponseID : NULL; + } + const XMLCh* getID() const { + return getResponseID(); + } IMPL_STRING_ATTRIB(InResponseTo); IMPL_DATETIME_ATTRIB(IssueInstant,0); IMPL_STRING_ATTRIB(Recipient); - + protected: void marshallAttributes(DOMElement* domElement) const { static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n); - domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE); + domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE); if (!m_MinorVersion) - const_cast(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE); + const_cast(this)->m_MinorVersion=XMLString::replicate(XML_ONE); MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); if (!m_ResponseID) const_cast(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier(); - MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL); + domElement->setAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, m_ResponseID); + if (*m_MinorVersion!=chDigit_0) { +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + domElement->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, true); +#else + domElement->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); +#endif + } MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL); if (!m_IssueInstant) { const_cast(this)->m_IssueInstantEpoch=time(NULL); @@ -687,18 +748,30 @@ namespace opensaml { } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false); + PROC_TYPED_CHILD(Signature,XMLSIG_NS,false); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } + void unmarshallAttributes(const DOMElement* domElement) { + // Standard processing, but then we check IDness. + AbstractXMLObjectUnmarshaller::unmarshallAttributes(domElement); + if (m_ResponseID && (!m_MinorVersion || *m_MinorVersion!=chDigit_0)) { +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + const_cast(domElement)->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, true); +#else + const_cast(domElement)->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); +#endif + } + } + void processAttribute(const DOMAttr* attribute) { static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n); if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) { - if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE)) + if (!XMLString::equals(attribute->getValue(),XML_ONE)) throw UnmarshallingException("Response has invalid major version."); } PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); - PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL); + PROC_STRING_ATTRIB(ResponseID,RESPONSEID,NULL); PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL); PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL); @@ -715,35 +788,35 @@ namespace opensaml { } public: virtual ~ResponseImpl() {} - - ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + + ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - + ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) { init(); if (src.getStatus()) setStatus(src.getStatus()->cloneStatus()); - VectorOf(Assertion) v=getAssertions(); - for (vector::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) { + VectorOf(saml1::Assertion) v=getAssertions(); + for (vector::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) { if (*i) { v.push_back((*i)->cloneAssertion()); } } } - + IMPL_XMLOBJECT_CLONE(Response); ResponseAbstractType* cloneResponseAbstractType() const { return cloneResponse(); } IMPL_TYPED_CHILD(Status); - IMPL_TYPED_CHILDREN(Assertion, m_children.end()); - + IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml1,m_children.end()); + protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Status,SAMLConstants::SAML1P_NS,false); - PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true); + PROC_TYPED_CHILD(Status,SAML1P_NS,false); + PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml1,SAML1_NS,true); ResponseAbstractTypeImpl::processChildElement(childXMLObject,root); } }; @@ -761,6 +834,7 @@ IMPL_XMLOBJECTBUILDER(AssertionArtifact); IMPL_XMLOBJECTBUILDER(AttributeQuery); IMPL_XMLOBJECTBUILDER(AuthenticationQuery); IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery); +IMPL_XMLOBJECTBUILDER(Query); IMPL_XMLOBJECTBUILDER(Request); IMPL_XMLOBJECTBUILDER(RespondWith); IMPL_XMLOBJECTBUILDER(Response); @@ -815,8 +889,8 @@ const XMLCh _SUCCESS[] = UNICODE_LITERAL_7(S, const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r); const XMLCh _RESPONDER[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r); const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h); - -QName StatusCode::SUCCESS(SAMLConstants::SAML1P_NS,_SUCCESS,SAMLConstants::SAML1P_PREFIX); -QName StatusCode::REQUESTER(SAMLConstants::SAML1P_NS,_REQUESTER,SAMLConstants::SAML1P_PREFIX); -QName StatusCode::RESPONDER(SAMLConstants::SAML1P_NS,_RESPONDER,SAMLConstants::SAML1P_PREFIX); -QName StatusCode::VERSIONMISMATCH(SAMLConstants::SAML1P_NS,_VERSIONMISMATCH,SAMLConstants::SAML1P_PREFIX); + +xmltooling::QName StatusCode::SUCCESS(SAML1P_NS,_SUCCESS,SAML1P_PREFIX); +xmltooling::QName StatusCode::REQUESTER(SAML1P_NS,_REQUESTER,SAML1P_PREFIX); +xmltooling::QName StatusCode::RESPONDER(SAML1P_NS,_RESPONDER,SAML1P_PREFIX); +xmltooling::QName StatusCode::VERSIONMISMATCH(SAML1P_NS,_VERSIONMISMATCH,SAML1P_PREFIX);