X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fmetadata%2FMetadata.h;h=4ea5a5b496f745767dd9ac9486f10c89e7bb2513;hb=d553b4e66d3e96f8b18032abcda06ee3dfb2eb59;hp=457afc22f420ea82c578af32ef64bb0dd67e14e6;hpb=77b5736a167b7b2654e6ad47eec9e9722298e3ce;p=shibboleth%2Fopensaml2.git diff --git a/saml/saml2/metadata/Metadata.h b/saml/saml2/metadata/Metadata.h index 457afc2..4ea5a5b 100644 --- a/saml/saml2/metadata/Metadata.h +++ b/saml/saml2/metadata/Metadata.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Internet2 + * Copyright 2001-2007 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,8 @@ #define __saml2_metadata_h__ #include +#include + #include #define DECL_SAML2MDOBJECTBUILDER(cname) \ @@ -63,6 +65,10 @@ namespace opensaml { bool isValid() const { return time(NULL) <= getValidUntilEpoch(); } + /** Returns true iff the object is valid at the supplied time. */ + bool isValid(time_t t) const { + return t <= getValidUntilEpoch(); + } }; DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element); @@ -101,7 +107,7 @@ namespace opensaml { DECL_SIMPLE_CONTENT(URL); END_XMLOBJECT; - BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementProxy,SAML 2.0 Extensions element); + BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Extensions element); /** ExtensionsType local name */ static const XMLCh TYPE_NAME[]; END_XMLOBJECT; @@ -162,15 +168,16 @@ namespace opensaml { DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION); /** Searches the ProtocolSupportEnumeration attribute for the indicated protocol. */ virtual bool hasSupport(const XMLCh* protocol) const=0; + /** Adds the indicated protocol to the ProtocolSupportEnumeration attribute. */ + virtual void addSupport(const XMLCh* protocol)=0; DECL_STRING_ATTRIB(ErrorURL,ERRORURL); - DECL_INHERITED_TYPED_FOREIGN_CHILD(Signature,xmlsignature); DECL_TYPED_CHILD(Extensions); DECL_TYPED_CHILDREN(KeyDescriptor); DECL_TYPED_CHILD(Organization); DECL_TYPED_CHILDREN(ContactPerson); END_XMLOBJECT; - BEGIN_XMLOBJECT2(SAML_API,EndpointType,xmltooling::ElementProxy,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 EndpointType type); + BEGIN_XMLOBJECT(SAML_API,EndpointType,xmltooling::ElementProxy,SAML 2.0 EndpointType type); DECL_STRING_ATTRIB(Binding,BINDING); DECL_STRING_ATTRIB(Location,LOCATION); DECL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION); @@ -221,6 +228,7 @@ namespace opensaml { DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2); /** IDPSSODescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_ELEMENT_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,ServiceName,localizedNameType,SAML 2.0 ServiceName element); @@ -257,6 +265,7 @@ namespace opensaml { DECL_TYPED_CHILDREN(AttributeConsumingService); /** SPSSODescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_ELEMENT_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,AuthnQueryService,EndpointType,SAML 2.0 AuthnQueryService element); @@ -268,6 +277,7 @@ namespace opensaml { DECL_TYPED_CHILDREN(NameIDFormat); /** AuthnAuthorityDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_ELEMENT_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,AuthzService,EndpointType,SAML 2.0 AuthzService element); @@ -279,6 +289,7 @@ namespace opensaml { DECL_TYPED_CHILDREN(NameIDFormat); /** PDPDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_ELEMENT_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,AttributeService,EndpointType,SAML 2.0 AttributeService element); @@ -292,6 +303,7 @@ namespace opensaml { DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2); /** AttributeAuthorityDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_ELEMENT_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,QueryDescriptorType,RoleDescriptor,SAML 2.0 QueryDescriptorType abstract type); @@ -304,25 +316,27 @@ namespace opensaml { BEGIN_XMLOBJECT(SAML_API,AuthnQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthnQueryDescriptorType extension type); /** AuthnQueryDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_TYPE_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,AttributeQueryDescriptorType,QueryDescriptorType,SAML 2.0 AttributeQueryDescriptorType extension type); DECL_TYPED_CHILDREN(AttributeConsumingService); /** AttributeQueryDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_TYPE_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT(SAML_API,AuthzDecisionQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthzDecisionQueryDescriptorType extension type); DECL_TYPED_CHILDREN(ActionNamespace); /** AuthzDecisionQueryDescriptorType local name */ static const XMLCh TYPE_NAME[]; + DECL_TYPE_QNAME; END_XMLOBJECT; BEGIN_XMLOBJECT4(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject, CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 AffiliationDescriptor element); DECL_STRING_ATTRIB(ID,ID); DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID); - DECL_INHERITED_TYPED_FOREIGN_CHILD(Signature,xmlsignature); DECL_TYPED_CHILD(Extensions); DECL_TYPED_CHILDREN(AffiliateMember); DECL_TYPED_CHILDREN(KeyDescriptor); @@ -334,7 +348,6 @@ namespace opensaml { CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 EntityDescriptor element); DECL_STRING_ATTRIB(ID,ID); DECL_STRING_ATTRIB(EntityID,ENTITYID); - DECL_INHERITED_TYPED_FOREIGN_CHILD(Signature,xmlsignature); DECL_TYPED_CHILD(Extensions); DECL_TYPED_CHILD(AffiliationDescriptor); DECL_TYPED_CHILDREN(RoleDescriptor); @@ -346,23 +359,10 @@ namespace opensaml { DECL_TYPED_CHILDREN(AuthnQueryDescriptorType); DECL_TYPED_CHILDREN(AttributeQueryDescriptorType); DECL_TYPED_CHILDREN(AuthzDecisionQueryDescriptorType); - /** Finds an IDP role supporting a given protocol. */ - virtual const IDPSSODescriptor* getIDPSSODescriptor(const XMLCh* protocol) const=0; - /** Finds an SP role supporting a given protocol. */ - virtual const SPSSODescriptor* getSPSSODescriptor(const XMLCh* protocol) const=0; - /** Finds an Authn Authority role supporting a given protocol. */ - virtual const AuthnAuthorityDescriptor* getAuthnAuthorityDescriptor(const XMLCh* protocol) const=0; - /** Finds an Attribute Authority role supporting a given protocol. */ - virtual const AttributeAuthorityDescriptor* getAttributeAuthorityDescriptor(const XMLCh* protocol) const=0; - /** Finds a PDP role supporting a given protocol. */ - virtual const PDPDescriptor* getPDPDescriptor(const XMLCh* protocol) const=0; - /** Finds an AuthnQuery role supporting a given protocol. */ - virtual const AuthnQueryDescriptorType* getAuthnQueryDescriptorType(const XMLCh* protocol) const=0; - /** Finds an AttributeQuery role supporting a given protocol. */ - virtual const AttributeQueryDescriptorType* getAttributeQueryDescriptorType(const XMLCh* protocol) const=0; - /** Finds an AuthzDecisionQuery role supporting a given protocol. */ - virtual const AuthzDecisionQueryDescriptorType* getAuthzDecisionQueryDescriptorType(const XMLCh* protocol) const=0; - /** Finds an extension role supporting a given protocol. */ + DECL_TYPED_CHILD(Organization); + DECL_TYPED_CHILDREN(ContactPerson); + DECL_TYPED_CHILDREN(AdditionalMetadataLocation); + /** Finds an arbitrary role type supporting a given protocol. */ virtual const RoleDescriptor* getRoleDescriptor(const xmltooling::QName& qname, const XMLCh* protocol) const=0; /** EntityDescriptorType local name */ static const XMLCh TYPE_NAME[]; @@ -372,7 +372,6 @@ namespace opensaml { TimeBoundSAMLObject,SAML 2.0 EntitiesDescriptor element); DECL_STRING_ATTRIB(ID,ID); DECL_STRING_ATTRIB(Name,NAME); - DECL_INHERITED_TYPED_FOREIGN_CHILD(Signature,xmlsignature); DECL_TYPED_CHILD(Extensions); DECL_TYPED_CHILDREN(EntityDescriptor); DECL_TYPED_CHILDREN(EntitiesDescriptor); @@ -380,6 +379,62 @@ namespace opensaml { static const XMLCh TYPE_NAME[]; END_XMLOBJECT; + /** + * Predicate to test a role for validity and protocol support. + */ + class isValidForProtocol + { + public: + /** + * Constructor. + * + * @param protocol support constant to test for + */ + isValidForProtocol(const XMLCh* protocol) : m_time(time(NULL)), m_protocol(protocol) { + } + + /** + * Returns true iff the supplied role is valid now and supports the right protocol. + * + * @param role role to test + * @return result of predicate + */ + bool operator()(const RoleDescriptor* role) const { + return role ? (role->isValid(m_time) && role->hasSupport(m_protocol)) : false; + } + + private: + time_t m_time; + const XMLCh* m_protocol; + }; + + /** + * Predicate to test a role for type equivalence, validity, and protocol support. + */ + class ofTypeValidForProtocol : public isValidForProtocol, public xmltooling::hasSchemaType + { + public: + /** + * Constructor. + * + * @param q schema type to test for + * @param protocol support constant to test for + */ + ofTypeValidForProtocol(const xmltooling::QName& q, const XMLCh* protocol) + : isValidForProtocol(protocol), xmltooling::hasSchemaType(q) { + } + + /** + * Returns true iff the supplied role is of the right type, valid now, and supports the right protocol. + * + * @param role role to test + * @return result of predicate + */ + bool operator()(const RoleDescriptor* role) const { + return xmltooling::hasSchemaType::operator()(role) && isValidForProtocol::operator()(role); + } + }; + DECL_SAML2MDOBJECTBUILDER(AdditionalMetadataLocation); DECL_SAML2MDOBJECTBUILDER(AffiliateMember); DECL_SAML2MDOBJECTBUILDER(AffiliationDescriptor); @@ -431,7 +486,11 @@ namespace opensaml { public: virtual ~localizedNameTypeBuilder() {} /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual localizedNameType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -442,7 +501,11 @@ namespace opensaml { ); if (b) { xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME,samlconstants::SAML20MD_PREFIX); +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(nsURI, localName, prefix, &schemaType); +#else + return dynamic_cast(b->buildObject(nsURI, localName, prefix, &schemaType)); +#endif } throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedNameType."); } @@ -457,7 +520,11 @@ namespace opensaml { public: virtual ~localizedURITypeBuilder() {} /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual localizedURIType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -468,7 +535,11 @@ namespace opensaml { ); if (b) { xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME,samlconstants::SAML20MD_PREFIX); +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(nsURI, localName, prefix, &schemaType); +#else + return dynamic_cast(b->buildObject(nsURI, localName, prefix, &schemaType)); +#endif } throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedURIType."); } @@ -483,7 +554,11 @@ namespace opensaml { public: virtual ~EndpointTypeBuilder() {} /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual EndpointType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -494,7 +569,11 @@ namespace opensaml { ); if (b) { xmltooling::QName schemaType(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX); +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(nsURI, localName, prefix, &schemaType); +#else + return dynamic_cast(b->buildObject(nsURI, localName, prefix, &schemaType)); +#endif } throw xmltooling::XMLObjectException("Unable to obtain typed builder for EndpointType."); } @@ -509,7 +588,11 @@ namespace opensaml { public: virtual ~IndexedEndpointTypeBuilder() {} /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual IndexedEndpointType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -520,7 +603,11 @@ namespace opensaml { ); if (b) { xmltooling::QName schemaType(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX); +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(nsURI, localName, prefix, &schemaType); +#else + return dynamic_cast(b->buildObject(nsURI, localName, prefix, &schemaType)); +#endif } throw xmltooling::XMLObjectException("Unable to obtain typed builder for IndexedEndpointType."); } @@ -532,20 +619,28 @@ namespace opensaml { * This is customized to return a RoleDescriptor element with an * xsi:type of AuthnQueryDescriptorType. */ - class SAML_API AuthnQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder { + class SAML_API AuthnQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder { public: virtual ~AuthnQueryDescriptorTypeBuilder() {} /** Default builder. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AuthnQueryDescriptorType* buildObject() const { +#else + virtual xmltooling::XMLObject* buildObject() const { +#endif xmltooling::QName schemaType( - samlconstants::SAML20_NS,AuthnQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX + samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX ); return buildObject( - samlconstants::SAML20_NS,AuthnQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType + samlconstants::SAML20MD_NS,AuthnQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType ); } /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AuthnQueryDescriptorType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -554,8 +649,13 @@ namespace opensaml { const AuthnQueryDescriptorTypeBuilder* b = dynamic_cast( XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME)) ); - if (b) + if (b) { +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(); +#else + return dynamic_cast(b->buildObject()); +#endif + } throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthnQueryDescriptorType."); } }; @@ -566,20 +666,28 @@ namespace opensaml { * This is customized to return a RoleDescriptor element with an * xsi:type of AttributeQueryDescriptorType. */ - class SAML_API AttributeQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder { + class SAML_API AttributeQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder { public: virtual ~AttributeQueryDescriptorTypeBuilder() {} /** Default builder. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AttributeQueryDescriptorType* buildObject() const { +#else + virtual xmltooling::XMLObject* buildObject() const { +#endif xmltooling::QName schemaType( - samlconstants::SAML20_NS,AttributeQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX + samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX ); return buildObject( - samlconstants::SAML20_NS,AttributeQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType + samlconstants::SAML20MD_NS,AttributeQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType ); } /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AttributeQueryDescriptorType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -588,8 +696,13 @@ namespace opensaml { const AttributeQueryDescriptorTypeBuilder* b = dynamic_cast( XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME)) ); - if (b) + if (b) { +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(); +#else + return dynamic_cast(b->buildObject()); +#endif + } throw xmltooling::XMLObjectException("Unable to obtain typed builder for AttributeQueryDescriptorType."); } }; @@ -600,20 +713,28 @@ namespace opensaml { * This is customized to return a RoleDescriptor element with an * xsi:type of AuthzDecisionQueryDescriptorType. */ - class SAML_API AuthzDecisionQueryDescriptorTypeBuilder : public xmltooling::XMLObjectBuilder { + class SAML_API AuthzDecisionQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder { public: virtual ~AuthzDecisionQueryDescriptorTypeBuilder() {} /** Default builder. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AuthzDecisionQueryDescriptorType* buildObject() const { +#else + virtual xmltooling::XMLObject* buildObject() const { +#endif xmltooling::QName schemaType( - samlconstants::SAML20_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX + samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX ); return buildObject( - samlconstants::SAML20_NS,AuthzDecisionQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType + samlconstants::SAML20MD_NS,AuthzDecisionQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType ); } /** Builder that allows element/type override. */ +#ifdef HAVE_COVARIANT_RETURNS virtual AuthzDecisionQueryDescriptorType* buildObject( +#else + virtual xmltooling::XMLObject* buildObject( +#endif const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const; @@ -622,8 +743,13 @@ namespace opensaml { const AuthzDecisionQueryDescriptorTypeBuilder* b = dynamic_cast( XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME)) ); - if (b) + if (b) { +#ifdef HAVE_COVARIANT_RETURNS return b->buildObject(); +#else + return dynamic_cast(b->buildObject()); +#endif + } throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthzDecisionQueryDescriptorType."); } };