X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2Fimpl%2FMetadataImpl.cpp;h=89f39e8655fd08311bc53f75a0d687aa1fb8f47f;hb=ecc9f2def78a53386e33f330147b80f3316a4b35;hp=cc23134b5612e56ac97441383e46cf9ef5b0ff56;hpb=a0dad5b716c44b374f7ca34e48e76287ebeec1da;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml2/metadata/impl/MetadataImpl.cpp b/saml/saml2/metadata/impl/MetadataImpl.cpp index cc23134..89f39e8 100644 --- a/saml/saml2/metadata/impl/MetadataImpl.cpp +++ b/saml/saml2/metadata/impl/MetadataImpl.cpp @@ -1,45 +1,57 @@ -/* - * Copyright 2001-2007 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. */ /** * MetadataImpl.cpp * - * Implementation classes for SAML 2.0 Assertions schema + * Implementation classes for SAML 2.0 Metadata schema. */ #include "internal.h" #include "exceptions.h" #include "saml2/metadata/Metadata.h" +#include "signature/ContentReference.h" #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include #include #include +#include +#include +#include #include +#include using namespace samlconstants; using namespace opensaml::saml2md; -using namespace opensaml::saml2; -using namespace opensaml; -using namespace xmlencryption; -using namespace xmlsignature; using namespace xmltooling; using namespace std; using xmlconstants::XMLSIG_NS; @@ -64,6 +76,9 @@ namespace opensaml { DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,ActionNamespace); DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,SourceID); + DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,IPHint); + DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,DomainHint); + DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,GeolocationHint); class SAML_DLLLOCAL localizedNameTypeImpl : public virtual localizedNameType, public AbstractSimpleElement, @@ -72,7 +87,8 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Lang=NULL; + m_Lang=nullptr; + m_LangPrefix=nullptr; } protected: @@ -83,9 +99,10 @@ namespace opensaml { public: virtual ~localizedNameTypeImpl() { XMLString::release(&m_Lang); + XMLString::release(&m_LangPrefix); } - localizedNameTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + localizedNameTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -93,19 +110,36 @@ namespace opensaml { localizedNameTypeImpl(const localizedNameTypeImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) { init(); - setLang(src.getLang()); } - IMPL_XMLOBJECT_CLONE(localizedNameType); - IMPL_STRING_ATTRIB(Lang); + void _clone(const localizedNameTypeImpl& src) { + IMPL_CLONE_FOREIGN_ATTRIB(Lang); + } + + IMPL_XMLOBJECT_CLONE_EX(localizedNameType); + IMPL_XMLOBJECT_FOREIGN_ATTRIB(Lang,XMLCh); protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Lang,LANG,xmlconstants::XML_NS); + if (m_Lang && *m_Lang) { + DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(xmlconstants::XML_NS, LANG_ATTRIB_NAME); + if (m_LangPrefix && *m_LangPrefix) + attr->setPrefix(m_LangPrefix); + else + attr->setPrefix(xmlconstants::XML_PREFIX); + attr->setNodeValue(m_Lang); + domElement->setAttributeNodeNS(attr); + } } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Lang,LANG,xmlconstants::XML_NS); + if (XMLHelper::isNodeNamed(attribute, xmlconstants::XML_NS, LANG_ATTRIB_NAME)) { + setLang(attribute->getValue()); + const XMLCh* temp = attribute->getPrefix(); + if (temp && *temp && !XMLString::equals(temp, xmlconstants::XML_NS)) + m_LangPrefix = XMLString::replicate(temp); + return; + } AbstractXMLObjectUnmarshaller::processAttribute(attribute); } }; @@ -117,7 +151,8 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Lang=NULL; + m_Lang=nullptr; + m_LangPrefix=nullptr; } protected: @@ -128,9 +163,10 @@ namespace opensaml { public: virtual ~localizedURITypeImpl() { XMLString::release(&m_Lang); + XMLString::release(&m_LangPrefix); } - localizedURITypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + localizedURITypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -138,19 +174,36 @@ namespace opensaml { localizedURITypeImpl(const localizedURITypeImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) { init(); - setLang(src.getLang()); } - IMPL_XMLOBJECT_CLONE(localizedURIType); - IMPL_STRING_ATTRIB(Lang); + void _clone(const localizedURITypeImpl& src) { + IMPL_CLONE_FOREIGN_ATTRIB(Lang); + } + + IMPL_XMLOBJECT_CLONE_EX(localizedURIType); + IMPL_XMLOBJECT_FOREIGN_ATTRIB(Lang,XMLCh); protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Lang,LANG,xmlconstants::XML_NS); + if (m_Lang && *m_Lang) { + DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(xmlconstants::XML_NS, LANG_ATTRIB_NAME); + if (m_LangPrefix && *m_LangPrefix) + attr->setPrefix(m_LangPrefix); + else + attr->setPrefix(xmlconstants::XML_PREFIX); + attr->setNodeValue(m_Lang); + domElement->setAttributeNodeNS(attr); + } } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Lang,LANG,xmlconstants::XML_NS); + if (XMLHelper::isNodeNamed(attribute, xmlconstants::XML_NS, LANG_ATTRIB_NAME)) { + setLang(attribute->getValue()); + const XMLCh* temp = attribute->getPrefix(); + if (temp && *temp && !XMLString::equals(temp, xmlconstants::XML_NS)) + m_LangPrefix = XMLString::replicate(temp); + return; + } AbstractXMLObjectUnmarshaller::processAttribute(attribute); } }; @@ -160,15 +213,12 @@ namespace opensaml { public: virtual ~OrganizationNameImpl() {} - OrganizationNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + OrganizationNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} OrganizationNameImpl(const OrganizationNameImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(OrganizationName); - localizedNameType* clonelocalizedNameType() const { - return new OrganizationNameImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(OrganizationName); }; class SAML_DLLLOCAL OrganizationDisplayNameImpl : public virtual OrganizationDisplayName, public localizedNameTypeImpl @@ -176,15 +226,12 @@ namespace opensaml { public: virtual ~OrganizationDisplayNameImpl() {} - OrganizationDisplayNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + OrganizationDisplayNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} OrganizationDisplayNameImpl(const OrganizationDisplayNameImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(OrganizationDisplayName); - localizedNameType* clonelocalizedNameType() const { - return new OrganizationDisplayNameImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(OrganizationDisplayName); }; class SAML_DLLLOCAL OrganizationURLImpl : public virtual OrganizationURL, public localizedURITypeImpl @@ -192,15 +239,12 @@ namespace opensaml { public: virtual ~OrganizationURLImpl() {} - OrganizationURLImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + OrganizationURLImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} OrganizationURLImpl(const OrganizationURLImpl& src) : AbstractXMLObject(src), localizedURITypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(OrganizationURL); - localizedURIType* clonelocalizedURIType() const { - return new OrganizationURLImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(OrganizationURL); }; class SAML_DLLLOCAL ServiceNameImpl : public virtual ServiceName, public localizedNameTypeImpl @@ -208,15 +252,12 @@ namespace opensaml { public: virtual ~ServiceNameImpl() {} - ServiceNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ServiceNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} ServiceNameImpl(const ServiceNameImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(ServiceName); - localizedNameType* clonelocalizedNameType() const { - return new ServiceNameImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(ServiceName); }; class SAML_DLLLOCAL ServiceDescriptionImpl : public virtual ServiceDescription, public localizedNameTypeImpl @@ -224,15 +265,12 @@ namespace opensaml { public: virtual ~ServiceDescriptionImpl() {} - ServiceDescriptionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ServiceDescriptionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} ServiceDescriptionImpl(const ServiceDescriptionImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(ServiceDescription); - localizedNameType* clonelocalizedNameType() const { - return new ServiceDescriptionImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(ServiceDescription); }; class SAML_DLLLOCAL ExtensionsImpl : public virtual Extensions, @@ -244,15 +282,13 @@ namespace opensaml { public: virtual ~ExtensionsImpl() {} - ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ExtensionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { } ExtensionsImpl(const ExtensionsImpl& 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(Extensions); @@ -282,20 +318,21 @@ namespace opensaml { list::iterator m_pos_OrganizationURL; void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Extensions=NULL; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Extensions=nullptr; m_pos_Extensions=m_children.begin(); m_pos_OrganizationDisplayName=m_pos_Extensions; ++m_pos_OrganizationDisplayName; m_pos_OrganizationURL=m_pos_OrganizationDisplayName; ++m_pos_OrganizationURL; } + public: virtual ~OrganizationImpl() {} - OrganizationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + OrganizationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -304,26 +341,10 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - VectorOf(OrganizationName) v=getOrganizationNames(); - for (vector::const_iterator i=src.m_OrganizationNames.begin(); i!=src.m_OrganizationNames.end(); i++) { - if (*i) { - v.push_back((*i)->cloneOrganizationName()); - } - } - VectorOf(OrganizationDisplayName) w=getOrganizationDisplayNames(); - for (vector::const_iterator j=src.m_OrganizationDisplayNames.begin(); j!=src.m_OrganizationDisplayNames.end(); j++) { - if (*j) { - w.push_back((*j)->cloneOrganizationDisplayName()); - } - } - VectorOf(OrganizationURL) x=getOrganizationURLs(); - for (vector::const_iterator k=src.m_OrganizationURLs.begin(); k!=src.m_OrganizationURLs.end(); k++) { - if (*k) { - x.push_back((*k)->cloneOrganizationURL()); - } - } + IMPL_CLONE_TYPED_CHILD(Extensions); + IMPL_CLONE_TYPED_CHILDREN(OrganizationName); + IMPL_CLONE_TYPED_CHILDREN(OrganizationDisplayName); + IMPL_CLONE_TYPED_CHILDREN(OrganizationURL); } IMPL_XMLOBJECT_CLONE(Organization); @@ -360,16 +381,16 @@ namespace opensaml { list::iterator m_pos_TelephoneNumber; void init() { - m_ContactType=NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Extensions=NULL; - m_Company=NULL; - m_GivenName=NULL; - m_SurName=NULL; + m_ContactType=nullptr; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Extensions=nullptr; + m_Company=nullptr; + m_GivenName=nullptr; + m_SurName=nullptr; m_pos_Extensions=m_children.begin(); m_pos_Company=m_pos_Extensions; ++m_pos_Company; @@ -380,12 +401,13 @@ namespace opensaml { m_pos_TelephoneNumber=m_pos_SurName; ++m_pos_TelephoneNumber; } + public: virtual ~ContactPersonImpl() { XMLString::release(&m_ContactType); } - ContactPersonImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ContactPersonImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -394,27 +416,13 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - if (src.getCompany()) - setCompany(src.getCompany()->cloneCompany()); - if (src.getGivenName()) - setGivenName(src.getGivenName()->cloneGivenName()); - if (src.getSurName()) - setSurName(src.getSurName()->cloneSurName()); - - VectorOf(EmailAddress) v=getEmailAddresss(); - for (vector::const_iterator i=src.m_EmailAddresss.begin(); i!=src.m_EmailAddresss.end(); i++) { - if (*i) { - v.push_back((*i)->cloneEmailAddress()); - } - } - VectorOf(TelephoneNumber) w=getTelephoneNumbers(); - for (vector::const_iterator j=src.m_TelephoneNumbers.begin(); j!=src.m_TelephoneNumbers.end(); j++) { - if (*j) { - w.push_back((*j)->cloneTelephoneNumber()); - } - } + IMPL_CLONE_ATTRIB(ContactType); + IMPL_CLONE_TYPED_CHILD(Extensions); + IMPL_CLONE_TYPED_CHILD(Company); + IMPL_CLONE_TYPED_CHILD(GivenName); + IMPL_CLONE_TYPED_CHILD(SurName); + IMPL_CLONE_TYPED_CHILDREN(EmailAddress); + IMPL_CLONE_TYPED_CHILDREN(TelephoneNumber); } IMPL_XMLOBJECT_CLONE(ContactPerson); @@ -426,7 +434,7 @@ namespace opensaml { IMPL_TYPED_CHILDREN(EmailAddress,m_pos_TelephoneNumber); IMPL_TYPED_CHILDREN(TelephoneNumber,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),CONTACTTYPE_ATTRIB_NAME)) { setContactType(value); @@ -438,7 +446,7 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(ContactType,CONTACTTYPE,NULL); + MARSHALL_STRING_ATTRIB(ContactType,CONTACTTYPE,nullptr); marshallExtensionAttributes(domElement); } @@ -464,7 +472,7 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Namespace=NULL; + m_Namespace=nullptr; } public: @@ -472,7 +480,7 @@ namespace opensaml { XMLString::release(&m_Namespace); } - AdditionalMetadataLocationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AdditionalMetadataLocationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -480,6 +488,7 @@ namespace opensaml { AdditionalMetadataLocationImpl(const AdditionalMetadataLocationImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) { init(); + IMPL_CLONE_ATTRIB(Namespace); } IMPL_XMLOBJECT_CLONE(AdditionalMetadataLocation); @@ -487,11 +496,11 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,NULL); + MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,nullptr); } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Namespace,NAMESPACE,NULL); + PROC_STRING_ATTRIB(Namespace,NAMESPACE,nullptr); AbstractXMLObjectUnmarshaller::processAttribute(attribute); } }; @@ -503,17 +512,18 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Use=NULL; - m_KeyInfo=NULL; - m_children.push_back(NULL); + m_Use=nullptr; + m_KeyInfo=nullptr; + m_children.push_back(nullptr); m_pos_KeyInfo=m_children.begin(); } + public: virtual ~KeyDescriptorImpl() { XMLString::release(&m_Use); } - KeyDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + KeyDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -521,15 +531,9 @@ namespace opensaml { KeyDescriptorImpl(const KeyDescriptorImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setUse(src.getUse()); - if (src.getKeyInfo()) - setKeyInfo(src.getKeyInfo()->cloneKeyInfo()); - VectorOf(EncryptionMethod) v=getEncryptionMethods(); - for (vector::const_iterator i=src.m_EncryptionMethods.begin(); i!=src.m_EncryptionMethods.end(); i++) { - if (*i) { - v.push_back((*i)->cloneEncryptionMethod()); - } - } + IMPL_CLONE_ATTRIB(Use); + IMPL_CLONE_TYPED_CHILD(KeyInfo); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption); } IMPL_XMLOBJECT_CLONE(KeyDescriptor); @@ -539,7 +543,7 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Use,USE,NULL); + MARSHALL_STRING_ATTRIB(Use,USE,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -549,7 +553,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_STRING_ATTRIB(Use,USE,NULL); + PROC_STRING_ATTRIB(Use,USE,nullptr); AbstractXMLObjectUnmarshaller::processAttribute(attribute); } }; @@ -562,7 +566,7 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Binding=m_Location=m_ResponseLocation=NULL; + m_Binding=m_Location=m_ResponseLocation=nullptr; } protected: @@ -577,8 +581,9 @@ namespace opensaml { XMLString::release(&m_ResponseLocation); } - EndpointTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + EndpointTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); } EndpointTypeImpl(const EndpointTypeImpl& src) @@ -586,21 +591,23 @@ namespace opensaml { AbstractAttributeExtensibleXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { - setBinding(src.getBinding()); - setLocation(src.getLocation()); - setResponseLocation(src.getResponseLocation()); - VectorOf(XMLObject) v=getUnknownXMLObjects(); - for (vector::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i) - v.push_back((*i)->clone()); + init(); + } + + void _clone(const EndpointTypeImpl& src) { + IMPL_CLONE_ATTRIB(Binding); + IMPL_CLONE_ATTRIB(Location); + IMPL_CLONE_ATTRIB(ResponseLocation); + IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); } - IMPL_XMLOBJECT_CLONE(EndpointType); + IMPL_XMLOBJECT_CLONE_EX(EndpointType); IMPL_STRING_ATTRIB(Binding); IMPL_STRING_ATTRIB(Location); IMPL_STRING_ATTRIB(ResponseLocation); IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),BINDING_ATTRIB_NAME)) { setBinding(value); @@ -619,9 +626,9 @@ namespace opensaml { } protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Binding,BINDING,NULL); - MARSHALL_STRING_ATTRIB(Location,LOCATION,NULL); - MARSHALL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION,NULL); + MARSHALL_STRING_ATTRIB(Binding,BINDING,nullptr); + MARSHALL_STRING_ATTRIB(Location,LOCATION,nullptr); + MARSHALL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION,nullptr); marshallExtensionAttributes(domElement); } @@ -643,7 +650,7 @@ namespace opensaml { class SAML_DLLLOCAL IndexedEndpointTypeImpl : public virtual IndexedEndpointType, public EndpointTypeImpl { void init() { - m_Index=NULL; + m_Index=nullptr; m_isDefault=XML_BOOL_NULL; } @@ -656,23 +663,26 @@ namespace opensaml { XMLString::release(&m_Index); } - IndexedEndpointTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + IndexedEndpointTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); + } IndexedEndpointTypeImpl(const IndexedEndpointTypeImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) { - setIndex(src.m_Index); - isDefault(src.m_isDefault); + init(); } - IMPL_XMLOBJECT_CLONE(IndexedEndpointType); - EndpointType* cloneEndpointType() const { - return new IndexedEndpointTypeImpl(*this); + void _clone(const IndexedEndpointTypeImpl& src) { + EndpointTypeImpl::_clone(src); + IMPL_CLONE_INTEGER_ATTRIB(Index); + IMPL_CLONE_BOOLEAN_ATTRIB(isDefault); } + IMPL_XMLOBJECT_CLONE_EX(IndexedEndpointType); IMPL_INTEGER_ATTRIB(Index); IMPL_BOOLEAN_ATTRIB(isDefault); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),INDEX_ATTRIB_NAME)) { setIndex(value); @@ -688,8 +698,8 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_INTEGER_ATTRIB(Index,INDEX,NULL); - MARSHALL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,NULL); + MARSHALL_INTEGER_ATTRIB(Index,INDEX,nullptr); + MARSHALL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,nullptr); EndpointTypeImpl::marshallAttributes(domElement); } }; @@ -699,18 +709,12 @@ namespace opensaml { public: virtual ~ArtifactResolutionServiceImpl() {} - ArtifactResolutionServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ArtifactResolutionServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} ArtifactResolutionServiceImpl(const ArtifactResolutionServiceImpl& src) : AbstractXMLObject(src), IndexedEndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(ArtifactResolutionService); - IndexedEndpointType* cloneIndexedEndpointType() const { - return new ArtifactResolutionServiceImpl(*this); - } - EndpointType* cloneEndpointType() const { - return new ArtifactResolutionServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(ArtifactResolutionService); }; class SAML_DLLLOCAL SingleLogoutServiceImpl : public virtual SingleLogoutService, public EndpointTypeImpl @@ -718,15 +722,12 @@ namespace opensaml { public: virtual ~SingleLogoutServiceImpl() {} - SingleLogoutServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + SingleLogoutServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} SingleLogoutServiceImpl(const SingleLogoutServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(SingleLogoutService); - EndpointType* cloneEndpointType() const { - return new SingleLogoutServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(SingleLogoutService); }; class SAML_DLLLOCAL ManageNameIDServiceImpl : public virtual ManageNameIDService, public EndpointTypeImpl @@ -734,15 +735,12 @@ namespace opensaml { public: virtual ~ManageNameIDServiceImpl() {} - ManageNameIDServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + ManageNameIDServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} ManageNameIDServiceImpl(const ManageNameIDServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(ManageNameIDService); - EndpointType* cloneEndpointType() const { - return new ManageNameIDServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(ManageNameIDService); }; class SAML_DLLLOCAL SingleSignOnServiceImpl : public virtual SingleSignOnService, public EndpointTypeImpl @@ -750,15 +748,12 @@ namespace opensaml { public: virtual ~SingleSignOnServiceImpl() {} - SingleSignOnServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + SingleSignOnServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} SingleSignOnServiceImpl(const SingleSignOnServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(SingleSignOnService); - EndpointType* cloneEndpointType() const { - return new SingleSignOnServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(SingleSignOnService); }; class SAML_DLLLOCAL NameIDMappingServiceImpl : public virtual NameIDMappingService, public EndpointTypeImpl @@ -766,15 +761,12 @@ namespace opensaml { public: virtual ~NameIDMappingServiceImpl() {} - NameIDMappingServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + NameIDMappingServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} NameIDMappingServiceImpl(const NameIDMappingServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(NameIDMappingService); - EndpointType* cloneEndpointType() const { - return new NameIDMappingServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(NameIDMappingService); }; class SAML_DLLLOCAL AssertionIDRequestServiceImpl : public virtual AssertionIDRequestService, public EndpointTypeImpl @@ -782,15 +774,12 @@ namespace opensaml { public: virtual ~AssertionIDRequestServiceImpl() {} - AssertionIDRequestServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AssertionIDRequestServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AssertionIDRequestServiceImpl(const AssertionIDRequestServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AssertionIDRequestService); - EndpointType* cloneEndpointType() const { - return new AssertionIDRequestServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AssertionIDRequestService); }; class SAML_DLLLOCAL AssertionConsumerServiceImpl : public virtual AssertionConsumerService, public IndexedEndpointTypeImpl @@ -798,18 +787,12 @@ namespace opensaml { public: virtual ~AssertionConsumerServiceImpl() {} - AssertionConsumerServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AssertionConsumerServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AssertionConsumerServiceImpl(const AssertionConsumerServiceImpl& src) : AbstractXMLObject(src), IndexedEndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AssertionConsumerService); - EndpointType* cloneEndpointType() const { - return new AssertionConsumerServiceImpl(*this); - } - IndexedEndpointType* cloneIndexedEndpointType() const { - return new AssertionConsumerServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AssertionConsumerService); }; class SAML_DLLLOCAL AuthnQueryServiceImpl : public virtual AuthnQueryService, public EndpointTypeImpl @@ -817,15 +800,12 @@ namespace opensaml { public: virtual ~AuthnQueryServiceImpl() {} - AuthnQueryServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AuthnQueryServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AuthnQueryServiceImpl(const AuthnQueryServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AuthnQueryService); - EndpointType* cloneEndpointType() const { - return new AuthnQueryServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AuthnQueryService); }; class SAML_DLLLOCAL AuthzServiceImpl : public virtual AuthzService, public EndpointTypeImpl @@ -833,15 +813,12 @@ namespace opensaml { public: virtual ~AuthzServiceImpl() {} - AuthzServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AuthzServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AuthzServiceImpl(const AuthzServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AuthzService); - EndpointType* cloneEndpointType() const { - return new AuthzServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AuthzService); }; class SAML_DLLLOCAL AttributeServiceImpl : public virtual AttributeService, public EndpointTypeImpl @@ -849,15 +826,12 @@ namespace opensaml { public: virtual ~AttributeServiceImpl() {} - AttributeServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AttributeServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AttributeServiceImpl(const AttributeServiceImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AttributeService); - EndpointType* cloneEndpointType() const { - return new AttributeServiceImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AttributeService); }; class SAML_DLLLOCAL RoleDescriptorImpl : public virtual RoleDescriptor, @@ -869,15 +843,15 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_ID=m_ProtocolSupportEnumeration=m_ErrorURL=NULL; - m_ValidUntil=m_CacheDuration=NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Signature=NULL; - m_Extensions=NULL; - m_Organization=NULL; + m_ID=m_ProtocolSupportEnumeration=m_ErrorURL=nullptr; + m_ValidUntil=m_CacheDuration=nullptr; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Signature=nullptr; + m_Extensions=nullptr; + m_Organization=nullptr; m_pos_Signature=m_children.begin(); m_pos_Extensions=m_pos_Signature; ++m_pos_Extensions; @@ -903,7 +877,7 @@ namespace opensaml { delete m_CacheDuration; } - RoleDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + RoleDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -912,43 +886,32 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - setID(src.getID()); - setProtocolSupportEnumeration(src.getProtocolSupportEnumeration()); - setErrorURL(src.getErrorURL()); - setValidUntil(src.getValidUntil()); - setCacheDuration(src.getCacheDuration()); - if (src.getSignature()) - setSignature(src.getSignature()->cloneSignature()); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - if (src.getOrganization()) - setOrganization(src.getOrganization()->cloneOrganization()); - - VectorOf(KeyDescriptor) v=getKeyDescriptors(); - for (vector::const_iterator i=src.m_KeyDescriptors.begin(); i!=src.m_KeyDescriptors.end(); i++) { - if (*i) { - v.push_back((*i)->cloneKeyDescriptor()); - } - } - VectorOf(ContactPerson) w=getContactPersons(); - for (vector::const_iterator j=src.m_ContactPersons.begin(); j!=src.m_ContactPersons.end(); j++) { - if (*j) { - w.push_back((*j)->cloneContactPerson()); - } - } + } + + void _clone(const RoleDescriptorImpl& src) { + IMPL_CLONE_ATTRIB(ID); + IMPL_CLONE_ATTRIB(ProtocolSupportEnumeration); + IMPL_CLONE_ATTRIB(ErrorURL); + IMPL_CLONE_ATTRIB(ValidUntil); + IMPL_CLONE_ATTRIB(CacheDuration); + IMPL_CLONE_TYPED_CHILD(Signature); + IMPL_CLONE_TYPED_CHILD(Extensions); + IMPL_CLONE_TYPED_CHILD(Organization); + IMPL_CLONE_TYPED_CHILDREN(KeyDescriptor); + IMPL_CLONE_TYPED_CHILDREN(ContactPerson); } //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: - Signature* m_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. @@ -956,7 +919,11 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } - IMPL_ID_ATTRIB(ID); + RoleDescriptor* cloneRoleDescriptor() const { + return dynamic_cast(clone()); + } + + IMPL_ID_ATTRIB_EX(ID,ID,nullptr); IMPL_STRING_ATTRIB(ProtocolSupportEnumeration); IMPL_STRING_ATTRIB(ErrorURL); IMPL_DATETIME_ATTRIB(ValidUntil,SAMLTIME_MAX); @@ -971,8 +938,8 @@ namespace opensaml { return true; if (m_ProtocolSupportEnumeration) { // Look for first character. - unsigned int len=XMLString::stringLen(protocol); - unsigned int pos=0; + xsecsize_t len=XMLString::stringLen(protocol); + xsecsize_t pos=0; int index=XMLString::indexOf(m_ProtocolSupportEnumeration,protocol[0],pos); while (index>=0) { // Only possible match is if it's the first character or a space comes before it. @@ -1022,7 +989,7 @@ namespace opensaml { } } - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),ID_ATTRIB_NAME)) { setID(value); @@ -1049,12 +1016,17 @@ namespace opensaml { } protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + void marshallAttributes(DOMElement* domElement) const { - MARSHALL_ID_ATTRIB(ID,ID,NULL); - MARSHALL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION,NULL); - MARSHALL_STRING_ATTRIB(ErrorURL,ERRORURL,NULL); - MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,NULL); - MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,NULL); + MARSHALL_ID_ATTRIB(ID,ID,nullptr); + MARSHALL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION,nullptr); + MARSHALL_STRING_ATTRIB(ErrorURL,ERRORURL,nullptr); + MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,nullptr); + MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,nullptr); marshallExtensionAttributes(domElement); } @@ -1068,7 +1040,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_ID_ATTRIB(ID,ID,NULL); + PROC_ID_ATTRIB(ID,ID,nullptr); unmarshallExtensionAttribute(attribute); } }; @@ -1078,21 +1050,19 @@ namespace opensaml { public: virtual ~RoleDescriptorTypeImpl() {} - RoleDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + RoleDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { } RoleDescriptorTypeImpl(const RoleDescriptorTypeImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(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(RoleDescriptorType); - RoleDescriptor* cloneRoleDescriptor() const { - return new RoleDescriptorTypeImpl(*this); + void _clone(const RoleDescriptorTypeImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); } + IMPL_XMLOBJECT_CLONE_EX(RoleDescriptorType); IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); protected: @@ -1104,10 +1074,10 @@ namespace opensaml { class SAML_DLLLOCAL SSODescriptorTypeImpl : public virtual SSODescriptorType, public RoleDescriptorImpl { void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_ArtifactResolutionService=m_pos_ContactPerson; ++m_pos_ArtifactResolutionService; m_pos_SingleLogoutService=m_pos_ArtifactResolutionService; @@ -1131,37 +1101,25 @@ namespace opensaml { public: virtual ~SSODescriptorTypeImpl() {} - SSODescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + SSODescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } SSODescriptorTypeImpl(const SSODescriptorTypeImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(src) { init(); - VectorOf(ArtifactResolutionService) v=getArtifactResolutionServices(); - for (vector::const_iterator i=src.m_ArtifactResolutionServices.begin(); i!=src.m_ArtifactResolutionServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneArtifactResolutionService()); - } - } - VectorOf(SingleLogoutService) w=getSingleLogoutServices(); - for (vector::const_iterator j=src.m_SingleLogoutServices.begin(); j!=src.m_SingleLogoutServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneSingleLogoutService()); - } - } - VectorOf(ManageNameIDService) x=getManageNameIDServices(); - for (vector::const_iterator k=src.m_ManageNameIDServices.begin(); k!=src.m_ManageNameIDServices.end(); k++) { - if (*k) { - x.push_back((*k)->cloneManageNameIDService()); - } - } - VectorOf(NameIDFormat) y=getNameIDFormats(); - for (vector::const_iterator m=src.m_NameIDFormats.begin(); m!=src.m_NameIDFormats.end(); m++) { - if (*m) { - y.push_back((*m)->cloneNameIDFormat()); - } - } + } + + void _clone(const SSODescriptorTypeImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(ArtifactResolutionService); + IMPL_CLONE_TYPED_CHILDREN(SingleLogoutService); + IMPL_CLONE_TYPED_CHILDREN(ManageNameIDService); + IMPL_CLONE_TYPED_CHILDREN(NameIDFormat); + } + + SSODescriptorType* cloneSSODescriptorType() const { + return dynamic_cast(clone()); } IMPL_TYPED_CHILDREN(ArtifactResolutionService,m_pos_ArtifactResolutionService); @@ -1188,10 +1146,10 @@ namespace opensaml { void init() { m_WantAuthnRequestsSigned=XML_BOOL_NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_SingleSignOnService=m_pos_NameIDFormat; ++m_pos_SingleSignOnService; m_pos_NameIDMappingService=m_pos_SingleSignOnService; @@ -1205,54 +1163,26 @@ namespace opensaml { public: virtual ~IDPSSODescriptorImpl() {} - IDPSSODescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + IDPSSODescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } IDPSSODescriptorImpl(const IDPSSODescriptorImpl& src) : AbstractXMLObject(src), SSODescriptorTypeImpl(src) { init(); - WantAuthnRequestsSigned(src.m_WantAuthnRequestsSigned); - VectorOf(SingleSignOnService) v=getSingleSignOnServices(); - for (vector::const_iterator i=src.m_SingleSignOnServices.begin(); i!=src.m_SingleSignOnServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneSingleSignOnService()); - } - } - VectorOf(NameIDMappingService) w=getNameIDMappingServices(); - for (vector::const_iterator j=src.m_NameIDMappingServices.begin(); j!=src.m_NameIDMappingServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneNameIDMappingService()); - } - } - VectorOf(AssertionIDRequestService) x=getAssertionIDRequestServices(); - for (vector::const_iterator k=src.m_AssertionIDRequestServices.begin(); k!=src.m_AssertionIDRequestServices.end(); k++) { - if (*k) { - x.push_back((*k)->cloneAssertionIDRequestService()); - } - } - VectorOf(AttributeProfile) y=getAttributeProfiles(); - for (vector::const_iterator m=src.m_AttributeProfiles.begin(); m!=src.m_AttributeProfiles.end(); m++) { - if (*m) { - y.push_back((*m)->cloneAttributeProfile()); - } - } - VectorOf(Attribute) z=getAttributes(); - for (vector::const_iterator n=src.m_Attributes.begin(); n!=src.m_Attributes.end(); n++) { - if (*n) { - z.push_back((*n)->cloneAttribute()); - } - } } - IMPL_XMLOBJECT_CLONE(IDPSSODescriptor); - SSODescriptorType* cloneSSODescriptorType() const { - return new IDPSSODescriptorImpl(*this); - } - RoleDescriptor* cloneRoleDescriptor() const { - return new IDPSSODescriptorImpl(*this); + void _clone(const IDPSSODescriptorImpl& src) { + SSODescriptorTypeImpl::_clone(src); + IMPL_CLONE_BOOLEAN_ATTRIB(WantAuthnRequestsSigned); + IMPL_CLONE_TYPED_CHILDREN(SingleSignOnService); + IMPL_CLONE_TYPED_CHILDREN(NameIDMappingService); + IMPL_CLONE_TYPED_CHILDREN(AssertionIDRequestService); + IMPL_CLONE_TYPED_CHILDREN(AttributeProfile); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Attribute,saml2); } + IMPL_XMLOBJECT_CLONE_EX(IDPSSODescriptor); IMPL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned); IMPL_TYPED_CHILDREN(SingleSignOnService,m_pos_SingleSignOnService); IMPL_TYPED_CHILDREN(NameIDMappingService,m_pos_NameIDMappingService); @@ -1260,7 +1190,7 @@ namespace opensaml { IMPL_TYPED_CHILDREN(AttributeProfile,m_pos_AttributeProfile); IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),WANTAUTHNREQUESTSSIGNED_ATTRIB_NAME)) { setWantAuthnRequestsSigned(value); @@ -1272,7 +1202,7 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED,NULL); + MARSHALL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED,nullptr); RoleDescriptorImpl::marshallAttributes(domElement); } @@ -1294,9 +1224,10 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_Name=m_NameFormat=m_FriendlyName=NULL; + m_Name=m_NameFormat=m_FriendlyName=nullptr; m_isRequired=XML_BOOL_NULL; } + public: virtual ~RequestedAttributeImpl() { XMLString::release(&m_Name); @@ -1304,7 +1235,7 @@ namespace opensaml { XMLString::release(&m_FriendlyName); } - RequestedAttributeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + RequestedAttributeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -1313,30 +1244,21 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - setName(src.getName()); - setNameFormat(src.getNameFormat()); - setFriendlyName(src.getFriendlyName()); - isRequired(src.m_isRequired); - VectorOf(XMLObject) v=getAttributeValues(); - for (vector::const_iterator i=src.m_AttributeValues.begin(); i!=src.m_AttributeValues.end(); i++) { - if (*i) { - v.push_back((*i)->clone()); - } - } - } - - IMPL_XMLOBJECT_CLONE(RequestedAttribute); - Attribute* cloneAttribute() const { - return new RequestedAttributeImpl(*this); + IMPL_CLONE_ATTRIB(Name); + IMPL_CLONE_ATTRIB(NameFormat); + IMPL_CLONE_ATTRIB(FriendlyName); + IMPL_CLONE_BOOLEAN_ATTRIB(isRequired); + IMPL_CLONE_XMLOBJECT_CHILDREN(AttributeValue); } + IMPL_XMLOBJECT_CLONE2(RequestedAttribute,Attribute); IMPL_STRING_ATTRIB(Name); IMPL_STRING_ATTRIB(NameFormat); IMPL_STRING_ATTRIB(FriendlyName); IMPL_BOOLEAN_ATTRIB(isRequired); IMPL_XMLOBJECT_CHILDREN(AttributeValue,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),NAME_ATTRIB_NAME)) { setName(value); @@ -1360,10 +1282,10 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_STRING_ATTRIB(Name,NAME,NULL); - MARSHALL_STRING_ATTRIB(NameFormat,NAMEFORMAT,NULL); - MARSHALL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME,NULL); - MARSHALL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED,NULL); + MARSHALL_STRING_ATTRIB(Name,NAME,nullptr); + MARSHALL_STRING_ATTRIB(NameFormat,NAMEFORMAT,nullptr); + MARSHALL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME,nullptr); + MARSHALL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED,nullptr); marshallExtensionAttributes(domElement); } @@ -1386,10 +1308,10 @@ namespace opensaml { list::iterator m_pos_RequestedAttribute; void init() { - m_Index=NULL; + m_Index=nullptr; m_isDefault=XML_BOOL_NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_ServiceDescription=m_children.begin(); m_pos_RequestedAttribute=m_pos_ServiceDescription; ++m_pos_RequestedAttribute; @@ -1400,7 +1322,7 @@ namespace opensaml { XMLString::release(&m_Index); } - AttributeConsumingServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AttributeConsumingServiceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -1408,26 +1330,11 @@ namespace opensaml { AttributeConsumingServiceImpl(const AttributeConsumingServiceImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setIndex(src.m_Index); - isDefault(src.m_isDefault); - VectorOf(ServiceName) v=getServiceNames(); - for (vector::const_iterator i=src.m_ServiceNames.begin(); i!=src.m_ServiceNames.end(); i++) { - if (*i) { - v.push_back((*i)->cloneServiceName()); - } - } - VectorOf(ServiceDescription) w=getServiceDescriptions(); - for (vector::const_iterator j=src.m_ServiceDescriptions.begin(); j!=src.m_ServiceDescriptions.end(); j++) { - if (*j) { - w.push_back((*j)->cloneServiceDescription()); - } - } - VectorOf(RequestedAttribute) x=getRequestedAttributes(); - for (vector::const_iterator k=src.m_RequestedAttributes.begin(); k!=src.m_RequestedAttributes.end(); k++) { - if (*k) { - x.push_back((*k)->cloneRequestedAttribute()); - } - } + IMPL_CLONE_INTEGER_ATTRIB(Index); + IMPL_CLONE_BOOLEAN_ATTRIB(isDefault); + IMPL_CLONE_TYPED_CHILDREN(ServiceName); + IMPL_CLONE_TYPED_CHILDREN(ServiceDescription); + IMPL_CLONE_TYPED_CHILDREN(RequestedAttribute); } IMPL_XMLOBJECT_CLONE(AttributeConsumingService); @@ -1439,8 +1346,8 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_INTEGER_ATTRIB(Index,INDEX,NULL); - MARSHALL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,NULL); + MARSHALL_INTEGER_ATTRIB(Index,INDEX,nullptr); + MARSHALL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -1451,8 +1358,8 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_INTEGER_ATTRIB(Index,INDEX,NULL); - PROC_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,NULL); + PROC_INTEGER_ATTRIB(Index,INDEX,nullptr); + PROC_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,nullptr); AbstractXMLObjectUnmarshaller::processAttribute(attribute); } }; @@ -1464,7 +1371,7 @@ namespace opensaml { void init() { m_AuthnRequestsSigned=XML_BOOL_NULL; m_WantAssertionsSigned=XML_BOOL_NULL; - m_children.push_back(NULL); + m_children.push_back(nullptr); m_pos_AssertionConsumerService=m_pos_NameIDFormat; ++m_pos_AssertionConsumerService; } @@ -1472,43 +1379,30 @@ namespace opensaml { public: virtual ~SPSSODescriptorImpl() {} - SPSSODescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + SPSSODescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } SPSSODescriptorImpl(const SPSSODescriptorImpl& src) : AbstractXMLObject(src), SSODescriptorTypeImpl(src) { init(); - AuthnRequestsSigned(src.m_AuthnRequestsSigned); - WantAssertionsSigned(src.m_WantAssertionsSigned); - VectorOf(AssertionConsumerService) v=getAssertionConsumerServices(); - for (vector::const_iterator i=src.m_AssertionConsumerServices.begin(); i!=src.m_AssertionConsumerServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneAssertionConsumerService()); - } - } - VectorOf(AttributeConsumingService) w=getAttributeConsumingServices(); - for (vector::const_iterator j=src.m_AttributeConsumingServices.begin(); j!=src.m_AttributeConsumingServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAttributeConsumingService()); - } - } } - IMPL_XMLOBJECT_CLONE(SPSSODescriptor); - SSODescriptorType* cloneSSODescriptorType() const { - return cloneSPSSODescriptor(); - } - RoleDescriptor* cloneRoleDescriptor() const { - return cloneSPSSODescriptor(); + void _clone(const SPSSODescriptorImpl& src) { + SSODescriptorTypeImpl::_clone(src); + IMPL_CLONE_BOOLEAN_ATTRIB(AuthnRequestsSigned); + IMPL_CLONE_BOOLEAN_ATTRIB(WantAssertionsSigned); + IMPL_CLONE_TYPED_CHILDREN(AssertionConsumerService); + IMPL_CLONE_TYPED_CHILDREN(AttributeConsumingService); } + IMPL_XMLOBJECT_CLONE_EX(SPSSODescriptor); IMPL_BOOLEAN_ATTRIB(AuthnRequestsSigned); IMPL_BOOLEAN_ATTRIB(WantAssertionsSigned); IMPL_TYPED_CHILDREN(AssertionConsumerService,m_pos_AssertionConsumerService); IMPL_TYPED_CHILDREN(AttributeConsumingService,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),AUTHNREQUESTSSIGNED_ATTRIB_NAME)) { setAuthnRequestsSigned(value); @@ -1524,8 +1418,8 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED,NULL); - MARSHALL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,NULL); + MARSHALL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED,nullptr); + MARSHALL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,nullptr); RoleDescriptorImpl::marshallAttributes(domElement); } @@ -1542,8 +1436,8 @@ namespace opensaml { list::iterator m_pos_AssertionIDRequestService; void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_AuthnQueryService=m_pos_ContactPerson; ++m_pos_AuthnQueryService; m_pos_AssertionIDRequestService=m_pos_AuthnQueryService; @@ -1553,38 +1447,23 @@ namespace opensaml { public: virtual ~AuthnAuthorityDescriptorImpl() {} - AuthnAuthorityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + AuthnAuthorityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } AuthnAuthorityDescriptorImpl(const AuthnAuthorityDescriptorImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(src) { init(); - VectorOf(AuthnQueryService) v=getAuthnQueryServices(); - for (vector::const_iterator i=src.m_AuthnQueryServices.begin(); i!=src.m_AuthnQueryServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneAuthnQueryService()); - } - } - VectorOf(AssertionIDRequestService) w=getAssertionIDRequestServices(); - for (vector::const_iterator j=src.m_AssertionIDRequestServices.begin(); j!=src.m_AssertionIDRequestServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAssertionIDRequestService()); - } - } - VectorOf(NameIDFormat) x=getNameIDFormats(); - for (vector::const_iterator k=src.m_NameIDFormats.begin(); k!=src.m_NameIDFormats.end(); k++) { - if (*k) { - x.push_back((*k)->cloneNameIDFormat()); - } - } } - IMPL_XMLOBJECT_CLONE(AuthnAuthorityDescriptor); - RoleDescriptor* cloneRoleDescriptor() const { - return cloneAuthnAuthorityDescriptor(); + void _clone(const AuthnAuthorityDescriptorImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(AuthnQueryService); + IMPL_CLONE_TYPED_CHILDREN(AssertionIDRequestService); + IMPL_CLONE_TYPED_CHILDREN(NameIDFormat); } + IMPL_XMLOBJECT_CLONE_EX(AuthnAuthorityDescriptor); IMPL_TYPED_CHILDREN(AuthnQueryService,m_pos_AuthnQueryService); IMPL_TYPED_CHILDREN(AssertionIDRequestService,m_pos_AssertionIDRequestService); IMPL_TYPED_CHILDREN(NameIDFormat,m_children.end()); @@ -1604,8 +1483,8 @@ namespace opensaml { list::iterator m_pos_AssertionIDRequestService; void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_AuthzService=m_pos_ContactPerson; ++m_pos_AuthzService; m_pos_AssertionIDRequestService=m_pos_AuthzService; @@ -1615,38 +1494,23 @@ namespace opensaml { public: virtual ~PDPDescriptorImpl() {} - PDPDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + PDPDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } PDPDescriptorImpl(const PDPDescriptorImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(src) { init(); - VectorOf(AuthzService) v=getAuthzServices(); - for (vector::const_iterator i=src.m_AuthzServices.begin(); i!=src.m_AuthzServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneAuthzService()); - } - } - VectorOf(AssertionIDRequestService) w=getAssertionIDRequestServices(); - for (vector::const_iterator j=src.m_AssertionIDRequestServices.begin(); j!=src.m_AssertionIDRequestServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAssertionIDRequestService()); - } - } - VectorOf(NameIDFormat) x=getNameIDFormats(); - for (vector::const_iterator k=src.m_NameIDFormats.begin(); k!=src.m_NameIDFormats.end(); k++) { - if (*k) { - x.push_back((*k)->cloneNameIDFormat()); - } - } } - IMPL_XMLOBJECT_CLONE(PDPDescriptor); - RoleDescriptor* cloneRoleDescriptor() const { - return clonePDPDescriptor(); + void _clone(const PDPDescriptorImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(AuthzService); + IMPL_CLONE_TYPED_CHILDREN(AssertionIDRequestService); + IMPL_CLONE_TYPED_CHILDREN(NameIDFormat); } + IMPL_XMLOBJECT_CLONE_EX(PDPDescriptor); IMPL_TYPED_CHILDREN(AuthzService,m_pos_AuthzService); IMPL_TYPED_CHILDREN(AssertionIDRequestService,m_pos_AssertionIDRequestService); IMPL_TYPED_CHILDREN(NameIDFormat,m_children.end()); @@ -1668,10 +1532,10 @@ namespace opensaml { list::iterator m_pos_AttributeProfile; void init() { - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); m_pos_AttributeService=m_pos_ContactPerson; ++m_pos_AttributeService; m_pos_AssertionIDRequestService=m_pos_AttributeService; @@ -1685,50 +1549,25 @@ namespace opensaml { public: virtual ~AttributeAuthorityDescriptorImpl() {} - AttributeAuthorityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + AttributeAuthorityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } AttributeAuthorityDescriptorImpl(const AttributeAuthorityDescriptorImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(src) { init(); - VectorOf(AttributeService) v=getAttributeServices(); - for (vector::const_iterator i=src.m_AttributeServices.begin(); i!=src.m_AttributeServices.end(); i++) { - if (*i) { - v.push_back((*i)->cloneAttributeService()); - } - } - VectorOf(AssertionIDRequestService) w=getAssertionIDRequestServices(); - for (vector::const_iterator j=src.m_AssertionIDRequestServices.begin(); j!=src.m_AssertionIDRequestServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAssertionIDRequestService()); - } - } - VectorOf(NameIDFormat) x=getNameIDFormats(); - for (vector::const_iterator k=src.m_NameIDFormats.begin(); k!=src.m_NameIDFormats.end(); k++) { - if (*k) { - x.push_back((*k)->cloneNameIDFormat()); - } - } - VectorOf(AttributeProfile) y=getAttributeProfiles(); - for (vector::const_iterator m=src.m_AttributeProfiles.begin(); m!=src.m_AttributeProfiles.end(); m++) { - if (*m) { - y.push_back((*m)->cloneAttributeProfile()); - } - } - VectorOf(Attribute) z=getAttributes(); - for (vector::const_iterator n=src.m_Attributes.begin(); n!=src.m_Attributes.end(); n++) { - if (*n) { - z.push_back((*n)->cloneAttribute()); - } - } } - IMPL_XMLOBJECT_CLONE(AttributeAuthorityDescriptor); - RoleDescriptor* cloneRoleDescriptor() const { - return cloneAttributeAuthorityDescriptor(); + void _clone(const AttributeAuthorityDescriptorImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(AttributeService); + IMPL_CLONE_TYPED_CHILDREN(AssertionIDRequestService); + IMPL_CLONE_TYPED_CHILDREN(NameIDFormat); + IMPL_CLONE_TYPED_CHILDREN(AttributeProfile); + IMPL_CLONE_TYPED_FOREIGN_CHILDREN(Attribute,saml2); } + IMPL_XMLOBJECT_CLONE_EX(AttributeAuthorityDescriptor); IMPL_TYPED_CHILDREN(AttributeService,m_pos_AttributeService); IMPL_TYPED_CHILDREN(AssertionIDRequestService,m_pos_AssertionIDRequestService); IMPL_TYPED_CHILDREN(NameIDFormat,m_pos_NameIDFormat); @@ -1750,7 +1589,7 @@ namespace opensaml { { void init() { m_WantAssertionsSigned=XML_BOOL_NULL; - m_children.push_back(NULL); + m_children.push_back(nullptr); m_pos_NameIDFormat=m_pos_ContactPerson; ++m_pos_NameIDFormat; } @@ -1765,26 +1604,29 @@ namespace opensaml { public: virtual ~QueryDescriptorTypeImpl() {} - QueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) - : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + QueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } QueryDescriptorTypeImpl(const QueryDescriptorTypeImpl& src) : AbstractXMLObject(src), RoleDescriptorImpl(src) { init(); - WantAssertionsSigned(src.m_WantAssertionsSigned); - VectorOf(NameIDFormat) y=getNameIDFormats(); - for (vector::const_iterator m=src.m_NameIDFormats.begin(); m!=src.m_NameIDFormats.end(); m++) { - if (*m) { - y.push_back((*m)->cloneNameIDFormat()); - } - } + } + + void _clone(const QueryDescriptorTypeImpl& src) { + RoleDescriptorImpl::_clone(src); + IMPL_CLONE_BOOLEAN_ATTRIB(WantAssertionsSigned); + IMPL_CLONE_TYPED_CHILDREN(NameIDFormat); + } + + QueryDescriptorType* cloneQueryDescriptorType() const { + return dynamic_cast(clone()); } IMPL_BOOLEAN_ATTRIB(WantAssertionsSigned); IMPL_TYPED_CHILDREN(NameIDFormat,m_pos_NameIDFormat); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),WANTASSERTIONSSIGNED_ATTRIB_NAME)) { setWantAssertionsSigned(value); @@ -1796,7 +1638,7 @@ namespace opensaml { protected: void marshallAttributes(DOMElement* domElement) const { - MARSHALL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,NULL); + MARSHALL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,nullptr); RoleDescriptorImpl::marshallAttributes(domElement); } @@ -1811,18 +1653,12 @@ namespace opensaml { public: virtual ~AuthnQueryDescriptorTypeImpl() {} - AuthnQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AuthnQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} AuthnQueryDescriptorTypeImpl(const AuthnQueryDescriptorTypeImpl& src) : AbstractXMLObject(src), QueryDescriptorTypeImpl(src) {} - IMPL_XMLOBJECT_CLONE(AuthnQueryDescriptorType); - QueryDescriptorType* cloneQueryDescriptorType() const { - return new AuthnQueryDescriptorTypeImpl(*this); - } - RoleDescriptor* cloneRoleDescriptor() const { - return new AuthnQueryDescriptorTypeImpl(*this); - } + IMPL_XMLOBJECT_CLONE_EX(AuthnQueryDescriptorType); }; class SAML_DLLLOCAL AttributeQueryDescriptorTypeImpl : public virtual AttributeQueryDescriptorType, public QueryDescriptorTypeImpl @@ -1830,27 +1666,18 @@ namespace opensaml { public: virtual ~AttributeQueryDescriptorTypeImpl() {} - AttributeQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AttributeQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} - AttributeQueryDescriptorTypeImpl(const AttributeQueryDescriptorTypeImpl& src) - : AbstractXMLObject(src), QueryDescriptorTypeImpl(src) { - VectorOf(AttributeConsumingService) w=getAttributeConsumingServices(); - for (vector::const_iterator j=src.m_AttributeConsumingServices.begin(); j!=src.m_AttributeConsumingServices.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAttributeConsumingService()); - } - } + AttributeQueryDescriptorTypeImpl(const AttributeQueryDescriptorTypeImpl& src) : AbstractXMLObject(src), QueryDescriptorTypeImpl(src) { } - IMPL_XMLOBJECT_CLONE(AttributeQueryDescriptorType); - QueryDescriptorType* cloneQueryDescriptorType() const { - return new AttributeQueryDescriptorTypeImpl(*this); - } - RoleDescriptor* cloneRoleDescriptor() const { - return new AttributeQueryDescriptorTypeImpl(*this); + void _clone(const AttributeQueryDescriptorTypeImpl& src) { + QueryDescriptorTypeImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(AttributeConsumingService); } + IMPL_XMLOBJECT_CLONE_EX(AttributeQueryDescriptorType); IMPL_TYPED_CHILDREN(AttributeConsumingService,m_children.end()); protected: @@ -1865,27 +1692,18 @@ namespace opensaml { public: virtual ~AuthzDecisionQueryDescriptorTypeImpl() {} - AuthzDecisionQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AuthzDecisionQueryDescriptorTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} - AuthzDecisionQueryDescriptorTypeImpl(const AuthzDecisionQueryDescriptorTypeImpl& src) - : AbstractXMLObject(src), QueryDescriptorTypeImpl(src) { - VectorOf(ActionNamespace) w=getActionNamespaces(); - for (vector::const_iterator j=src.m_ActionNamespaces.begin(); j!=src.m_ActionNamespaces.end(); j++) { - if (*j) { - w.push_back((*j)->cloneActionNamespace()); - } - } + AuthzDecisionQueryDescriptorTypeImpl(const AuthzDecisionQueryDescriptorTypeImpl& src) : AbstractXMLObject(src), QueryDescriptorTypeImpl(src) { } - IMPL_XMLOBJECT_CLONE(AuthzDecisionQueryDescriptorType); - QueryDescriptorType* cloneQueryDescriptorType() const { - return new AuthzDecisionQueryDescriptorTypeImpl(*this); - } - RoleDescriptor* cloneRoleDescriptor() const { - return new AuthzDecisionQueryDescriptorTypeImpl(*this); + void _clone(const AuthzDecisionQueryDescriptorTypeImpl& src) { + QueryDescriptorTypeImpl::_clone(src); + IMPL_CLONE_TYPED_CHILDREN(ActionNamespace); } + IMPL_XMLOBJECT_CLONE_EX(AuthzDecisionQueryDescriptorType); IMPL_TYPED_CHILDREN(ActionNamespace,m_children.end()); protected: @@ -1906,13 +1724,13 @@ namespace opensaml { list::iterator m_pos_AffiliateMember; void init() { - m_ID=m_AffiliationOwnerID=NULL; - m_ValidUntil=m_CacheDuration=NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Signature=NULL; - m_Extensions=NULL; + m_ID=m_AffiliationOwnerID=nullptr; + m_ValidUntil=m_CacheDuration=nullptr; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Signature=nullptr; + m_Extensions=nullptr; m_pos_Signature=m_children.begin(); m_pos_Extensions=m_pos_Signature; ++m_pos_Extensions; @@ -1928,7 +1746,7 @@ namespace opensaml { delete m_CacheDuration; } - AffiliationDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + AffiliationDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -1937,27 +1755,14 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - setID(src.getID()); - setAffiliationOwnerID(src.getAffiliationOwnerID()); - setValidUntil(src.getValidUntil()); - setCacheDuration(src.getCacheDuration()); - if (src.getSignature()) - setSignature(src.getSignature()->cloneSignature()); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - - VectorOf(KeyDescriptor) v=getKeyDescriptors(); - for (vector::const_iterator i=src.m_KeyDescriptors.begin(); i!=src.m_KeyDescriptors.end(); i++) { - if (*i) { - v.push_back((*i)->cloneKeyDescriptor()); - } - } - VectorOf(AffiliateMember) w=getAffiliateMembers(); - for (vector::const_iterator j=src.m_AffiliateMembers.begin(); j!=src.m_AffiliateMembers.end(); j++) { - if (*j) { - w.push_back((*j)->cloneAffiliateMember()); - } - } + IMPL_CLONE_ATTRIB(ID); + IMPL_CLONE_ATTRIB(AffiliationOwnerID); + IMPL_CLONE_ATTRIB(ValidUntil); + IMPL_CLONE_ATTRIB(CacheDuration); + IMPL_CLONE_TYPED_CHILD(Signature); + IMPL_CLONE_TYPED_CHILD(Extensions); + IMPL_CLONE_TYPED_CHILDREN(KeyDescriptor); + IMPL_CLONE_TYPED_CHILDREN(AffiliateMember); } IMPL_XMLOBJECT_CLONE(AffiliationDescriptor); @@ -1965,14 +1770,14 @@ namespace opensaml { //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: - Signature* m_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. @@ -1980,7 +1785,7 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } - IMPL_ID_ATTRIB(ID); + IMPL_ID_ATTRIB_EX(ID,ID,nullptr); IMPL_STRING_ATTRIB(AffiliationOwnerID); IMPL_DATETIME_ATTRIB(ValidUntil,SAMLTIME_MAX); IMPL_DURATION_ATTRIB(CacheDuration,0); @@ -1988,7 +1793,7 @@ namespace opensaml { IMPL_TYPED_CHILDREN(AffiliateMember,m_pos_AffiliateMember); IMPL_TYPED_CHILDREN(KeyDescriptor,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),ID_ATTRIB_NAME)) { setID(value); @@ -2011,11 +1816,16 @@ namespace opensaml { } protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + void marshallAttributes(DOMElement* domElement) const { - MARSHALL_ID_ATTRIB(ID,ID,NULL); - MARSHALL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID,NULL); - MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,NULL); - MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,NULL); + MARSHALL_ID_ATTRIB(ID,ID,nullptr); + MARSHALL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID,nullptr); + MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,nullptr); + MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,nullptr); marshallExtensionAttributes(domElement); } @@ -2028,7 +1838,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_ID_ATTRIB(ID,ID,NULL); + PROC_ID_ATTRIB(ID,ID,nullptr); unmarshallExtensionAttribute(attribute); } }; @@ -2044,17 +1854,17 @@ namespace opensaml { list::iterator m_pos_ContactPerson; void init() { - m_ID=m_EntityID=NULL; - m_ValidUntil=m_CacheDuration=NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Signature=NULL; - m_Extensions=NULL; - m_AffiliationDescriptor=NULL; - m_Organization=NULL; + m_ID=m_EntityID=nullptr; + m_ValidUntil=m_CacheDuration=nullptr; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Signature=nullptr; + m_Extensions=nullptr; + m_AffiliationDescriptor=nullptr; + m_Organization=nullptr; m_pos_Signature=m_children.begin(); m_pos_Extensions=m_pos_Signature; ++m_pos_Extensions; @@ -2074,7 +1884,7 @@ namespace opensaml { delete m_CacheDuration; } - EntityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + EntityDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -2083,89 +1893,29 @@ namespace opensaml { : AbstractXMLObject(src), AbstractComplexElement(src), AbstractAttributeExtensibleXMLObject(src), AbstractDOMCachingXMLObject(src) { init(); - setID(src.getID()); - setEntityID(src.getEntityID()); - setValidUntil(src.getValidUntil()); - setCacheDuration(src.getCacheDuration()); - if (src.getSignature()) - setSignature(src.getSignature()->cloneSignature()); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - if (src.getAffiliationDescriptor()) - setAffiliationDescriptor(src.getAffiliationDescriptor()->cloneAffiliationDescriptor()); - if (src.getOrganization()) - setOrganization(src.getOrganization()->cloneOrganization()); - - for (list::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) { - if (*i) { - IDPSSODescriptor* idp=dynamic_cast(*i); - if (idp) { - getIDPSSODescriptors().push_back(idp->cloneIDPSSODescriptor()); - continue; - } - - SPSSODescriptor* sp=dynamic_cast(*i); - if (sp) { - getSPSSODescriptors().push_back(sp->cloneSPSSODescriptor()); - continue; - } - - AuthnAuthorityDescriptor* authn=dynamic_cast(*i); - if (authn) { - getAuthnAuthorityDescriptors().push_back(authn->cloneAuthnAuthorityDescriptor()); - continue; - } - - AttributeAuthorityDescriptor* attr=dynamic_cast(*i); - if (attr) { - getAttributeAuthorityDescriptors().push_back(attr->cloneAttributeAuthorityDescriptor()); - continue; - } - - PDPDescriptor* pdp=dynamic_cast(*i); - if (pdp) { - getPDPDescriptors().push_back(pdp->clonePDPDescriptor()); - continue; - } - - AuthnQueryDescriptorType* authnq=dynamic_cast(*i); - if (authnq) { - getAuthnQueryDescriptorTypes().push_back(authnq->cloneAuthnQueryDescriptorType()); - continue; - } - - AttributeQueryDescriptorType* attrq=dynamic_cast(*i); - if (attrq) { - getAttributeQueryDescriptorTypes().push_back(attrq->cloneAttributeQueryDescriptorType()); - continue; - } - - AuthzDecisionQueryDescriptorType* authzq=dynamic_cast(*i); - if (authzq) { - getAuthzDecisionQueryDescriptorTypes().push_back(authzq->cloneAuthzDecisionQueryDescriptorType()); - continue; - } - - RoleDescriptor* role=dynamic_cast(*i); - if (role) { - getRoleDescriptors().push_back(role->cloneRoleDescriptor()); - continue; - } - } - } - - VectorOf(ContactPerson) v=getContactPersons(); - for (vector::const_iterator j=src.m_ContactPersons.begin(); j!=src.m_ContactPersons.end(); j++) { - if (*j) { - v.push_back((*j)->cloneContactPerson()); - } - } - VectorOf(AdditionalMetadataLocation) w=getAdditionalMetadataLocations(); - for (vector::const_iterator k=src.m_AdditionalMetadataLocations.begin(); k!=src.m_AdditionalMetadataLocations.end(); k++) { - if (*k) { - w.push_back((*k)->cloneAdditionalMetadataLocation()); - } - } + IMPL_CLONE_ATTRIB(ID); + IMPL_CLONE_ATTRIB(EntityID); + IMPL_CLONE_ATTRIB(ValidUntil); + IMPL_CLONE_ATTRIB(CacheDuration); + IMPL_CLONE_TYPED_CHILD(Signature); + IMPL_CLONE_TYPED_CHILD(Extensions); + IMPL_CLONE_TYPED_CHILD(AffiliationDescriptor); + IMPL_CLONE_TYPED_CHILD(Organization); + + IMPL_CLONE_CHILDBAG_BEGIN; + IMPL_CLONE_TYPED_CHILD_IN_BAG(IDPSSODescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(SPSSODescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(AuthnAuthorityDescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(AttributeAuthorityDescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(PDPDescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(AuthnQueryDescriptorType); + IMPL_CLONE_TYPED_CHILD_IN_BAG(AttributeQueryDescriptorType); + IMPL_CLONE_TYPED_CHILD_IN_BAG(AuthzDecisionQueryDescriptorType); + IMPL_CLONE_TYPED_CHILD_IN_BAG(RoleDescriptor); + IMPL_CLONE_CHILDBAG_END; + + IMPL_CLONE_TYPED_CHILDREN(ContactPerson); + IMPL_CLONE_TYPED_CHILDREN(AdditionalMetadataLocation); } IMPL_XMLOBJECT_CLONE(EntityDescriptor); @@ -2173,14 +1923,14 @@ namespace opensaml { //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: - Signature* m_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. @@ -2188,7 +1938,7 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } - IMPL_ID_ATTRIB(ID); + IMPL_ID_ATTRIB_EX(ID,ID,nullptr); IMPL_STRING_ATTRIB(EntityID); IMPL_DATETIME_ATTRIB(ValidUntil,SAMLTIME_MAX); IMPL_DURATION_ATTRIB(CacheDuration,0); @@ -2207,7 +1957,7 @@ namespace opensaml { IMPL_TYPED_CHILDREN(ContactPerson,m_pos_ContactPerson); IMPL_TYPED_CHILDREN(AdditionalMetadataLocation,m_children.end()); - void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false) { + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { if (!qualifiedName.hasNamespaceURI()) { if (XMLString::equals(qualifiedName.getLocalPart(),ID_ATTRIB_NAME)) { setID(value); @@ -2250,15 +2000,20 @@ namespace opensaml { vector::const_iterator i = find_if(m_RoleDescriptors.begin(), m_RoleDescriptors.end(), ofTypeValidForProtocol(qname,protocol)); - return (i!=m_RoleDescriptors.end()) ? *i : NULL; + return (i!=m_RoleDescriptors.end()) ? *i : nullptr; } protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + void marshallAttributes(DOMElement* domElement) const { - MARSHALL_ID_ATTRIB(ID,ID,NULL); - MARSHALL_STRING_ATTRIB(EntityID,ENTITYID,NULL); - MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,NULL); - MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,NULL); + MARSHALL_ID_ATTRIB(ID,ID,nullptr); + MARSHALL_STRING_ATTRIB(EntityID,ENTITYID,nullptr); + MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,nullptr); + MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,nullptr); marshallExtensionAttributes(domElement); } @@ -2282,7 +2037,7 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_ID_ATTRIB(ID,ID,NULL); + PROC_ID_ATTRIB(ID,ID,nullptr); unmarshallExtensionAttribute(attribute); } }; @@ -2295,12 +2050,12 @@ namespace opensaml { public AbstractXMLObjectUnmarshaller { void init() { - m_ID=m_Name=NULL; - m_ValidUntil=m_CacheDuration=NULL; - m_children.push_back(NULL); - m_children.push_back(NULL); - m_Signature=NULL; - m_Extensions=NULL; + m_ID=m_Name=nullptr; + m_ValidUntil=m_CacheDuration=nullptr; + m_children.push_back(nullptr); + m_children.push_back(nullptr); + m_Signature=nullptr; + m_Extensions=nullptr; m_pos_Signature=m_children.begin(); m_pos_Extensions=m_pos_Signature; ++m_pos_Extensions; @@ -2314,7 +2069,7 @@ namespace opensaml { delete m_CacheDuration; } - EntitiesDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) + EntitiesDescriptorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) : AbstractXMLObject(nsURI, localName, prefix, schemaType) { init(); } @@ -2322,30 +2077,17 @@ namespace opensaml { EntitiesDescriptorImpl(const EntitiesDescriptorImpl& src) : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { init(); - setID(src.getID()); - setName(src.getName()); - setValidUntil(src.getValidUntil()); - setCacheDuration(src.getCacheDuration()); - if (src.getSignature()) - setSignature(src.getSignature()->cloneSignature()); - if (src.getExtensions()) - setExtensions(src.getExtensions()->cloneExtensions()); - - for (list::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) { - if (*i) { - EntityDescriptor* e=dynamic_cast(*i); - if (e) { - getEntityDescriptors().push_back(e->cloneEntityDescriptor()); - continue; - } + IMPL_CLONE_ATTRIB(ID); + IMPL_CLONE_ATTRIB(Name); + IMPL_CLONE_ATTRIB(ValidUntil); + IMPL_CLONE_ATTRIB(CacheDuration); + IMPL_CLONE_TYPED_CHILD(Signature); + IMPL_CLONE_TYPED_CHILD(Extensions); - EntitiesDescriptor* es=dynamic_cast(*i); - if (es) { - getEntitiesDescriptors().push_back(es->cloneEntitiesDescriptor()); - continue; - } - } - } + IMPL_CLONE_CHILDBAG_BEGIN; + IMPL_CLONE_TYPED_CHILD_IN_BAG(EntityDescriptor); + IMPL_CLONE_TYPED_CHILD_IN_BAG(EntitiesDescriptor); + IMPL_CLONE_CHILDBAG_END; } IMPL_XMLOBJECT_CLONE(EntitiesDescriptor); @@ -2353,14 +2095,14 @@ namespace opensaml { //IMPL_TYPED_CHILD(Signature); // Need customized setter. protected: - Signature* m_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. @@ -2368,7 +2110,7 @@ namespace opensaml { m_Signature->setContentReference(new opensaml::ContentReference(*this)); } - IMPL_ID_ATTRIB(ID); + IMPL_ID_ATTRIB_EX(ID,ID,nullptr); IMPL_STRING_ATTRIB(Name); IMPL_DATETIME_ATTRIB(ValidUntil,SAMLTIME_MAX); IMPL_DURATION_ATTRIB(CacheDuration,0); @@ -2377,11 +2119,16 @@ namespace opensaml { IMPL_TYPED_CHILDREN(EntitiesDescriptor,m_children.end()); protected: + void prepareForMarshalling() const { + if (m_Signature) + declareNonVisibleNamespaces(); + } + void marshallAttributes(DOMElement* domElement) const { - MARSHALL_ID_ATTRIB(ID,ID,NULL); - MARSHALL_STRING_ATTRIB(Name,NAME,NULL); - MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,NULL); - MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,NULL); + MARSHALL_ID_ATTRIB(ID,ID,nullptr); + MARSHALL_STRING_ATTRIB(Name,NAME,nullptr); + MARSHALL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,nullptr); + MARSHALL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,nullptr); } void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { @@ -2393,10 +2140,451 @@ namespace opensaml { } void processAttribute(const DOMAttr* attribute) { - PROC_ID_ATTRIB(ID,ID,NULL); - PROC_STRING_ATTRIB(Name,NAME,NULL); - PROC_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,NULL); - PROC_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,NULL); + PROC_ID_ATTRIB(ID,ID,nullptr); + PROC_STRING_ATTRIB(Name,NAME,nullptr); + PROC_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL,nullptr); + PROC_DATETIME_ATTRIB(CacheDuration,CACHEDURATION,nullptr); + } + }; + + class SAML_DLLLOCAL DiscoveryResponseImpl : public virtual DiscoveryResponse, public IndexedEndpointTypeImpl + { + public: + virtual ~DiscoveryResponseImpl() {} + + DiscoveryResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + DiscoveryResponseImpl(const DiscoveryResponseImpl& src) : AbstractXMLObject(src), IndexedEndpointTypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(DiscoveryResponse); + }; + + class SAML_DLLLOCAL RequestInitiatorImpl : public virtual RequestInitiator, public EndpointTypeImpl + { + public: + virtual ~RequestInitiatorImpl() {} + + RequestInitiatorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + RequestInitiatorImpl(const RequestInitiatorImpl& src) : AbstractXMLObject(src), EndpointTypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(RequestInitiator); + }; + + class SAML_DLLLOCAL EntityAttributesImpl : public virtual EntityAttributes, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + public: + virtual ~EntityAttributesImpl() {} + + EntityAttributesImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + } + + EntityAttributesImpl(const EntityAttributesImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { + IMPL_CLONE_CHILDBAG_BEGIN; + IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(Attribute,saml2); + IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(Assertion,saml2); + IMPL_CLONE_CHILDBAG_END; + } + + IMPL_XMLOBJECT_CLONE(EntityAttributes); + IMPL_TYPED_FOREIGN_CHILDREN(Attribute,saml2,m_children.end()); + IMPL_TYPED_FOREIGN_CHILDREN(Assertion,saml2,m_children.end()); + + protected: + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + PROC_TYPED_FOREIGN_CHILDREN(Attribute,saml2,SAML20_NS,false); + PROC_TYPED_FOREIGN_CHILDREN(Assertion,saml2,SAML20_NS,false); + AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); + } + }; + + class SAML_DLLLOCAL DigestMethodImpl : public virtual DigestMethod, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + public: + virtual ~DigestMethodImpl() { + XMLString::release(&m_Algorithm); + } + + DigestMethodImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Algorithm(nullptr) { + } + + DigestMethodImpl(const DigestMethodImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Algorithm(nullptr) { + IMPL_CLONE_ATTRIB(Algorithm); + IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); + } + + IMPL_XMLOBJECT_CLONE(DigestMethod); + IMPL_STRING_ATTRIB(Algorithm); + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + + protected: + void marshallAttributes(DOMElement* domElement) const { + MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); + } + + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + // Unknown child. + getUnknownXMLObjects().push_back(childXMLObject); + } + + void processAttribute(const DOMAttr* attribute) { + PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); + } + }; + + class SAML_DLLLOCAL SigningMethodImpl : public virtual SigningMethod, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + void init() { + m_Algorithm = m_MinKeySize = m_MaxKeySize = nullptr; + } + + public: + virtual ~SigningMethodImpl() { + XMLString::release(&m_Algorithm); + XMLString::release(&m_MinKeySize); + XMLString::release(&m_MaxKeySize); + } + + SigningMethodImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); + } + + SigningMethodImpl(const SigningMethodImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { + init(); + IMPL_CLONE_ATTRIB(Algorithm); + IMPL_CLONE_INTEGER_ATTRIB(MinKeySize); + IMPL_CLONE_INTEGER_ATTRIB(MaxKeySize); + IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); + } + + IMPL_XMLOBJECT_CLONE(SigningMethod); + IMPL_STRING_ATTRIB(Algorithm); + IMPL_INTEGER_ATTRIB(MinKeySize); + IMPL_INTEGER_ATTRIB(MaxKeySize); + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + + protected: + void marshallAttributes(DOMElement* domElement) const { + MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); + MARSHALL_INTEGER_ATTRIB(MinKeySize,MINKEYSIZE,nullptr); + MARSHALL_INTEGER_ATTRIB(MaxKeySize,MAXKEYSIZE,nullptr); + } + + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + // Unknown child. + getUnknownXMLObjects().push_back(childXMLObject); + } + + void processAttribute(const DOMAttr* attribute) { + PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr); + PROC_INTEGER_ATTRIB(MinKeySize,MINKEYSIZE,nullptr); + PROC_INTEGER_ATTRIB(MaxKeySize,MAXKEYSIZE,nullptr); + } + }; + + class SAML_DLLLOCAL DisplayNameImpl : public virtual DisplayName, public localizedNameTypeImpl + { + public: + virtual ~DisplayNameImpl() {} + + DisplayNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + DisplayNameImpl(const DisplayNameImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(DisplayName); + }; + + class SAML_DLLLOCAL DescriptionImpl : public virtual Description, public localizedNameTypeImpl + { + public: + virtual ~DescriptionImpl() {} + + DescriptionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + DescriptionImpl(const DescriptionImpl& src) : AbstractXMLObject(src), localizedNameTypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(Description); + }; + + class SAML_DLLLOCAL InformationURLImpl : public virtual InformationURL, public localizedURITypeImpl + { + public: + virtual ~InformationURLImpl() {} + + InformationURLImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + InformationURLImpl(const InformationURLImpl& src) : AbstractXMLObject(src), localizedURITypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(InformationURL); + }; + + class SAML_DLLLOCAL PrivacyStatementURLImpl : public virtual PrivacyStatementURL, public localizedURITypeImpl + { + public: + virtual ~PrivacyStatementURLImpl() {} + + PrivacyStatementURLImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + PrivacyStatementURLImpl(const PrivacyStatementURLImpl& src) : AbstractXMLObject(src), localizedURITypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(PrivacyStatementURL); + }; + + class SAML_DLLLOCAL KeywordsImpl : public virtual Keywords, + public AbstractSimpleElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + void init() { + m_Lang=nullptr; + m_LangPrefix=nullptr; + } + + protected: + KeywordsImpl() { + init(); + } + + public: + virtual ~KeywordsImpl() { + XMLString::release(&m_Lang); + XMLString::release(&m_LangPrefix); + } + + KeywordsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); + } + + KeywordsImpl(const KeywordsImpl& src) + : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) { + init(); + IMPL_CLONE_FOREIGN_ATTRIB(Lang); + } + + IMPL_XMLOBJECT_CLONE(Keywords); + IMPL_XMLOBJECT_FOREIGN_ATTRIB(Lang,XMLCh); + + protected: + void marshallAttributes(DOMElement* domElement) const { + if (m_Lang && *m_Lang) { + DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(xmlconstants::XML_NS, LANG_ATTRIB_NAME); + if (m_LangPrefix && *m_LangPrefix) + attr->setPrefix(m_LangPrefix); + else + attr->setPrefix(xmlconstants::XML_PREFIX); + attr->setNodeValue(m_Lang); + domElement->setAttributeNodeNS(attr); + } + } + + void processAttribute(const DOMAttr* attribute) { + if (XMLHelper::isNodeNamed(attribute, xmlconstants::XML_NS, LANG_ATTRIB_NAME)) { + setLang(attribute->getValue()); + const XMLCh* temp = attribute->getPrefix(); + if (temp && *temp && !XMLString::equals(temp, xmlconstants::XML_NS)) + m_LangPrefix = XMLString::replicate(temp); + return; + } + AbstractXMLObjectUnmarshaller::processAttribute(attribute); + } + }; + + class SAML_DLLLOCAL LogoImpl : public virtual Logo, + public AbstractSimpleElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + void init() { + m_Lang=nullptr; + m_LangPrefix=nullptr; + m_Height=nullptr; + m_Width=nullptr; + } + + protected: + LogoImpl() { + init(); + } + + public: + virtual ~LogoImpl() { + XMLString::release(&m_Lang); + XMLString::release(&m_LangPrefix); + XMLString::release(&m_Height); + XMLString::release(&m_Width); + } + + LogoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); + } + + LogoImpl(const LogoImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) { + init(); + IMPL_CLONE_FOREIGN_ATTRIB(Lang); + IMPL_CLONE_INTEGER_ATTRIB(Height); + IMPL_CLONE_INTEGER_ATTRIB(Width); + } + + IMPL_XMLOBJECT_CLONE(Logo); + IMPL_XMLOBJECT_FOREIGN_ATTRIB(Lang,XMLCh); + IMPL_INTEGER_ATTRIB(Height); + IMPL_INTEGER_ATTRIB(Width); + + protected: + void marshallAttributes(DOMElement* domElement) const { + if (m_Lang && *m_Lang) { + DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(xmlconstants::XML_NS, LANG_ATTRIB_NAME); + if (m_LangPrefix && *m_LangPrefix) + attr->setPrefix(m_LangPrefix); + else + attr->setPrefix(xmlconstants::XML_PREFIX); + attr->setNodeValue(m_Lang); + domElement->setAttributeNodeNS(attr); + } + MARSHALL_INTEGER_ATTRIB(Height,HEIGHT,nullptr); + MARSHALL_INTEGER_ATTRIB(Width,WIDTH,nullptr); + } + + void processAttribute(const DOMAttr* attribute) { + if (XMLHelper::isNodeNamed(attribute, xmlconstants::XML_NS, LANG_ATTRIB_NAME)) { + setLang(attribute->getValue()); + const XMLCh* temp = attribute->getPrefix(); + if (temp && *temp && !XMLString::equals(temp, xmlconstants::XML_NS)) + m_LangPrefix = XMLString::replicate(temp); + return; + } + PROC_INTEGER_ATTRIB(Height,HEIGHT,nullptr); + PROC_INTEGER_ATTRIB(Width,WIDTH,nullptr); + AbstractXMLObjectUnmarshaller::processAttribute(attribute); + } + }; + + class SAML_DLLLOCAL UIInfoImpl : public virtual UIInfo, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + public: + virtual ~UIInfoImpl() {} + + UIInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + } + + UIInfoImpl(const UIInfoImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { + IMPL_CLONE_CHILDBAG_BEGIN; + IMPL_CLONE_TYPED_CHILD_IN_BAG(DisplayName); + IMPL_CLONE_TYPED_CHILD_IN_BAG(Description); + IMPL_CLONE_TYPED_CHILD_IN_BAG(Keywords); + IMPL_CLONE_TYPED_CHILD_IN_BAG(Logo); + IMPL_CLONE_TYPED_CHILD_IN_BAG(InformationURL); + IMPL_CLONE_TYPED_CHILD_IN_BAG(PrivacyStatementURL); + IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject); + IMPL_CLONE_CHILDBAG_END; + } + + IMPL_XMLOBJECT_CLONE(UIInfo); + IMPL_TYPED_CHILDREN(DisplayName,m_children.end()); + IMPL_TYPED_CHILDREN(Description,m_children.end()); + IMPL_TYPED_CHILDREN(Keywords,m_children.end()); + IMPL_TYPED_CHILDREN(Logo,m_children.end()); + IMPL_TYPED_CHILDREN(InformationURL,m_children.end()); + IMPL_TYPED_CHILDREN(PrivacyStatementURL,m_children.end()); + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + + protected: + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + PROC_TYPED_CHILDREN(DisplayName,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(Description,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(Keywords,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(Logo,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(InformationURL,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(PrivacyStatementURL,SAML20MD_UI_NS,false); + + // Unknown child. + const XMLCh* nsURI=root->getNamespaceURI(); + if (!XMLString::equals(nsURI,SAML20MD_UI_NS) && nsURI && *nsURI) { + getUnknownXMLObjects().push_back(childXMLObject); + return; + } + + AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); + } + }; + + class SAML_DLLLOCAL DiscoHintsImpl : public virtual DiscoHints, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + public: + virtual ~DiscoHintsImpl() {} + + DiscoHintsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + } + + DiscoHintsImpl(const DiscoHintsImpl& src) + : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) { + IMPL_CLONE_CHILDBAG_BEGIN; + IMPL_CLONE_TYPED_CHILD_IN_BAG(IPHint); + IMPL_CLONE_TYPED_CHILD_IN_BAG(DomainHint); + IMPL_CLONE_TYPED_CHILD_IN_BAG(GeolocationHint); + IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject); + IMPL_CLONE_CHILDBAG_END; + } + + IMPL_XMLOBJECT_CLONE(DiscoHints); + IMPL_TYPED_CHILDREN(IPHint,m_children.end()); + IMPL_TYPED_CHILDREN(DomainHint,m_children.end()); + IMPL_TYPED_CHILDREN(GeolocationHint,m_children.end()); + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + + protected: + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + PROC_TYPED_CHILDREN(IPHint,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(DomainHint,SAML20MD_UI_NS,false); + PROC_TYPED_CHILDREN(GeolocationHint,SAML20MD_UI_NS,false); + + // Unknown child. + const XMLCh* nsURI=root->getNamespaceURI(); + if (!XMLString::equals(nsURI,SAML20MD_UI_NS) && nsURI && *nsURI) { + getUnknownXMLObjects().push_back(childXMLObject); + return; + } + + AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); } }; @@ -2466,18 +2654,129 @@ IMPL_XMLOBJECTBUILDER(TelephoneNumber); IMPL_XMLOBJECTBUILDER(ActionNamespace); IMPL_XMLOBJECTBUILDER(SourceID); +IMPL_XMLOBJECTBUILDER(DiscoveryResponse); +IMPL_XMLOBJECTBUILDER(RequestInitiator); +IMPL_XMLOBJECTBUILDER(EntityAttributes); +IMPL_XMLOBJECTBUILDER(DigestMethod); +IMPL_XMLOBJECTBUILDER(SigningMethod); +IMPL_XMLOBJECTBUILDER(DisplayName); +IMPL_XMLOBJECTBUILDER(Description); +IMPL_XMLOBJECTBUILDER(Keywords); +IMPL_XMLOBJECTBUILDER(Logo); +IMPL_XMLOBJECTBUILDER(InformationURL); +IMPL_XMLOBJECTBUILDER(PrivacyStatementURL); +IMPL_XMLOBJECTBUILDER(UIInfo); +IMPL_XMLOBJECTBUILDER(IPHint); +IMPL_XMLOBJECTBUILDER(DomainHint); +IMPL_XMLOBJECTBUILDER(GeolocationHint); +IMPL_XMLOBJECTBUILDER(DiscoHints); #ifdef HAVE_COVARIANT_RETURNS RoleDescriptor* RoleDescriptorBuilder::buildObject( #else xmltooling::XMLObject* RoleDescriptorBuilder::buildObject( #endif - const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType ) const { return new RoleDescriptorTypeImpl(nsURI,localName,prefix,schemaType); } +const DigestMethod* RoleDescriptor::getDigestMethod() const +{ + bool roleLevel = false; + XMLToolingConfig& conf = XMLToolingConfig::getConfig(); + + if (getExtensions()) { + const vector& exts = const_cast(getExtensions())->getUnknownXMLObjects(); + for (vector::const_iterator i = exts.begin(); i != exts.end(); ++i) { + const opensaml::saml2md::DigestMethod* dm = dynamic_cast(*i); + if (dm) { + if (dm->getAlgorithm() && conf.isXMLAlgorithmSupported(dm->getAlgorithm(), XMLToolingConfig::ALGTYPE_DIGEST)) + return dm; + roleLevel = true; + } + } + } + + if (!roleLevel) { + const EntityDescriptor* entity = dynamic_cast(getParent()); + if (entity && entity->getExtensions()) { + const vector& exts = const_cast(entity->getExtensions())->getUnknownXMLObjects(); + for (vector::const_iterator i = exts.begin(); i != exts.end(); ++i) { + const opensaml::saml2md::DigestMethod* dm = dynamic_cast(*i); + if (dm && dm->getAlgorithm() && conf.isXMLAlgorithmSupported(dm->getAlgorithm(), XMLToolingConfig::ALGTYPE_DIGEST)) + return dm; + } + } + } + + return nullptr; +} + +pair RoleDescriptor::getSigningMethod(const CredentialResolver& resolver, CredentialCriteria& cc) const +{ + bool roleLevel = false; + XMLToolingConfig& conf = XMLToolingConfig::getConfig(); + + if (getExtensions()) { + const vector& exts = const_cast(getExtensions())->getUnknownXMLObjects(); + for (vector::const_iterator i = exts.begin(); i != exts.end(); ++i) { + const SigningMethod* sm = dynamic_cast(*i); + if (sm) { + roleLevel = true; + if (sm->getAlgorithm() && conf.isXMLAlgorithmSupported(sm->getAlgorithm(), XMLToolingConfig::ALGTYPE_SIGN)) { + cc.setXMLAlgorithm(sm->getAlgorithm()); + pair minsize = sm->getMinKeySize(), maxsize = sm->getMaxKeySize(); + if (minsize.first || maxsize.first) { + cc.setKeySize(minsize.first ? minsize.second : 0); + cc.setMaxKeySize(maxsize.first ? maxsize.second : UINT_MAX); + } + else { + cc.setKeySize(0); + cc.setMaxKeySize(0); + } + const Credential* cred = resolver.resolve(&cc); + if (cred) + return make_pair(sm, cred); + } + } + } + } + + if (!roleLevel) { + const EntityDescriptor* entity = dynamic_cast(getParent()); + if (entity && entity->getExtensions()) { + const vector& exts = const_cast(entity->getExtensions())->getUnknownXMLObjects(); + for (vector::const_iterator i = exts.begin(); i != exts.end(); ++i) { + const SigningMethod* sm = dynamic_cast(*i); + if (sm) { + if (sm->getAlgorithm() && conf.isXMLAlgorithmSupported(sm->getAlgorithm(), XMLToolingConfig::ALGTYPE_SIGN)) { + cc.setXMLAlgorithm(sm->getAlgorithm()); + pair minsize = sm->getMinKeySize(), maxsize = sm->getMaxKeySize(); + if (minsize.first || maxsize.first) { + cc.setKeySize(minsize.first ? minsize.second : 0); + cc.setMaxKeySize(maxsize.first ? maxsize.second : UINT_MAX); + } + else { + cc.setKeySize(0); + cc.setMaxKeySize(0); + } + const Credential* cred = resolver.resolve(&cc); + if (cred) + return make_pair(sm, cred); + } + } + } + } + } + + cc.setKeySize(0); + cc.setMaxKeySize(0); + cc.setXMLAlgorithm(nullptr); + return pair(nullptr, resolver.resolve(&cc)); +} + const XMLCh ActionNamespace::LOCAL_NAME[] = UNICODE_LITERAL_15(A,c,t,i,o,n,N,a,m,e,s,p,a,c,e); const XMLCh AdditionalMetadataLocation::LOCAL_NAME[] = UNICODE_LITERAL_26(A,d,d,i,t,i,o,n,a,l,M,e,t,a,d,a,t,a,L,o,c,a,t,i,o,n); const XMLCh AdditionalMetadataLocation::TYPE_NAME[] = UNICODE_LITERAL_30(A,d,d,i,t,i,o,n,a,l,M,e,t,a,d,a,t,a,L,o,c,a,t,i,o,n,T,y,p,e); @@ -2518,6 +2817,15 @@ const XMLCh ContactPerson::CONTACT_SUPPORT[] = UNICODE_LITERAL_7(s,u,p, const XMLCh ContactPerson::CONTACT_ADMINISTRATIVE[] = UNICODE_LITERAL_14(a,d,m,i,n,i,s,t,r,a,t,i,v,e); const XMLCh ContactPerson::CONTACT_BILLING[] = UNICODE_LITERAL_7(b,i,l,l,i,n,g); const XMLCh ContactPerson::CONTACT_OTHER[] = UNICODE_LITERAL_5(o,t,h,e,r); +const XMLCh Description::LOCAL_NAME[] = UNICODE_LITERAL_11(D,e,s,c,r,i,p,t,i,o,n); +const XMLCh DigestMethod::LOCAL_NAME[] = UNICODE_LITERAL_12(D,i,g,e,s,t,M,e,t,h,o,d); +const XMLCh DigestMethod::TYPE_NAME[] = UNICODE_LITERAL_16(D,i,g,e,s,t,M,e,t,h,o,d,T,y,p,e); +const XMLCh DigestMethod::ALGORITHM_ATTRIB_NAME[] = UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m); +const XMLCh DiscoHints::LOCAL_NAME[] = UNICODE_LITERAL_10(D,i,s,c,o,H,i,n,t,s); +const XMLCh DiscoHints::TYPE_NAME[] = UNICODE_LITERAL_14(D,i,s,c,o,H,i,n,t,s,T,y,p,e); +const XMLCh DiscoveryResponse::LOCAL_NAME[] = UNICODE_LITERAL_17(D,i,s,c,o,v,e,r,y,R,e,s,p,o,n,s,e); +const XMLCh DisplayName::LOCAL_NAME[] = UNICODE_LITERAL_11(D,i,s,p,l,a,y,N,a,m,e); +const XMLCh DomainHint::LOCAL_NAME[] = UNICODE_LITERAL_10(D,o,m,a,i,n,H,i,n,t); const XMLCh EmailAddress::LOCAL_NAME[] = UNICODE_LITERAL_12(E,m,a,i,l,A,d,d,r,e,s,s); const XMLCh EndpointType::LOCAL_NAME[] = {chNull}; const XMLCh EndpointType::TYPE_NAME[] = UNICODE_LITERAL_12(E,n,d,p,o,i,n,t,T,y,p,e); @@ -2532,8 +2840,11 @@ const XMLCh EntityDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_16(E,n,t const XMLCh EntityDescriptor::TYPE_NAME[] = UNICODE_LITERAL_20(E,n,t,i,t,y,D,e,s,c,r,i,p,t,o,r,T,y,p,e); const XMLCh EntityDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D); const XMLCh EntityDescriptor::ENTITYID_ATTRIB_NAME[] = UNICODE_LITERAL_8(e,n,t,i,t,y,I,D); +const XMLCh EntityAttributes::LOCAL_NAME[] = UNICODE_LITERAL_16(E,n,t,i,t,y,A,t,t,r,i,b,u,t,e,s); +const XMLCh EntityAttributes::TYPE_NAME[] = UNICODE_LITERAL_20(E,n,t,i,t,y,A,t,t,r,i,b,u,t,e,s,T,y,p,e); const XMLCh Extensions::LOCAL_NAME[] = UNICODE_LITERAL_10(E,x,t,e,n,s,i,o,n,s); const XMLCh Extensions::TYPE_NAME[] = UNICODE_LITERAL_14(E,x,t,e,n,s,i,o,n,s,T,y,p,e); +const XMLCh GeolocationHint::LOCAL_NAME[] = UNICODE_LITERAL_15(G,e,o,l,o,c,a,t,i,o,n,H,i,n,t); const XMLCh GivenName::LOCAL_NAME[] = UNICODE_LITERAL_9(G,i,v,e,n,N,a,m,e); const XMLCh IDPSSODescriptor::LOCAL_NAME[] = UNICODE_LITERAL_16(I,D,P,S,S,O,D,e,s,c,r,i,p,t,o,r); const XMLCh IDPSSODescriptor::TYPE_NAME[] = UNICODE_LITERAL_20(I,D,P,S,S,O,D,e,s,c,r,i,p,t,o,r,T,y,p,e); @@ -2542,11 +2853,21 @@ const XMLCh IndexedEndpointType::LOCAL_NAME[] = {chNull}; const XMLCh IndexedEndpointType::TYPE_NAME[] = UNICODE_LITERAL_19(I,n,d,e,x,e,d,E,n,d,p,o,i,n,t,T,y,p,e); const XMLCh IndexedEndpointType::INDEX_ATTRIB_NAME[] = UNICODE_LITERAL_5(i,n,d,e,x); const XMLCh IndexedEndpointType::ISDEFAULT_ATTRIB_NAME[] = UNICODE_LITERAL_9(i,s,D,e,f,a,u,l,t); +const XMLCh InformationURL::LOCAL_NAME[] = UNICODE_LITERAL_14(I,n,f,o,r,m,a,t,i,o,n,U,R,L); +const XMLCh IPHint::LOCAL_NAME[] = UNICODE_LITERAL_6(I,P,H,i,n,t); const XMLCh KeyDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_13(K,e,y,D,e,s,c,r,i,p,t,o,r); const XMLCh KeyDescriptor::TYPE_NAME[] = UNICODE_LITERAL_17(K,e,y,D,e,s,c,r,i,p,t,o,r,T,y,p,e); const XMLCh KeyDescriptor::USE_ATTRIB_NAME[] = UNICODE_LITERAL_3(u,s,e); const XMLCh KeyDescriptor::KEYTYPE_ENCRYPTION[] = UNICODE_LITERAL_10(e,n,c,r,y,p,t,i,o,n); const XMLCh KeyDescriptor::KEYTYPE_SIGNING[] = UNICODE_LITERAL_7(s,i,g,n,i,n,g); +const XMLCh Keywords::LOCAL_NAME[] = UNICODE_LITERAL_8(K,e,y,w,o,r,d,s); +const XMLCh Keywords::TYPE_NAME[] = UNICODE_LITERAL_12(K,e,y,w,o,r,d,s,T,y,p,e); +const XMLCh Keywords::LANG_ATTRIB_NAME[] = UNICODE_LITERAL_4(l,a,n,g); +const XMLCh Logo::LOCAL_NAME[] = UNICODE_LITERAL_4(L,o,g,o); +const XMLCh Logo::TYPE_NAME[] = UNICODE_LITERAL_8(L,o,g,o,T,y,p,e); +const XMLCh Logo::LANG_ATTRIB_NAME[] = UNICODE_LITERAL_4(l,a,n,g); +const XMLCh Logo::HEIGHT_ATTRIB_NAME[] = UNICODE_LITERAL_6(h,e,i,g,h,t); +const XMLCh Logo::WIDTH_ATTRIB_NAME[] = UNICODE_LITERAL_5(w,i,d,t,h); const XMLCh localizedNameType::LOCAL_NAME[] = {chNull}; const XMLCh localizedNameType::TYPE_NAME[] = UNICODE_LITERAL_17(l,o,c,a,l,i,z,e,d,N,a,m,e,T,y,p,e); const XMLCh localizedNameType::LANG_ATTRIB_NAME[] = UNICODE_LITERAL_4(l,a,n,g); @@ -2563,18 +2884,25 @@ const XMLCh OrganizationDisplayName::LOCAL_NAME[] = UNICODE_LITERAL_23(O,r,g const XMLCh OrganizationURL::LOCAL_NAME[] = UNICODE_LITERAL_15(O,r,g,a,n,i,z,a,t,i,o,n,U,R,L); const XMLCh PDPDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_13(P,D,P,D,e,s,c,r,i,p,t,o,r); const XMLCh PDPDescriptor::TYPE_NAME[] = UNICODE_LITERAL_17(P,D,P,D,e,s,c,r,i,p,t,o,r,T,y,p,e); +const XMLCh PrivacyStatementURL::LOCAL_NAME[] = UNICODE_LITERAL_19(P,r,i,v,a,c,y,S,t,a,t,e,m,e,n,t,U,R,L); const XMLCh QueryDescriptorType::LOCAL_NAME[] = {chNull}; const XMLCh QueryDescriptorType::TYPE_NAME[] = UNICODE_LITERAL_19(Q,u,e,r,y,D,e,s,c,r,i,p,t,o,r,T,y,p,e); const XMLCh QueryDescriptorType::WANTASSERTIONSSIGNED_ATTRIB_NAME[] = UNICODE_LITERAL_20(W,a,n,t,A,s,s,e,r,t,i,o,n,s,S,i,g,n,e,d); const XMLCh RequestedAttribute::LOCAL_NAME[] = UNICODE_LITERAL_18(R,e,q,u,e,s,t,e,d,A,t,t,r,i,b,u,t,e); const XMLCh RequestedAttribute::TYPE_NAME[] = UNICODE_LITERAL_22(R,e,q,u,e,s,t,e,d,A,t,t,r,i,b,u,t,e,T,y,p,e); const XMLCh RequestedAttribute::ISREQUIRED_ATTRIB_NAME[] = UNICODE_LITERAL_10(i,s,R,e,q,u,i,r,e,d); +const XMLCh RequestInitiator::LOCAL_NAME[] = UNICODE_LITERAL_16(R,e,q,u,e,s,t,I,n,i,t,i,a,t,o,r); const XMLCh RoleDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_14(R,o,l,e,D,e,s,c,r,i,p,t,o,r); const XMLCh RoleDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D); const XMLCh RoleDescriptor::PROTOCOLSUPPORTENUMERATION_ATTRIB_NAME[] = UNICODE_LITERAL_26(p,r,o,t,o,c,o,l,S,u,p,p,o,r,t,E,n,u,m,e,r,a,t,i,o,n); const XMLCh RoleDescriptor::ERRORURL_ATTRIB_NAME[] = UNICODE_LITERAL_8(e,r,r,o,r,U,R,L); const XMLCh ServiceDescription::LOCAL_NAME[] = UNICODE_LITERAL_18(S,e,r,v,i,c,e,D,e,s,c,r,i,p,t,i,o,n); const XMLCh ServiceName::LOCAL_NAME[] = UNICODE_LITERAL_11(S,e,r,v,i,c,e,N,a,m,e); +const XMLCh SigningMethod::LOCAL_NAME[] = UNICODE_LITERAL_13(S,i,g,n,i,n,g,M,e,t,h,o,d); +const XMLCh SigningMethod::TYPE_NAME[] = UNICODE_LITERAL_17(S,i,g,n,i,n,g,M,e,t,h,o,d,T,y,p,e); +const XMLCh SigningMethod::ALGORITHM_ATTRIB_NAME[] = UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m); +const XMLCh SigningMethod::MINKEYSIZE_ATTRIB_NAME[] = UNICODE_LITERAL_10(M,i,n,K,e,y,S,i,z,e); +const XMLCh SigningMethod::MAXKEYSIZE_ATTRIB_NAME[] = UNICODE_LITERAL_10(M,a,x,K,e,y,S,i,z,e); const XMLCh SingleLogoutService::LOCAL_NAME[] = UNICODE_LITERAL_19(S,i,n,g,l,e,L,o,g,o,u,t,S,e,r,v,i,c,e); const XMLCh SingleSignOnService::LOCAL_NAME[] = UNICODE_LITERAL_19(S,i,n,g,l,e,S,i,g,n,O,n,S,e,r,v,i,c,e); const XMLCh SourceID::LOCAL_NAME[] = UNICODE_LITERAL_8(S,o,u,r,c,e,I,D); @@ -2587,3 +2915,5 @@ const XMLCh SSODescriptorType::TYPE_NAME[] = UNICODE_LITERAL_17(S,S,O const XMLCh SurName::LOCAL_NAME[] = UNICODE_LITERAL_7(S,u,r,N,a,m,e); const XMLCh TelephoneNumber::LOCAL_NAME[] = UNICODE_LITERAL_15(T,e,l,e,p,h,o,n,e,N,u,m,b,e,r); const XMLCh TimeBoundSAMLObject::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l); +const XMLCh UIInfo::LOCAL_NAME[] = UNICODE_LITERAL_6(U,I,I,n,f,o); +const XMLCh UIInfo::TYPE_NAME[] = UNICODE_LITERAL_10(U,I,I,n,f,o,T,y,p,e);