+ // Known Metadata Extensions
+
+ DECL_XMLOBJECT_SIMPLE(SAML_API,SourceID,ID,SAML 1.x Metadata Profile SourceID element);
+
+ BEGIN_XMLOBJECT(SAML_API,DiscoveryResponse,IndexedEndpointType,Identity Provider Discovery Protocol DiscoveryResponse element);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,RequestInitiator,EndpointType,Service Provider Request Initiation RequestInitiator element);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,EntityAttributes,xmltooling::XMLObject,SAML Metadata Extension for Entity Attributes element);
+ DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
+ DECL_TYPED_FOREIGN_CHILDREN(Assertion,saml2);
+ /** EntityAttributesType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,DigestMethod,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Algorithm Support DigestMethod element);
+ DECL_STRING_ATTRIB(Algorithm,ALGORITHM);
+ /** DigestMethodType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,SigningMethod,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Algorithm Support SigningMethod element);
+ DECL_STRING_ATTRIB(Algorithm,ALGORITHM);
+ DECL_INTEGER_ATTRIB(MinKeySize,MINKEYSIZE);
+ DECL_INTEGER_ATTRIB(MaxKeySize,MAXKEYSIZE);
+ /** SigningMethodType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,DisplayName,localizedNameType,SAML Metadata Extension for Login UI DisplayName element);
+ DECL_SIMPLE_CONTENT(Name);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,Description,localizedNameType,SAML Metadata Extension for Login UI Description element);
+ DECL_SIMPLE_CONTENT(Description);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,Keywords,xmltooling::XMLObject,SAML Metadata Extension for Login UI Keywords element);
+ /** xml:lang attribute name. */
+ static const XMLCh LANG_ATTRIB_NAME[];
+
+ /**
+ * Sets the xml:lang attribute.
+ *
+ * @param Lang the value to set
+ */
+ virtual void setLang(const XMLCh* Lang)=0;
+
+ DECL_SIMPLE_CONTENT(Values);
+ /** KeywordsType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,Logo,xmltooling::XMLObject,SAML Metadata Extension for Login UI Logo element);
+ /** xml:lang attribute name. */
+ static const XMLCh LANG_ATTRIB_NAME[];
+
+ /**
+ * Sets the xml:lang attribute.
+ *
+ * @param Lang the value to set
+ */
+ virtual void setLang(const XMLCh* Lang)=0;
+
+ DECL_INTEGER_ATTRIB(Height,HEIGHT);
+ DECL_INTEGER_ATTRIB(Width,WIDTH);
+ DECL_SIMPLE_CONTENT(URL);
+ /** LogoType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,InformationURL,localizedURIType,SAML Metadata Extension for Login UI InformationURL element);
+ DECL_SIMPLE_CONTENT(URL);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,PrivacyStatementURL,localizedURIType,SAML Metadata Extension for Login UI PrivacyStatementURL element);
+ DECL_SIMPLE_CONTENT(URL);
+ END_XMLOBJECT;
+
+ BEGIN_XMLOBJECT(SAML_API,UIInfo,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI UIInfo element);
+ DECL_TYPED_CHILDREN(DisplayName);
+ DECL_TYPED_CHILDREN(Description);
+ DECL_TYPED_CHILDREN(Keywords);
+ DECL_TYPED_CHILDREN(Logo);
+ DECL_TYPED_CHILDREN(InformationURL);
+ DECL_TYPED_CHILDREN(PrivacyStatementURL);
+ /** UIInfoType local name */
+ static const XMLCh TYPE_NAME[];
+ END_XMLOBJECT;
+
+ DECL_XMLOBJECT_SIMPLE(SAML_API,IPHint,Hint,SAML Metadata Extension for Login UI IPHint element);
+ DECL_XMLOBJECT_SIMPLE(SAML_API,DomainHint,Hint,SAML Metadata Extension for Login UI DomainHint element);
+ DECL_XMLOBJECT_SIMPLE(SAML_API,GeolocationHint,Hint,SAML Metadata Extension for Login UI GeolocationHint element);
+
+ BEGIN_XMLOBJECT(SAML_API,DiscoHints,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI DiscoHints element);
+ DECL_TYPED_CHILDREN(IPHint);
+ DECL_TYPED_CHILDREN(DomainHint);
+ DECL_TYPED_CHILDREN(GeolocationHint);
+ /** DiscoHintsType local name */
+ 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(nullptr)), 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);
+ }
+ };
+