X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=blobdiff_plain;f=saml%2Fsaml1%2Fcore%2Fimpl%2FProtocolsImpl.cpp;h=b9aa3a7a7f7bf092a8cc6dc647e19e6d960d739e;hp=6d8bb4e626695a00752d095575f13b6b98c1b9ee;hb=208928133db000b055b99fcbabc245295adb0d48;hpb=60dec4389c6f9ff4207819bb1978177214acc008 diff --git a/saml/saml1/core/impl/ProtocolsImpl.cpp b/saml/saml1/core/impl/ProtocolsImpl.cpp index 6d8bb4e..b9aa3a7 100644 --- a/saml/saml1/core/impl/ProtocolsImpl.cpp +++ b/saml/saml1/core/impl/ProtocolsImpl.cpp @@ -1,38 +1,46 @@ -/* - * Copyright 2001-2009 Internet2 +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. * - * 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 + * UCAID licenses this file to you 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 * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. */ /** * 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 using namespace opensaml::saml1p; @@ -63,22 +71,25 @@ namespace opensaml { public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller { - xmltooling::QName* m_qname; + mutable xmltooling::QName* m_qname; public: virtual ~RespondWithImpl() { delete m_qname; } RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) { + : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(nullptr) { } RespondWithImpl(const RespondWithImpl& src) - : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(NULL) { + : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(nullptr) { setQName(src.getQName()); } xmltooling::QName* getQName() const { + if (!m_qname && getDOM() && getDOM()->getTextContent()) { + m_qname = XMLHelper::getNodeValueAsQName(getDOM()); + } return m_qname; } @@ -88,8 +99,9 @@ namespace opensaml { auto_ptr_XMLCh temp(m_qname->toString().c_str()); setTextContent(temp.get()); } - else - setTextContent(NULL); + else { + setTextContent(nullptr); + } } IMPL_XMLOBJECT_CLONE(RespondWith); @@ -106,7 +118,7 @@ namespace opensaml { QueryImpl(const QueryImpl& src) : AbstractXMLObject(src), AnyElementImpl(src) {} - IMPL_XMLOBJECT_CLONE(Query); + IMPL_XMLOBJECT_CLONE_EX(Query); }; class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, @@ -116,14 +128,16 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Subject=NULL; - m_children.push_back(NULL); + m_Subject=nullptr; + m_children.push_back(nullptr); m_pos_Subject=m_children.begin(); } + protected: SubjectQueryImpl() { init(); } + public: virtual ~SubjectQueryImpl() {} @@ -135,10 +149,21 @@ namespace opensaml { SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); + } + + void _clone(const SubjectQueryImpl& src) { if (src.getSubject()) setSubject(src.getSubject()->cloneSubject()); } + SubjectQuery* cloneSubjectQuery() const { + return dynamic_cast(clone()); + } + + Query* cloneQuery() const { + return dynamic_cast(clone()); + } + IMPL_TYPED_CHILD(Subject); protected: @@ -151,40 +176,39 @@ namespace opensaml { class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl { void init() { - m_AuthenticationMethod=NULL; + m_AuthenticationMethod=nullptr; } + public: virtual ~AuthenticationQueryImpl() { XMLString::release(&m_AuthenticationMethod); } AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, 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(); - } - Query* cloneQuery() const { - return cloneAuthenticationQuery(); + void _clone(const AuthenticationQueryImpl& src) { + SubjectQueryImpl::_clone(src); + setAuthenticationMethod(src.getAuthenticationMethod()); } + + IMPL_XMLOBJECT_CLONE_EX(AuthenticationQuery); IMPL_STRING_ATTRIB(AuthenticationMethod); protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL); + MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,nullptr); SubjectQueryImpl::marshallAttributes(domElement); } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL); + PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,nullptr); SubjectQueryImpl::processAttribute(attribute); } }; @@ -192,42 +216,40 @@ namespace opensaml { class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl { void init() { - m_Resource=NULL; + m_Resource=nullptr; } + public: virtual ~AttributeQueryImpl() { XMLString::release(&m_Resource); } AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); + } + + void _clone(const AttributeQueryImpl& src) { + SubjectQueryImpl::_clone(src); setResource(src.getResource()); - VectorOf(AttributeDesignator) v=getAttributeDesignators(); for (vector::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) { if (*i) { - v.push_back((*i)->cloneAttributeDesignator()); + getAttributeDesignators().push_back((*i)->cloneAttributeDesignator()); } } } - IMPL_XMLOBJECT_CLONE(AttributeQuery); - SubjectQuery* cloneSubjectQuery() const { - return cloneAttributeQuery(); - } - Query* cloneQuery() const { - return cloneAttributeQuery(); - } + IMPL_XMLOBJECT_CLONE_EX(AttributeQuery); IMPL_STRING_ATTRIB(Resource); IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end()); protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL); + MARSHALL_STRING_ATTRIB(Resource,RESOURCE,nullptr); SubjectQueryImpl::marshallAttributes(domElement); } @@ -237,7 +259,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Resource,RESOURCE,NULL); + PROC_STRING_ATTRIB(Resource,RESOURCE,nullptr); SubjectQueryImpl::processAttribute(attribute); } }; @@ -245,49 +267,47 @@ namespace opensaml { class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl { void init() { - m_Resource=NULL; - m_Evidence=NULL; - m_children.push_back(NULL); + m_Resource=nullptr; + m_Evidence=nullptr; + m_children.push_back(nullptr); m_pos_Evidence=m_pos_Subject; ++m_pos_Evidence; } + public: virtual ~AuthorizationDecisionQueryImpl() { XMLString::release(&m_Resource); } AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) { init(); + } + + void _clone(const AuthorizationDecisionQueryImpl& src) { + SubjectQueryImpl::_clone(src); setResource(src.getResource()); if (src.getEvidence()) setEvidence(src.getEvidence()->cloneEvidence()); - VectorOf(Action) v=getActions(); for (vector::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) { if (*i) { - v.push_back((*i)->cloneAction()); + getActions().push_back((*i)->cloneAction()); } } } - IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery); - SubjectQuery* cloneSubjectQuery() const { - return cloneAuthorizationDecisionQuery(); - } - Query* cloneQuery() const { - return cloneAuthorizationDecisionQuery(); - } + IMPL_XMLOBJECT_CLONE_EX(AuthorizationDecisionQuery); 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); + MARSHALL_STRING_ATTRIB(Resource,RESOURCE,nullptr); SubjectQueryImpl::marshallAttributes(domElement); } @@ -298,7 +318,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Resource,RESOURCE,NULL); + PROC_STRING_ATTRIB(Resource,RESOURCE,nullptr); SubjectQueryImpl::processAttribute(attribute); } }; @@ -310,13 +330,14 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_MinorVersion=NULL; - m_RequestID=NULL; - m_IssueInstant=NULL; - m_children.push_back(NULL); - m_Signature=NULL; + m_MinorVersion=nullptr; + m_RequestID=nullptr; + m_IssueInstant=nullptr; + m_children.push_back(nullptr); + m_Signature=nullptr; m_pos_Signature=m_children.begin(); } + protected: RequestAbstractTypeImpl() { init(); @@ -336,24 +357,28 @@ namespace opensaml { RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); + } + + //IMPL_TYPED_CHILD(Signature); + // Need customized setter. + + protected: + void _clone(const RequestAbstractTypeImpl& src) { setMinorVersion(src.m_MinorVersion); setRequestID(src.getRequestID()); setIssueInstant(src.getIssueInstant()); if (src.getSignature()) setSignature(src.getSignature()->cloneSignature()); - VectorOf(RespondWith) v=getRespondWiths(); for (vector::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) { if (*i) { - v.push_back((*i)->cloneRespondWith()); + getRespondWiths().push_back((*i)->cloneRespondWith()); } } } - //IMPL_TYPED_CHILD(Signature); - // Need customized setter. - protected: Signature* m_Signature; list::iterator m_pos_Signature; + public: Signature* getSignature() const { return m_Signature; @@ -367,40 +392,54 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } + RequestAbstractType* cloneRequestAbstractType() const { + return dynamic_cast(clone()); + } + IMPL_INTEGER_ATTRIB(MinorVersion); 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; + return (!v.first || v.second > 0) ? m_RequestID : nullptr; } const XMLCh* getID() const { return getRequestID(); } + void releaseDOM() const { + if (getDOM()) + getDOM()->removeAttributeNS(nullptr, REQUESTID_ATTRIB_NAME); + AbstractDOMCachingXMLObject::releaseDOM(); + } IMPL_DATETIME_ATTRIB(IssueInstant,0); IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature); protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + 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,XML_ONE); + domElement->setAttributeNS(nullptr,MAJORVERSION,XML_ONE); if (!m_MinorVersion) const_cast(this)->m_MinorVersion=XMLString::replicate(XML_ONE); - MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); + MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr); if (!m_RequestID) const_cast(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier(); - domElement->setAttributeNS(NULL, REQUESTID_ATTRIB_NAME, m_RequestID); + domElement->setAttributeNS(nullptr, REQUESTID_ATTRIB_NAME, m_RequestID); if (*m_MinorVersion!=chDigit_0) { -#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE - domElement->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME, true); +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + domElement->setIdAttributeNS(nullptr, REQUESTID_ATTRIB_NAME, true); #else - domElement->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); + domElement->setIdAttributeNS(nullptr, REQUESTID_ATTRIB_NAME); #endif } if (!m_IssueInstant) { - const_cast(this)->m_IssueInstantEpoch=time(NULL); + const_cast(this)->m_IssueInstantEpoch=time(nullptr); const_cast(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch); } - MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); + MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -413,34 +452,35 @@ namespace opensaml { // 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); +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + const_cast(domElement)->setIdAttributeNS(nullptr, REQUESTID_ATTRIB_NAME, true); #else - const_cast(domElement)->setIdAttributeNS(NULL, REQUESTID_ATTRIB_NAME); + const_cast(domElement)->setIdAttributeNS(nullptr, 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 (XMLHelper::isNodeNamed(attribute,nullptr,MAJORVERSION)) { if (!XMLString::equals(attribute->getValue(),XML_ONE)) throw UnmarshallingException("Request has invalid major version."); } - PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); - PROC_STRING_ATTRIB(RequestID,REQUESTID,NULL); - PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); + PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr); + PROC_STRING_ATTRIB(RequestID,REQUESTID,nullptr); + PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr); } }; class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl { void init() { - m_children.push_back(NULL); - m_Query=NULL; + m_children.push_back(nullptr); + m_Query=nullptr; m_pos_Query=m_pos_Signature; ++m_pos_Query; } + public: virtual ~RequestImpl() {} @@ -451,26 +491,25 @@ namespace opensaml { RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { init(); + } + + void _clone(const RequestImpl& src) { + RequestAbstractTypeImpl::_clone(src); if (src.getQuery()) setQuery(src.getQuery()->cloneQuery()); - VectorOf(AssertionIDReference) v=getAssertionIDReferences(); for (vector::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) { if (*i) { - v.push_back((*i)->cloneAssertionIDReference()); + getAssertionIDReferences().push_back((*i)->cloneAssertionIDReference()); } } - VectorOf(AssertionArtifact) v2=getAssertionArtifacts(); for (vector::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) { if (*i) { - v2.push_back((*i)->cloneAssertionArtifact()); + getAssertionArtifacts().push_back((*i)->cloneAssertionArtifact()); } } } - IMPL_XMLOBJECT_CLONE(Request); - RequestAbstractType* cloneRequestAbstractType() const { - return cloneRequest(); - } + IMPL_XMLOBJECT_CLONE_EX(Request); IMPL_TYPED_CHILD(Query); SubjectQuery* getSubjectQuery() const { @@ -518,11 +557,12 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Value=NULL; - m_children.push_back(NULL); - m_StatusCode=NULL; + m_Value=nullptr; + m_children.push_back(nullptr); + m_StatusCode=nullptr; m_pos_StatusCode=m_children.begin(); } + public: virtual ~StatusCodeImpl() { delete m_Value; @@ -547,7 +587,7 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL); + MARSHALL_QNAME_ATTRIB(Value,VALUE,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -556,7 +596,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_QNAME_ATTRIB(Value,VALUE,NULL); + PROC_QNAME_ATTRIB(Value,VALUE,nullptr); } }; @@ -575,9 +615,11 @@ namespace opensaml { 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()); + for (vector::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i) { + if (*i) { + getUnknownXMLObjects().push_back((*i)->clone()); + } + } } IMPL_XMLOBJECT_CLONE(StatusDetail); @@ -596,18 +638,19 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_StatusCode=NULL; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_StatusCode=nullptr; m_pos_StatusCode=m_children.begin(); - m_StatusMessage=NULL; + m_StatusMessage=nullptr; m_pos_StatusMessage=m_pos_StatusCode; ++m_pos_StatusMessage; - m_StatusDetail=NULL; + m_StatusDetail=nullptr; m_pos_StatusDetail=m_pos_StatusMessage; ++m_pos_StatusDetail; } + public: virtual ~StatusImpl() {} @@ -648,19 +691,21 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_MinorVersion=NULL; - m_ResponseID=NULL; - m_InResponseTo=NULL; - m_IssueInstant=NULL; - m_Recipient=NULL; - m_children.push_back(NULL); - m_Signature=NULL; + m_MinorVersion=nullptr; + m_ResponseID=nullptr; + m_InResponseTo=nullptr; + m_IssueInstant=nullptr; + m_Recipient=nullptr; + m_children.push_back(nullptr); + m_Signature=nullptr; m_pos_Signature=m_children.begin(); } + protected: ResponseAbstractTypeImpl() { init(); } + public: virtual ~ResponseAbstractTypeImpl() { XMLString::release(&m_MinorVersion); @@ -671,13 +716,19 @@ namespace opensaml { } ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); + } + + //IMPL_TYPED_CHILD(Signature); + // Need customized setter. + protected: + void _clone(const ResponseAbstractTypeImpl& src) { setMinorVersion(src.m_MinorVersion); setResponseID(src.getResponseID()); setInResponseTo(src.getInResponseTo()); @@ -687,9 +738,6 @@ namespace opensaml { setSignature(src.getSignature()->cloneSignature()); } - //IMPL_TYPED_CHILD(Signature); - // Need customized setter. - protected: Signature* m_Signature; list::iterator m_pos_Signature; public: @@ -705,43 +753,57 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } + ResponseAbstractType* cloneResponseAbstractType() const { + return dynamic_cast(clone()); + } + IMPL_INTEGER_ATTRIB(MinorVersion); 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; + return (!v.first || v.second > 0) ? m_ResponseID : nullptr; } const XMLCh* getID() const { return getResponseID(); } + void releaseDOM() const { + if (getDOM()) + getDOM()->removeAttributeNS(nullptr, RESPONSEID_ATTRIB_NAME); + AbstractDOMCachingXMLObject::releaseDOM(); + } IMPL_STRING_ATTRIB(InResponseTo); IMPL_DATETIME_ATTRIB(IssueInstant,0); IMPL_STRING_ATTRIB(Recipient); protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + 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,XML_ONE); + domElement->setAttributeNS(nullptr,MAJORVERSION,XML_ONE); if (!m_MinorVersion) const_cast(this)->m_MinorVersion=XMLString::replicate(XML_ONE); - MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL); + MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr); if (!m_ResponseID) const_cast(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier(); - domElement->setAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, m_ResponseID); + domElement->setAttributeNS(nullptr, RESPONSEID_ATTRIB_NAME, m_ResponseID); if (*m_MinorVersion!=chDigit_0) { -#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE - domElement->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME, true); +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + domElement->setIdAttributeNS(nullptr, RESPONSEID_ATTRIB_NAME, true); #else - domElement->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); + domElement->setIdAttributeNS(nullptr, RESPONSEID_ATTRIB_NAME); #endif } - MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL); + MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr); if (!m_IssueInstant) { - const_cast(this)->m_IssueInstantEpoch=time(NULL); + const_cast(this)->m_IssueInstantEpoch=time(nullptr); const_cast(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch); } - MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL); - MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL); + MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr); + MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -753,60 +815,61 @@ namespace opensaml { // 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); +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + const_cast(domElement)->setIdAttributeNS(nullptr, RESPONSEID_ATTRIB_NAME, true); #else - const_cast(domElement)->setIdAttributeNS(NULL, RESPONSEID_ATTRIB_NAME); + const_cast(domElement)->setIdAttributeNS(nullptr, 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 (XMLHelper::isNodeNamed(attribute,nullptr,MAJORVERSION)) { if (!XMLString::equals(attribute->getValue(),XML_ONE)) throw UnmarshallingException("Response has invalid major version."); } - PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,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); + PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr); + PROC_STRING_ATTRIB(ResponseID,RESPONSEID,nullptr); + PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,nullptr); + PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr); + PROC_STRING_ATTRIB(Recipient,RECIPIENT,nullptr); } }; class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl { void init() { - m_children.push_back(NULL); - m_Status=NULL; + m_children.push_back(nullptr); + m_Status=nullptr; m_pos_Status=m_pos_Signature; ++m_pos_Status; } + public: virtual ~ResponseImpl() {} ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) { init(); + } + + void _clone(const ResponseImpl& src) { + ResponseAbstractTypeImpl::_clone(src); if (src.getStatus()) setStatus(src.getStatus()->cloneStatus()); - 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()); + getAssertions().push_back((*i)->cloneAssertion()); } } } - IMPL_XMLOBJECT_CLONE(Response); - ResponseAbstractType* cloneResponseAbstractType() const { - return cloneResponse(); - } + IMPL_XMLOBJECT_CLONE_EX(Response); IMPL_TYPED_CHILD(Status); IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml1,m_children.end());