X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fcore%2Fimpl%2FProtocolsImpl.cpp;h=550367c12adac657cf730c5e1c4d5284d64fb20a;hb=1bc8e721db3a50294df852662e1eddcdbdae8f9f;hp=2ea517d9ff31f34059449f00a227b140e9c1e2f5;hpb=fe73576ec05a91b1133a2349c8224414a9fc6416;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml1/core/impl/ProtocolsImpl.cpp b/saml/saml1/core/impl/ProtocolsImpl.cpp index 2ea517d..550367c 100644 --- a/saml/saml1/core/impl/ProtocolsImpl.cpp +++ b/saml/saml1/core/impl/ProtocolsImpl.cpp @@ -22,9 +22,9 @@ #include "internal.h" #include "exceptions.h" +#include "saml1/core/Assertions.h" #include "saml1/core/Protocols.h" -#include #include #include #include @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -43,6 +42,11 @@ 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 ) @@ -56,10 +60,8 @@ namespace opensaml { 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 { @@ -74,10 +76,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()); } @@ -96,13 +95,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 { @@ -124,9 +121,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()); @@ -136,7 +131,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); } }; @@ -156,8 +151,7 @@ namespace opensaml { init(); } - AuthenticationQueryImpl(const AuthenticationQueryImpl& src) - : AbstractXMLObject(src), SubjectQueryImpl(src) { + AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); setAuthenticationMethod(src.getAuthenticationMethod()); } @@ -198,8 +192,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(); @@ -227,7 +220,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); } @@ -256,8 +249,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()) @@ -288,8 +280,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); } @@ -302,7 +294,6 @@ namespace opensaml { class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -331,9 +322,7 @@ namespace opensaml { } RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) - : AbstractXMLObject(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setMinorVersion(src.m_MinorVersion); setRequestID(src.getRequestID()); @@ -348,10 +337,6 @@ namespace opensaml { } } - const XMLCh* getId() const { - return getRequestID(); - } - //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: @@ -371,35 +356,44 @@ 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); - 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); - 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); } 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 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); @@ -424,8 +418,7 @@ namespace opensaml { init(); } - RequestImpl(const RequestImpl& src) - : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { + RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { init(); if (src.getQuery()) setQuery(src.getQuery()->cloneQuery()); @@ -480,9 +473,9 @@ 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); + 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); } }; @@ -490,7 +483,6 @@ namespace opensaml { class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -511,7 +503,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()) @@ -528,7 +520,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); } @@ -540,7 +532,6 @@ namespace opensaml { class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -552,7 +543,7 @@ namespace opensaml { } StatusDetailImpl(const StatusDetailImpl& src) - : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { VectorOf(XMLObject) v=getDetails(); for (vector::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) { if (*i) { @@ -573,7 +564,6 @@ namespace opensaml { class SAML_DLLLOCAL StatusImpl : public virtual Status, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -599,7 +589,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()); @@ -616,9 +606,9 @@ 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); } }; @@ -626,7 +616,6 @@ namespace opensaml { class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType, public AbstractComplexElement, public AbstractDOMCachingXMLObject, - public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { @@ -659,9 +648,7 @@ namespace opensaml { } ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) - : AbstractXMLObject(src), - AbstractDOMCachingXMLObject(src), - AbstractValidatingXMLObject(src) { + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); setMinorVersion(src.m_MinorVersion); setResponseID(src.getResponseID()); @@ -672,10 +659,6 @@ namespace opensaml { setSignature(src.getSignature()->cloneSignature()); } - const XMLCh* getId() const { - return getResponseID(); - } - //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: @@ -695,37 +678,46 @@ 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); - 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); 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 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); @@ -752,8 +744,7 @@ namespace opensaml { init(); } - ResponseImpl(const ResponseImpl& src) - : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) { + ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) { init(); if (src.getStatus()) setStatus(src.getStatus()->cloneStatus()); @@ -774,8 +765,8 @@ namespace opensaml { 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_CHILDREN(Assertion,SAML1_NS,true); ResponseAbstractTypeImpl::processChildElement(childXMLObject,root); } }; @@ -848,7 +839,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);