From 1d326093b9787328ea03b211bab6357f9b9448fd Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Wed, 4 May 2016 13:09:09 -0400 Subject: [PATCH] CPPOST-95 - Add MD RPI extension implementation to metadata classes. https://issues.shibboleth.net/jira/browse/CPPOST-95 Work in progress, RegistrationInfo/Policy added. --- saml/saml2/metadata/Metadata.h | 20 +++++ saml/saml2/metadata/impl/MetadataImpl.cpp | 139 +++++++++++++++++++++++++++++- 2 files changed, 158 insertions(+), 1 deletion(-) diff --git a/saml/saml2/metadata/Metadata.h b/saml/saml2/metadata/Metadata.h index 60b56c0..cef9fa1 100644 --- a/saml/saml2/metadata/Metadata.h +++ b/saml/saml2/metadata/Metadata.h @@ -531,6 +531,22 @@ namespace opensaml { static const XMLCh TYPE_NAME[]; END_XMLOBJECT; + BEGIN_XMLOBJECT(SAML_API, RegistrationPolicy, localizedURIType, SAML Metadata Extension for RPI RegistrationPolicy element); + DECL_SIMPLE_CONTENT(URL); + END_XMLOBJECT; + + BEGIN_XMLOBJECT(SAML_API,RegistrationInfo,xmltooling::ElementProxy,SAML Metadata Extension for RPI RegistrationInfo element); + DECL_STRING_ATTRIB(RegistrationAuthority,REGAUTHORITY); + DECL_DATETIME_ATTRIB(RegistrationInstant,REGINSTANT); + DECL_TYPED_CHILDREN(RegistrationPolicy); + /** RegistrationInfoType local name */ + static const XMLCh TYPE_NAME[]; + END_XMLOBJECT; + + BEGIN_XMLOBJECT(SAML_API, UsagePolicy, localizedURIType, SAML Metadata Extension for RPI UsagePolicy element); + DECL_SIMPLE_CONTENT(URL); + END_XMLOBJECT; + /** * Predicate to test a role for validity and protocol support. */ @@ -646,6 +662,10 @@ namespace opensaml { DECL_XMLOBJECTBUILDER(SAML_API,DomainHint,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX); DECL_XMLOBJECTBUILDER(SAML_API,GeolocationHint,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX); + DECL_XMLOBJECTBUILDER(SAML_API, RegistrationInfo, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX); + DECL_XMLOBJECTBUILDER(SAML_API, RegistrationPolicy, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX); + DECL_XMLOBJECTBUILDER(SAML_API, UsagePolicy, samlconstants::SAML20MD_RPI_NS, samlconstants::SAML20MD_RPI_PREFIX); + /** * Builder for localizedNameType objects. * diff --git a/saml/saml2/metadata/impl/MetadataImpl.cpp b/saml/saml2/metadata/impl/MetadataImpl.cpp index 89f39e8..1c83f01 100644 --- a/saml/saml2/metadata/impl/MetadataImpl.cpp +++ b/saml/saml2/metadata/impl/MetadataImpl.cpp @@ -2588,6 +2588,120 @@ namespace opensaml { } }; + class SAML_DLLLOCAL RegistrationInfoImpl : public virtual RegistrationInfo, + public AbstractAttributeExtensibleXMLObject, + public AbstractComplexElement, + public AbstractDOMCachingXMLObject, + public AbstractXMLObjectMarshaller, + public AbstractXMLObjectUnmarshaller + { + list::iterator m_pos_RegistrationPolicy; + + void init() { + m_RegistrationAuthority = nullptr; + m_RegistrationInstant = nullptr; + m_pos_RegistrationPolicy = m_children.begin(); + } + + protected: + RegistrationInfoImpl() { + init(); + } + + public: + virtual ~RegistrationInfoImpl() { + XMLString::release(&m_RegistrationAuthority); + delete m_RegistrationInstant; + } + + RegistrationInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) { + init(); + } + + RegistrationInfoImpl(const RegistrationInfoImpl& src) + : AbstractXMLObject(src), + AbstractAttributeExtensibleXMLObject(src), + AbstractComplexElement(src), + AbstractDOMCachingXMLObject(src) { + init(); + } + + void _clone(const RegistrationInfoImpl& src) { + IMPL_CLONE_ATTRIB(RegistrationAuthority); + IMPL_CLONE_ATTRIB(RegistrationInstant); + IMPL_CLONE_TYPED_CHILDREN(RegistrationPolicy); + IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject); + } + + IMPL_XMLOBJECT_CLONE_EX(RegistrationInfo); + IMPL_STRING_ATTRIB(RegistrationAuthority); + IMPL_DATETIME_ATTRIB(RegistrationInstant,0); + IMPL_TYPED_CHILDREN(RegistrationPolicy,m_pos_RegistrationPolicy); + IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end()); + + void setAttribute(const xmltooling::QName& qualifiedName, const XMLCh* value, bool ID=false) { + if (!qualifiedName.hasNamespaceURI()) { + if (XMLString::equals(qualifiedName.getLocalPart(),REGAUTHORITY_ATTRIB_NAME)) { + setRegistrationAuthority(value); + return; + } + else if (XMLString::equals(qualifiedName.getLocalPart(),REGINSTANT_ATTRIB_NAME)) { + setRegistrationInstant(value); + return; + } + } + AbstractAttributeExtensibleXMLObject::setAttribute(qualifiedName, value, ID); + } + protected: + void marshallAttributes(DOMElement* domElement) const { + MARSHALL_STRING_ATTRIB(RegistrationAuthority,REGAUTHORITY,nullptr); + MARSHALL_DATETIME_ATTRIB(RegistrationInstant,REGINSTANT,nullptr); + marshallExtensionAttributes(domElement); + } + + void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + PROC_TYPED_CHILDREN(RegistrationPolicy,SAML20MD_RPI_NS,false); + // Unknown child. + const XMLCh* nsURI=root->getNamespaceURI(); + if (!XMLString::equals(nsURI,SAML20MD_RPI_NS) && nsURI && *nsURI) { + getUnknownXMLObjects().push_back(childXMLObject); + return; + } + AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root); + } + + void processAttribute(const DOMAttr* attribute) { + unmarshallExtensionAttribute(attribute); + } + }; + + class SAML_DLLLOCAL RegistrationPolicyImpl : public virtual RegistrationPolicy, public localizedURITypeImpl + { + public: + virtual ~RegistrationPolicyImpl() {} + + RegistrationPolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + RegistrationPolicyImpl(const RegistrationPolicyImpl& src) : AbstractXMLObject(src), localizedURITypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(RegistrationPolicy); + }; + + class SAML_DLLLOCAL UsagePolicyImpl : public virtual UsagePolicy, public localizedURITypeImpl + { + public: + virtual ~UsagePolicyImpl() {} + + UsagePolicyImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType) + : AbstractXMLObject(nsURI, localName, prefix, schemaType) {} + + UsagePolicyImpl(const UsagePolicyImpl& src) : AbstractXMLObject(src), localizedURITypeImpl(src) {} + + IMPL_XMLOBJECT_CLONE_EX(UsagePolicy); + }; + }; }; @@ -2670,6 +2784,9 @@ IMPL_XMLOBJECTBUILDER(IPHint); IMPL_XMLOBJECTBUILDER(DomainHint); IMPL_XMLOBJECTBUILDER(GeolocationHint); IMPL_XMLOBJECTBUILDER(DiscoHints); +IMPL_XMLOBJECTBUILDER(RegistrationInfo); +IMPL_XMLOBJECTBUILDER(RegistrationPolicy); +IMPL_XMLOBJECTBUILDER(UsagePolicy); #ifdef HAVE_COVARIANT_RETURNS RoleDescriptor* RoleDescriptorBuilder::buildObject( @@ -2885,9 +3002,28 @@ const XMLCh OrganizationURL::LOCAL_NAME[] = UNICODE_LITERAL_15(O,r,g 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 Publication::LOCAL_NAME[] = UNICODE_LITERAL_11(P,u,b,l,i,c,a,t,i,o,n); +const XMLCh Publication::TYPE_NAME[] = UNICODE_LITERAL_15(P,u,b,l,i,c,a,t,i,o,n,T,y,p,e); +const XMLCh Publication::PUBLISHER_ATTRIB_NAME[] = UNICODE_LITERAL_9(p,u,b,l,i,s,h,e,r); +const XMLCh Publication::CREATIONINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_15(c,r,e,a,t,i,o,n,I,n,s,t,a,n,t); +const XMLCh Publication::PUBLICATIONID_ATTRIB_NAME[] = UNICODE_LITERAL_13(p,u,b,l,i,c,a,t,i,o,n,I,d); +const XMLCh PublicationInfo::LOCAL_NAME[] = UNICODE_LITERAL_15(P,u,b,l,i,c,a,t,i,o,n,I,n,f,o); +const XMLCh PublicationInfo::TYPE_NAME[] = UNICODE_LITERAL_19(P,u,b,l,i,c,a,t,i,o,n,I,n,f,o,T,y,p,e); +const XMLCh PublicationInfo::PUBLISHER_ATTRIB_NAME[] = UNICODE_LITERAL_9(p,u,b,l,i,s,h,e,r); +const XMLCh PublicationInfo::CREATIONINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_15(c,r,e,a,t,i,o,n,I,n,s,t,a,n,t); +const XMLCh PublicationInfo::PUBLICATIONID_ATTRIB_NAME[] = UNICODE_LITERAL_13(p,u,b,l,i,c,a,t,i,o,n,I,d); +const XMLCh PublicationPath::LOCAL_NAME[] = UNICODE_LITERAL_15(P,u,b,l,i,c,a,t,i,o,n,P,a,t,h); +const XMLCh PublicationPath::TYPE_NAME[] = UNICODE_LITERAL_19(P,u,b,l,i,c,a,t,i,o,n,P,a,t,h,T,y,p,e); +*/ 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 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 RegistrationInfo::LOCAL_NAME[] = UNICODE_LITERAL_16(R,e,g,i,s,t,r,a,t,i,o,n,I,n,f,o); +const XMLCh RegistrationInfo::TYPE_NAME[] = UNICODE_LITERAL_20(R,e,g,i,s,t,r,a,t,i,o,n,I,n,f,o,T,y,p,e); +const XMLCh RegistrationInfo::REGAUTHORITY_ATTRIB_NAME[] = UNICODE_LITERAL_21(r,e,g,i,s,t,r,a,t,i,o,n,A,u,t,h,o,r,i,t,y); +const XMLCh RegistrationInfo::REGINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_19(r,e,g,i,s,t,r,a,t,i,o,n,I,n,s,t,a,n,t); +const XMLCh RegistrationPolicy::LOCAL_NAME[] = UNICODE_LITERAL_18(R,e,g,i,s,t,r,a,t,i,o,n,P,o,l,i,c,y); 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); @@ -2917,3 +3053,4 @@ const XMLCh TelephoneNumber::LOCAL_NAME[] = UNICODE_LITERAL_15(T,e,l 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); +const XMLCh UsagePolicy::LOCAL_NAME[] = UNICODE_LITERAL_11(U,s,a,g,e,P,o,l,i,c,y); -- 2.1.4