X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fcore%2Fimpl%2FProtocolsImpl.cpp;h=dc4098688f62d0e4a17dc3f269e64822733353ed;hb=f3a43f14f9dd53428f9e879bb489d6a4cf2674a8;hp=fd2b330c0d541e8a343966c63526963c38a50862;hpb=281aabda625a6b66a6c0b04c81390fe2907753ae;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml1/core/impl/ProtocolsImpl.cpp b/saml/saml1/core/impl/ProtocolsImpl.cpp index fd2b330..dc40986 100644 --- a/saml/saml1/core/impl/ProtocolsImpl.cpp +++ b/saml/saml1/core/impl/ProtocolsImpl.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Internet2 + * Copyright 2001-2007 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,26 +22,29 @@ #include "internal.h" #include "exceptions.h" +#include "saml1/core/Assertions.h" #include "saml1/core/Protocols.h" -#include #include -#include #include #include #include #include #include -#include #include #include +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 ) @@ -49,16 +52,14 @@ using namespace std; #endif namespace opensaml { - namespace saml1 { + 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 AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -73,10 +74,7 @@ namespace opensaml { } RespondWithImpl(const RespondWithImpl& src) - : AbstractXMLObject(src), - AbstractSimpleElement(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src), m_qname(NULL) { + : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(NULL) { setQName(src.getQName()); } @@ -95,13 +93,11 @@ namespace opensaml { } IMPL_XMLOBJECT_CLONE(RespondWith); - IMPL_XMLOBJECT_CONTENT; }; class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -123,9 +119,7 @@ namespace opensaml { } SubjectQueryImpl(const SubjectQueryImpl& src) - : AbstractXMLObject(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); if (src.getSubject()) setSubject(src.getSubject()->cloneSubject()); @@ -135,7 +129,7 @@ namespace opensaml { 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); } }; @@ -155,8 +149,7 @@ namespace opensaml { init(); } - AuthenticationQueryImpl(const AuthenticationQueryImpl& src) - : AbstractXMLObject(src), SubjectQueryImpl(src) { + AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setAuthenticationMethod(src.getAuthenticationMethod()); } @@ -197,8 +190,7 @@ namespace opensaml { init(); } - AttributeQueryImpl(const AttributeQueryImpl& src) - : AbstractXMLObject(src), SubjectQueryImpl(src) { + AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setResource(src.getResource()); VectorOf(AttributeDesignator) v=getAttributeDesignators(); @@ -226,7 +218,7 @@ namespace opensaml { } 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); } @@ -243,7 +235,7 @@ namespace opensaml { m_Evidence=NULL; m_children.push_back(NULL); m_pos_Evidence=m_pos_Subject; - m_pos_Evidence++; + ++m_pos_Evidence; } public: virtual ~AuthorizationDecisionQueryImpl() { @@ -255,8 +247,7 @@ namespace opensaml { init(); } - AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) - : AbstractXMLObject(src), SubjectQueryImpl(src) { + AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setResource(src.getResource()); if (src.getEvidence()) @@ -287,8 +278,8 @@ namespace opensaml { } 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); } @@ -298,15 +289,14 @@ namespace opensaml { } }; - class SAML_DLLLOCAL AbstractRequestImpl : public virtual AbstractRequest, + class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { void init() { - m_MinorVersion=1; + m_MinorVersion=NULL; m_RequestID=NULL; m_IssueInstant=NULL; m_children.push_back(NULL); @@ -314,26 +304,25 @@ namespace opensaml { m_pos_Signature=m_children.begin(); } protected: - AbstractRequestImpl() { + RequestAbstractTypeImpl() { init(); } public: - virtual ~AbstractRequestImpl() { + virtual ~RequestAbstractTypeImpl() { + XMLString::release(&m_MinorVersion); XMLString::release(&m_RequestID); delete m_IssueInstant; } - AbstractRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - AbstractRequestImpl(const AbstractRequestImpl& src) - : AbstractXMLObject(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src) { + RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setMinorVersion(src.getMinorVersion()); + setMinorVersion(src.m_MinorVersion); setRequestID(src.getRequestID()); setIssueInstant(src.getIssueInstant()); if (src.getSignature()) @@ -346,10 +335,6 @@ namespace opensaml { } } - const XMLCh* getId() const { - return getRequestID(); - } - //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: @@ -369,49 +354,68 @@ namespace opensaml { } IMPL_INTEGER_ATTRIB(MinorVersion); - IMPL_STRING_ATTRIB(RequestID); - IMPL_DATETIME_ATTRIB(IssueInstant); + 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); - static const XMLCh ONE[] = { chDigit_1, chNull }; - domElement->setAttributeNS(NULL,MAJORVERSION,ONE); + domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE); + if (!m_MinorVersion) + 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); - if (!m_IssueInstant) - const_cast(this)->m_IssueInstant=new DateTime(time(NULL)); + const_cast(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier(); + domElement->setAttributeNS(NULL, REQUESTID_ATTRIB_NAME, m_RequestID); + if (*m_MinorVersion!=chDigit_0) + domElement->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); + if (!m_IssueInstant) { + const_cast(this)->m_IssueInstantEpoch=time(NULL); + const_cast(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch); + } MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); } 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)) + const_cast(domElement)->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); + } + 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::parseInt(attribute->getValue()) != 1) + 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); } }; - class SAML_DLLLOCAL RequestImpl : public virtual Request, public AbstractRequestImpl + class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl { void init() { m_children.push_back(NULL); m_Query=NULL; m_pos_Query=m_pos_Signature; - m_pos_Query++; + ++m_pos_Query; } public: virtual ~RequestImpl() {} @@ -421,8 +425,7 @@ namespace opensaml { init(); } - RequestImpl(const RequestImpl& src) - : AbstractXMLObject(src), AbstractRequestImpl(src) { + RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { init(); if (src.getQuery()) setQuery(src.getQuery()->cloneQuery()); @@ -441,7 +444,7 @@ namespace opensaml { } IMPL_XMLOBJECT_CLONE(Request); - AbstractRequest* cloneAbstractRequest() const { + RequestAbstractType* cloneRequestAbstractType() const { return cloneRequest(); } IMPL_TYPED_CHILD(Query); @@ -477,17 +480,16 @@ namespace opensaml { 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); - AbstractRequestImpl::processChildElement(childXMLObject,root); + 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); } }; class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -508,7 +510,7 @@ namespace opensaml { } StatusCodeImpl(const StatusCodeImpl& src) - : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setValue(src.getValue()); if (src.getStatusCode()) @@ -525,7 +527,7 @@ namespace opensaml { } 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); } @@ -537,7 +539,6 @@ namespace opensaml { class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -549,28 +550,24 @@ namespace opensaml { } StatusDetailImpl(const StatusDetailImpl& src) - : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(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()); - } - } + : 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); } }; class SAML_DLLLOCAL StatusImpl : public virtual Status, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -582,10 +579,10 @@ namespace opensaml { m_pos_StatusCode=m_children.begin(); m_StatusMessage=NULL; m_pos_StatusMessage=m_pos_StatusCode; - m_pos_StatusMessage++; + ++m_pos_StatusMessage; m_StatusDetail=NULL; m_pos_StatusDetail=m_pos_StatusMessage; - m_pos_StatusDetail++; + ++m_pos_StatusDetail; } public: virtual ~StatusImpl() {} @@ -596,7 +593,7 @@ namespace opensaml { } StatusImpl(const StatusImpl& src) - : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); if (src.getStatusCode()) setStatusCode(src.getStatusCode()->cloneStatusCode()); @@ -613,22 +610,21 @@ namespace opensaml { 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); } }; - class SAML_DLLLOCAL AbstractResponseImpl : public virtual AbstractResponse, + class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { void init() { - m_MinorVersion=1; + m_MinorVersion=NULL; m_ResponseID=NULL; m_InResponseTo=NULL; m_IssueInstant=NULL; @@ -638,28 +634,27 @@ namespace opensaml { m_pos_Signature=m_children.begin(); } protected: - AbstractResponseImpl() { + ResponseAbstractTypeImpl() { init(); } public: - virtual ~AbstractResponseImpl() { + virtual ~ResponseAbstractTypeImpl() { + XMLString::release(&m_MinorVersion); XMLString::release(&m_ResponseID); XMLString::release(&m_InResponseTo); XMLString::release(&m_Recipient); delete m_IssueInstant; } - AbstractResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } - AbstractResponseImpl(const AbstractResponseImpl& src) - : AbstractXMLObject(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src) { + ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setMinorVersion(src.getMinorVersion()); + setMinorVersion(src.m_MinorVersion); setResponseID(src.getResponseID()); setInResponseTo(src.getInResponseTo()); setIssueInstant(src.getIssueInstant()); @@ -668,10 +663,6 @@ namespace opensaml { setSignature(src.getSignature()->cloneSignature()); } - const XMLCh* getId() const { - return getResponseID(); - } - //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: @@ -691,53 +682,72 @@ namespace opensaml { } IMPL_INTEGER_ATTRIB(MinorVersion); - IMPL_STRING_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); + 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); - static const XMLCh ONE[] = { chDigit_1, chNull }; - domElement->setAttributeNS(NULL,MAJORVERSION,ONE); + domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE); + if (!m_MinorVersion) + 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); + const_cast(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier(); + domElement->setAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, m_ResponseID); + if (*m_MinorVersion!=chDigit_0) + domElement->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL); - if (!m_IssueInstant) - const_cast(this)->m_IssueInstant=new DateTime(time(NULL)); + if (!m_IssueInstant) { + const_cast(this)->m_IssueInstantEpoch=time(NULL); + const_cast(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch); + } MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL); } 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)) + const_cast(domElement)->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); + } + 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::parseInt(attribute->getValue()) != 1) + 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); } }; - class SAML_DLLLOCAL ResponseImpl : public virtual Response, public AbstractResponseImpl + class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl { void init() { m_children.push_back(NULL); m_Status=NULL; m_pos_Status=m_pos_Signature; - m_pos_Status++; + ++m_pos_Status; } public: virtual ~ResponseImpl() {} @@ -747,13 +757,12 @@ namespace opensaml { init(); } - ResponseImpl(const ResponseImpl& src) - : AbstractXMLObject(src), AbstractResponseImpl(src) { + 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()); } @@ -761,17 +770,17 @@ namespace opensaml { } IMPL_XMLOBJECT_CLONE(Response); - AbstractResponse* cloneAbstractResponse() const { + 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); - AbstractResponseImpl::processChildElement(childXMLObject,root); + PROC_TYPED_CHILD(Status,SAML1P_NS,false); + PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml1,SAML1_NS,true); + ResponseAbstractTypeImpl::processChildElement(childXMLObject,root); } }; @@ -797,14 +806,18 @@ IMPL_XMLOBJECTBUILDER(StatusDetail); IMPL_XMLOBJECTBUILDER(StatusMessage); // Unicode literals -const XMLCh AbstractRequest::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n); -const XMLCh AbstractRequest::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D); -const XMLCh AbstractRequest::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t); -const XMLCh AbstractResponse::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n); -const XMLCh AbstractResponse::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D); -const XMLCh AbstractResponse::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t); -const XMLCh AbstractResponse::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o); -const XMLCh AbstractResponse::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t); +const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull}; +const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e); +const XMLCh RequestAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n); +const XMLCh RequestAbstractType::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D); +const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t); +const XMLCh ResponseAbstractType::LOCAL_NAME[] = {chNull}; +const XMLCh ResponseAbstractType::TYPE_NAME[] = UNICODE_LITERAL_20(R,e,s,p,o,n,s,e,A,b,s,t,r,a,c,t,T,y,p,e); +const XMLCh ResponseAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n); +const XMLCh ResponseAbstractType::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D); +const XMLCh ResponseAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t); +const XMLCh ResponseAbstractType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o); +const XMLCh ResponseAbstractType::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t); const XMLCh AssertionArtifact::LOCAL_NAME[] = UNICODE_LITERAL_17(A,s,s,e,r,t,i,o,n,A,r,t,i,f,a,c,t); const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y); const XMLCh AttributeQuery::TYPE_NAME[] = UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,Q,u,e,r,y,T,y,p,e); @@ -839,7 +852,7 @@ const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(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); +QName StatusCode::SUCCESS(SAML1P_NS,_SUCCESS,SAML1P_PREFIX); +QName StatusCode::REQUESTER(SAML1P_NS,_REQUESTER,SAML1P_PREFIX); +QName StatusCode::RESPONDER(SAML1P_NS,_RESPONDER,SAML1P_PREFIX); +QName StatusCode::VERSIONMISMATCH(SAML1P_NS,_VERSIONMISMATCH,SAML1P_PREFIX);