X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fcore%2Fimpl%2FProtocolsImpl.cpp;h=a28a90552d77882db92572fc2a3cfc698ff8ae39;hb=ecc9f2def78a53386e33f330147b80f3316a4b35;hp=d765e13a1198f158f7d2e69fe2ffeaffafba5f9a;hpb=00238354a95c71fc5a9a7af1b4ec932b5afff6fa;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml1/core/impl/ProtocolsImpl.cpp b/saml/saml1/core/impl/ProtocolsImpl.cpp index d765e13..a28a905 100644 --- a/saml/saml1/core/impl/ProtocolsImpl.cpp +++ b/saml/saml1/core/impl/ProtocolsImpl.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2010 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. */ /** @@ -36,11 +40,13 @@ #include #include +#include +#include +#include +#include #include using namespace opensaml::saml1p; -using namespace opensaml::saml1; -using namespace xmlsignature; using namespace xmltooling; using namespace std; using xmlconstants::XMLSIG_NS; @@ -66,22 +72,24 @@ 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(nullptr) { - } + : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(nullptr) {} RespondWithImpl(const RespondWithImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(nullptr) { - setQName(src.getQName()); + IMPL_CLONE_ATTRIB(QName); // not really an attribute, but it gets the job done } xmltooling::QName* getQName() const { + if (!m_qname && getDOM() && getDOM()->getTextContent()) { + m_qname = XMLHelper::getNodeValueAsQName(getDOM()); + } return m_qname; } @@ -91,8 +99,9 @@ namespace opensaml { auto_ptr_XMLCh temp(m_qname->toString().c_str()); setTextContent(temp.get()); } - else + else { setTextContent(nullptr); + } } IMPL_XMLOBJECT_CLONE(RespondWith); @@ -104,12 +113,11 @@ namespace opensaml { virtual ~QueryImpl() {} QueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { - } + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} QueryImpl(const QueryImpl& src) : AbstractXMLObject(src), AnyElementImpl(src) {} - IMPL_XMLOBJECT_CLONE(Query); + IMPL_XMLOBJECT_CLONE_EX(Query); }; class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery, @@ -123,10 +131,12 @@ namespace opensaml { m_children.push_back(nullptr); m_pos_Subject=m_children.begin(); } + protected: SubjectQueryImpl() { init(); } + public: virtual ~SubjectQueryImpl() {} @@ -138,15 +148,25 @@ namespace opensaml { SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - if (src.getSubject()) - setSubject(src.getSubject()->cloneSubject()); } - IMPL_TYPED_CHILD(Subject); + void _clone(const SubjectQueryImpl& src) { + IMPL_CLONE_TYPED_CHILD(Subject); + } + + SubjectQuery* cloneSubjectQuery() const { + return dynamic_cast(clone()); + } + + Query* cloneQuery() const { + return dynamic_cast(clone()); + } + + IMPL_TYPED_FOREIGN_CHILD(Subject,saml1); protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Subject,SAML1_NS,true); + PROC_TYPED_FOREIGN_CHILD(Subject,saml1,SAML1_NS,true); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } }; @@ -156,28 +176,27 @@ namespace opensaml { void init() { 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); + IMPL_CLONE_ATTRIB(AuthenticationMethod); } + + IMPL_XMLOBJECT_CLONE_EX(AuthenticationQuery); IMPL_STRING_ATTRIB(AuthenticationMethod); protected: @@ -197,36 +216,30 @@ namespace opensaml { void init() { 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(); - 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()); - } - } } - IMPL_XMLOBJECT_CLONE(AttributeQuery); - SubjectQuery* cloneSubjectQuery() const { - return cloneAttributeQuery(); - } - Query* cloneQuery() const { - return cloneAttributeQuery(); + void _clone(const AttributeQueryImpl& src) { + SubjectQueryImpl::_clone(src); + IMPL_CLONE_ATTRIB(Resource); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(AttributeDesignator,saml1); } + + IMPL_XMLOBJECT_CLONE_EX(AttributeQuery); IMPL_STRING_ATTRIB(Resource); - IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end()); + IMPL_TYPED_FOREIGN_CHILDREN(AttributeDesignator,saml1,m_children.end()); protected: void marshallAttributes(DOMElement* domElement) const { @@ -235,7 +248,7 @@ namespace opensaml { } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILDREN(AttributeDesignator,SAML1_NS,true); + PROC_TYPED_FOREIGN_CHILDREN(AttributeDesignator,saml1,SAML1_NS,true); SubjectQueryImpl::processChildElement(childXMLObject,root); } @@ -254,39 +267,32 @@ namespace opensaml { 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(); - 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()); - } - } } - IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery); - SubjectQuery* cloneSubjectQuery() const { - return cloneAuthorizationDecisionQuery(); - } - Query* cloneQuery() const { - return cloneAuthorizationDecisionQuery(); + void _clone(const AuthorizationDecisionQueryImpl& src) { + SubjectQueryImpl::_clone(src); + IMPL_CLONE_ATTRIB(Resource); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Action,saml1); + IMPL_CLONE_TYPED_CHILD(Evidence); } + + IMPL_XMLOBJECT_CLONE_EX(AuthorizationDecisionQuery); IMPL_STRING_ATTRIB(Resource); - IMPL_TYPED_CHILD(Evidence); - IMPL_TYPED_CHILDREN(Action, m_pos_Evidence); + IMPL_TYPED_FOREIGN_CHILDREN(Action,saml1,m_pos_Evidence); + IMPL_TYPED_FOREIGN_CHILD(Evidence,saml1); protected: void marshallAttributes(DOMElement* domElement) const { @@ -295,8 +301,8 @@ namespace opensaml { } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Evidence,SAML1_NS,false); - PROC_TYPED_CHILDREN(Action,SAML1_NS,false); + PROC_TYPED_FOREIGN_CHILD(Evidence,saml1,SAML1_NS,false); + PROC_TYPED_FOREIGN_CHILDREN(Action,saml1,SAML1_NS,false); SubjectQueryImpl::processChildElement(childXMLObject,root); } @@ -320,6 +326,7 @@ namespace opensaml { m_Signature=nullptr; m_pos_Signature=m_children.begin(); } + protected: RequestAbstractTypeImpl() { init(); @@ -339,30 +346,29 @@ namespace opensaml { RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - 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()); - } - } } //IMPL_TYPED_CHILD(Signature); // Need customized setter. + protected: - Signature* m_Signature; + void _clone(const RequestAbstractTypeImpl& src) { + IMPL_CLONE_INTEGER_ATTRIB(MinorVersion); + IMPL_CLONE_ATTRIB(RequestID); + IMPL_CLONE_ATTRIB(IssueInstant); + IMPL_CLONE_TYPED_CHILD(Signature); + IMPL_CLONE_TYPED_CHILDREN(RespondWith); + } + + xmlsignature::Signature* m_Signature; list::iterator m_pos_Signature; + public: - Signature* getSignature() const { + xmlsignature::Signature* getSignature() const { return m_Signature; } - void setSignature(Signature* sig) { + void setSignature(xmlsignature::Signature* sig) { prepareForAssignment(m_Signature,sig); *m_pos_Signature=m_Signature=sig; // Sync content reference back up. @@ -370,6 +376,10 @@ 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 { @@ -418,7 +428,7 @@ namespace opensaml { void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { PROC_TYPED_CHILDREN(RespondWith,SAML1P_NS,false); - PROC_TYPED_CHILD(Signature,XMLSIG_NS,false); + PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } @@ -454,6 +464,7 @@ namespace opensaml { m_pos_Query=m_pos_Signature; ++m_pos_Query; } + public: virtual ~RequestImpl() {} @@ -464,26 +475,16 @@ namespace opensaml { RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) { init(); - 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()); - } - } - 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()); - } - } } - IMPL_XMLOBJECT_CLONE(Request); - RequestAbstractType* cloneRequestAbstractType() const { - return cloneRequest(); + void _clone(const RequestImpl& src) { + RequestAbstractTypeImpl::_clone(src); + IMPL_CLONE_TYPED_CHILD(Query); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(AssertionIDReference,saml1); + IMPL_CLONE_TYPED_CHILDREN(AssertionArtifact); } + + IMPL_XMLOBJECT_CLONE_EX(Request); IMPL_TYPED_CHILD(Query); SubjectQuery* getSubjectQuery() const { @@ -512,13 +513,13 @@ namespace opensaml { setQuery(q); } - IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end()); - IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end()); + IMPL_TYPED_FOREIGN_CHILDREN(AssertionIDReference,saml1,m_children.end()); + IMPL_TYPED_CHILDREN(AssertionArtifact,m_children.end()); protected: void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { PROC_TYPED_CHILD(Query,SAML1P_NS,true); - PROC_TYPED_CHILDREN(AssertionIDReference,SAML1_NS,false); + PROC_TYPED_FOREIGN_CHILDREN(AssertionIDReference,saml1,SAML1_NS,false); PROC_TYPED_CHILDREN(AssertionArtifact,SAML1P_NS,false); RequestAbstractTypeImpl::processChildElement(childXMLObject,root); } @@ -536,6 +537,7 @@ namespace opensaml { m_StatusCode=nullptr; m_pos_StatusCode=m_children.begin(); } + public: virtual ~StatusCodeImpl() { delete m_Value; @@ -549,9 +551,8 @@ namespace opensaml { StatusCodeImpl(const StatusCodeImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setValue(src.getValue()); - if (src.getStatusCode()) - setStatusCode(src.getStatusCode()->cloneStatusCode()); + IMPL_CLONE_ATTRIB(Value); + IMPL_CLONE_TYPED_CHILD(StatusCode); } IMPL_XMLOBJECT_CLONE(StatusCode); @@ -583,14 +584,11 @@ namespace opensaml { virtual ~StatusDetailImpl() {} StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { - } + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} 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_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); } IMPL_XMLOBJECT_CLONE(StatusDetail); @@ -621,6 +619,7 @@ namespace opensaml { m_pos_StatusDetail=m_pos_StatusMessage; ++m_pos_StatusDetail; } + public: virtual ~StatusImpl() {} @@ -632,12 +631,9 @@ namespace opensaml { StatusImpl(const StatusImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - if (src.getStatusCode()) - setStatusCode(src.getStatusCode()->cloneStatusCode()); - if (src.getStatusMessage()) - setStatusMessage(src.getStatusMessage()->cloneStatusMessage()); - if (src.getStatusDetail()) - setStatusDetail(src.getStatusDetail()->cloneStatusDetail()); + IMPL_CLONE_TYPED_CHILD(StatusCode); + IMPL_CLONE_TYPED_CHILD(StatusMessage); + IMPL_CLONE_TYPED_CHILD(StatusDetail); } IMPL_XMLOBJECT_CLONE(Status); @@ -670,10 +666,12 @@ namespace opensaml { m_Signature=nullptr; m_pos_Signature=m_children.begin(); } + protected: ResponseAbstractTypeImpl() { init(); } + public: virtual ~ResponseAbstractTypeImpl() { XMLString::release(&m_MinorVersion); @@ -684,33 +682,35 @@ 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(); - setMinorVersion(src.m_MinorVersion); - setResponseID(src.getResponseID()); - setInResponseTo(src.getInResponseTo()); - setIssueInstant(src.getIssueInstant()); - setRecipient(src.getRecipient()); - if (src.getSignature()) - setSignature(src.getSignature()->cloneSignature()); } //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: - Signature* m_Signature; + void _clone(const ResponseAbstractTypeImpl& src) { + IMPL_CLONE_INTEGER_ATTRIB(MinorVersion); + IMPL_CLONE_ATTRIB(ResponseID); + IMPL_CLONE_ATTRIB(InResponseTo); + IMPL_CLONE_ATTRIB(IssueInstant); + IMPL_CLONE_ATTRIB(Recipient); + IMPL_CLONE_TYPED_CHILD(Signature); + } + + xmlsignature::Signature* m_Signature; list::iterator m_pos_Signature; public: - Signature* getSignature() const { + xmlsignature::Signature* getSignature() const { return m_Signature; } - void setSignature(Signature* sig) { + void setSignature(xmlsignature::Signature* sig) { prepareForAssignment(m_Signature,sig); *m_pos_Signature=m_Signature=sig; // Sync content reference back up. @@ -718,6 +718,10 @@ 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 { @@ -768,7 +772,7 @@ namespace opensaml { } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - PROC_TYPED_CHILD(Signature,XMLSIG_NS,false); + PROC_TYPED_FOREIGN_CHILD(Signature,xmlsignature,XMLSIG_NS,false); AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } @@ -806,30 +810,26 @@ namespace opensaml { 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(); - 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()); - } - } } - IMPL_XMLOBJECT_CLONE(Response); - ResponseAbstractType* cloneResponseAbstractType() const { - return cloneResponse(); + void _clone(const ResponseImpl& src) { + ResponseAbstractTypeImpl::_clone(src); + IMPL_CLONE_TYPED_CHILD(Status); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Assertion,saml1); } + + IMPL_XMLOBJECT_CLONE_EX(Response); IMPL_TYPED_CHILD(Status); IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml1,m_children.end());