https://issues.shibboleth.net/jira/browse/SSPCPP-126
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / Metadata.h
1 /*
2  *  Copyright 2001-2007 Internet2
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file saml/saml2/metadata/Metadata.h
19  *
20  * XMLObjects representing the SAML 2.0 Metadata schema
21  */
22
23 #ifndef __saml2_metadata_h__
24 #define __saml2_metadata_h__
25
26 #include <saml/saml2/core/Assertions.h>
27 #include <xmltooling/util/Predicates.h>
28
29 #include <ctime>
30
31 #define DECL_SAML2MDOBJECTBUILDER(cname) \
32     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20MD_NS,samlconstants::SAML20MD_PREFIX)
33
34 namespace opensaml {
35
36     /**
37      * @namespace opensaml::saml2md
38      * SAML 2.0 metadata namespace
39      */
40     namespace saml2md {
41
42         /**
43          * Base class for metadata objects that feature a cacheDuration attribute.
44          */
45         class SAML_API CacheableSAMLObject : public virtual xmltooling::XMLObject
46         {
47         protected:
48             CacheableSAMLObject() {}
49         public:
50             ~CacheableSAMLObject() {}
51             DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
52         };
53
54         /**
55          * Base class for metadata objects that feature a validUntil attribute.
56          */
57         class SAML_API TimeBoundSAMLObject : public virtual xmltooling::XMLObject
58         {
59         protected:
60             TimeBoundSAMLObject() {}
61         public:
62             ~TimeBoundSAMLObject() {}
63             DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
64             /** Returns true iff the object is valid at the current time. */
65             bool isValid() const {
66                 return time(NULL) <= getValidUntilEpoch();
67             }
68             /** Returns true iff the object is valid at the supplied time. */
69             bool isValid(time_t t) const {
70                 return t <= getValidUntilEpoch();
71             }
72         };
73
74         DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element);
75         DECL_XMLOBJECT_SIMPLE(SAML_API,AttributeProfile,ProfileURI,SAML 2.0 AttributeProfile element);
76         DECL_XMLOBJECT_SIMPLE(SAML_API,Company,Name,SAML 2.0 Company element);
77         DECL_XMLOBJECT_SIMPLE(SAML_API,EmailAddress,Address,SAML 2.0 EmailAddress element);
78         DECL_XMLOBJECT_SIMPLE(SAML_API,GivenName,Name,SAML 2.0 GivenName element);
79         DECL_XMLOBJECT_SIMPLE(SAML_API,NameIDFormat,Format,SAML 2.0 NameIDFormat element);
80         DECL_XMLOBJECT_SIMPLE(SAML_API,SurName,Name,SAML 2.0 SurName element);
81         DECL_XMLOBJECT_SIMPLE(SAML_API,TelephoneNumber,Number,SAML 2.0 TelephoneNumber element);
82
83         DECL_XMLOBJECT_SIMPLE(SAML_API,ActionNamespace,Namespace,SAML 2.0 Metadata Extension ActionNamespace element);
84         DECL_XMLOBJECT_SIMPLE(SAML_API,SourceID,ID,SAML 1.x Metadata Profile SourceID element);
85
86         BEGIN_XMLOBJECT(SAML_API,localizedNameType,xmltooling::XMLObject,SAML 2.0 localizedNameType type);
87             DECL_STRING_ATTRIB(Lang,LANG);
88             /** localizedNameType local name */
89             static const XMLCh TYPE_NAME[];
90         END_XMLOBJECT;
91
92         BEGIN_XMLOBJECT(SAML_API,localizedURIType,xmltooling::XMLObject,SAML 2.0 localizedURIType type);
93             DECL_STRING_ATTRIB(Lang,LANG);
94             /** localizedURIType local name */
95             static const XMLCh TYPE_NAME[];
96         END_XMLOBJECT;
97
98         BEGIN_XMLOBJECT(SAML_API,OrganizationName,localizedNameType,SAML 2.0 OrganizationName element);
99             DECL_SIMPLE_CONTENT(Name);
100         END_XMLOBJECT;
101
102         BEGIN_XMLOBJECT(SAML_API,OrganizationDisplayName,localizedNameType,SAML 2.0 OrganizationDisplayName element);
103             DECL_SIMPLE_CONTENT(Name);
104         END_XMLOBJECT;
105
106         BEGIN_XMLOBJECT(SAML_API,OrganizationURL,localizedURIType,SAML 2.0 OrganizationURL element);
107             DECL_SIMPLE_CONTENT(URL);
108         END_XMLOBJECT;
109
110         BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Extensions element);
111             /** ExtensionsType local name */
112             static const XMLCh TYPE_NAME[];
113         END_XMLOBJECT;
114
115         BEGIN_XMLOBJECT(SAML_API,Organization,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 Organization element);
116             DECL_TYPED_CHILD(Extensions);
117             DECL_TYPED_CHILDREN(OrganizationName);
118             DECL_TYPED_CHILDREN(OrganizationDisplayName);
119             DECL_TYPED_CHILDREN(OrganizationURL);
120             /** OrganizationType local name */
121             static const XMLCh TYPE_NAME[];
122         END_XMLOBJECT;
123
124         BEGIN_XMLOBJECT(SAML_API,ContactPerson,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 ContactPerson element);
125             DECL_STRING_ATTRIB(ContactType,CONTACTTYPE);
126             DECL_TYPED_CHILD(Extensions);
127             DECL_TYPED_CHILD(Company);
128             DECL_TYPED_CHILD(GivenName);
129             DECL_TYPED_CHILD(SurName);
130             DECL_TYPED_CHILDREN(EmailAddress);
131             DECL_TYPED_CHILDREN(TelephoneNumber);
132             /** ContactType local name */
133             static const XMLCh TYPE_NAME[];
134             /** technical Contact Type */
135             static const XMLCh CONTACT_TECHNICAL[];
136             /** support Contact Type */
137             static const XMLCh CONTACT_SUPPORT[];
138             /** administrative Contact Type */
139             static const XMLCh CONTACT_ADMINISTRATIVE[];
140             /** billing Contact Type */
141             static const XMLCh CONTACT_BILLING[];
142             /** other Contact Type */
143             static const XMLCh CONTACT_OTHER[];
144         END_XMLOBJECT;
145
146         BEGIN_XMLOBJECT(SAML_API,AdditionalMetadataLocation,xmltooling::XMLObject,SAML 2.0 AdditionalMetadataLocation element);
147             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
148             DECL_SIMPLE_CONTENT(Location);
149             /** AdditionalMetadataLocationType local name */
150             static const XMLCh TYPE_NAME[];
151         END_XMLOBJECT;
152
153         BEGIN_XMLOBJECT(SAML_API,KeyDescriptor,xmltooling::XMLObject,SAML 2.0 KeyDescriptor element);
154             DECL_STRING_ATTRIB(Use,USE);
155             DECL_TYPED_FOREIGN_CHILD(KeyInfo,xmlsignature);
156             DECL_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption);
157             /** KeyDescriptorType local name */
158             static const XMLCh TYPE_NAME[];
159             /** encryption Key Type */
160             static const XMLCh KEYTYPE_ENCRYPTION[];
161             /** signing Key Type */
162             static const XMLCh KEYTYPE_SIGNING[];
163         END_XMLOBJECT;
164
165         BEGIN_XMLOBJECT4(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
166                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 RoleDescriptor abstract element);
167             DECL_STRING_ATTRIB(ID,ID);
168             DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION);
169             /** Searches the ProtocolSupportEnumeration attribute for the indicated protocol. */
170             virtual bool hasSupport(const XMLCh* protocol) const=0;
171             /** Adds the indicated protocol to the ProtocolSupportEnumeration attribute. */
172             virtual void addSupport(const XMLCh* protocol)=0;
173             DECL_STRING_ATTRIB(ErrorURL,ERRORURL);
174             DECL_TYPED_CHILD(Extensions);
175             DECL_TYPED_CHILDREN(KeyDescriptor);
176             DECL_TYPED_CHILD(Organization);
177             DECL_TYPED_CHILDREN(ContactPerson);
178         END_XMLOBJECT;
179
180         BEGIN_XMLOBJECT2(SAML_API,RoleDescriptorType,RoleDescriptor,xmltooling::ElementExtensibleXMLObject,SAML 2.0 RoleDescriptor extension);
181         END_XMLOBJECT;
182
183         BEGIN_XMLOBJECT(SAML_API,EndpointType,xmltooling::ElementProxy,SAML 2.0 EndpointType type);
184             DECL_STRING_ATTRIB(Binding,BINDING);
185             DECL_STRING_ATTRIB(Location,LOCATION);
186             DECL_STRING_ATTRIB(ResponseLocation,RESPONSELOCATION);
187             /** EndpointType local name */
188             static const XMLCh TYPE_NAME[];
189         END_XMLOBJECT;
190
191         BEGIN_XMLOBJECT(SAML_API,IndexedEndpointType,EndpointType,SAML 2.0 IndexedEndpointType type);
192             DECL_INTEGER_ATTRIB(Index,INDEX);
193             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
194             /** IndexedEndpointType local name */
195             static const XMLCh TYPE_NAME[];
196         END_XMLOBJECT;
197
198         BEGIN_XMLOBJECT(SAML_API,ArtifactResolutionService,IndexedEndpointType,SAML 2.0 ArtifactResolutionService element);
199         END_XMLOBJECT;
200
201         BEGIN_XMLOBJECT(SAML_API,SingleLogoutService,EndpointType,SAML 2.0 SingleLogoutService element);
202         END_XMLOBJECT;
203
204         BEGIN_XMLOBJECT(SAML_API,ManageNameIDService,EndpointType,SAML 2.0 ManageNameIDService element);
205         END_XMLOBJECT;
206
207         BEGIN_XMLOBJECT(SAML_API,SSODescriptorType,RoleDescriptor,SAML 2.0 SSODescriptorType abstract type);
208             DECL_TYPED_CHILDREN(ArtifactResolutionService);
209             DECL_TYPED_CHILDREN(SingleLogoutService);
210             DECL_TYPED_CHILDREN(ManageNameIDService);
211             DECL_TYPED_CHILDREN(NameIDFormat);
212             /** SSODescriptorType local name */
213             static const XMLCh TYPE_NAME[];
214         END_XMLOBJECT;
215
216         BEGIN_XMLOBJECT(SAML_API,SingleSignOnService,EndpointType,SAML 2.0 SingleSignOnService element);
217         END_XMLOBJECT;
218
219         BEGIN_XMLOBJECT(SAML_API,NameIDMappingService,EndpointType,SAML 2.0 NameIDMappingService element);
220         END_XMLOBJECT;
221
222         BEGIN_XMLOBJECT(SAML_API,AssertionIDRequestService,EndpointType,SAML 2.0 AssertionIDRequestService element);
223         END_XMLOBJECT;
224
225         BEGIN_XMLOBJECT(SAML_API,IDPSSODescriptor,SSODescriptorType,SAML 2.0 IDPSSODescriptor element);
226             DECL_BOOLEAN_ATTRIB(WantAuthnRequestsSigned,WANTAUTHNREQUESTSSIGNED,false);
227             DECL_TYPED_CHILDREN(SingleSignOnService);
228             DECL_TYPED_CHILDREN(NameIDMappingService);
229             DECL_TYPED_CHILDREN(AssertionIDRequestService);
230             DECL_TYPED_CHILDREN(AttributeProfile);
231             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
232             /** IDPSSODescriptorType local name */
233             static const XMLCh TYPE_NAME[];
234             DECL_ELEMENT_QNAME;
235         END_XMLOBJECT;
236
237         BEGIN_XMLOBJECT(SAML_API,ServiceName,localizedNameType,SAML 2.0 ServiceName element);
238             DECL_SIMPLE_CONTENT(Name);
239         END_XMLOBJECT;
240
241         BEGIN_XMLOBJECT(SAML_API,ServiceDescription,localizedNameType,SAML 2.0 ServiceDescription element);
242             DECL_SIMPLE_CONTENT(Description);
243         END_XMLOBJECT;
244
245         BEGIN_XMLOBJECT(SAML_API,RequestedAttribute,saml2::Attribute,SAML 2.0 RequestedAttribute element);
246             DECL_BOOLEAN_ATTRIB(isRequired,ISREQUIRED,false);
247             /** RequestedAttributeType local name */
248             static const XMLCh TYPE_NAME[];
249         END_XMLOBJECT;
250
251         BEGIN_XMLOBJECT(SAML_API,AttributeConsumingService,xmltooling::XMLObject,SAML 2.0 AttributeConsumingService element);
252             DECL_INTEGER_ATTRIB(Index,INDEX);
253             DECL_BOOLEAN_ATTRIB(isDefault,ISDEFAULT,false);
254             DECL_TYPED_CHILDREN(ServiceName);
255             DECL_TYPED_CHILDREN(ServiceDescription);
256             DECL_TYPED_CHILDREN(RequestedAttribute);
257             /** AttributeConsumingServiceType local name */
258             static const XMLCh TYPE_NAME[];
259         END_XMLOBJECT;
260
261         BEGIN_XMLOBJECT(SAML_API,AssertionConsumerService,IndexedEndpointType,SAML 2.0 AssertionConsumerService element);
262         END_XMLOBJECT;
263
264         BEGIN_XMLOBJECT(SAML_API,SPSSODescriptor,SSODescriptorType,SAML 2.0 SPSSODescriptor element);
265             DECL_BOOLEAN_ATTRIB(AuthnRequestsSigned,AUTHNREQUESTSSIGNED,false);
266             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
267             DECL_TYPED_CHILDREN(AssertionConsumerService);
268             DECL_TYPED_CHILDREN(AttributeConsumingService);
269             /** SPSSODescriptorType local name */
270             static const XMLCh TYPE_NAME[];
271             DECL_ELEMENT_QNAME;
272         END_XMLOBJECT;
273
274         BEGIN_XMLOBJECT(SAML_API,AuthnQueryService,EndpointType,SAML 2.0 AuthnQueryService element);
275         END_XMLOBJECT;
276
277         BEGIN_XMLOBJECT(SAML_API,AuthnAuthorityDescriptor,RoleDescriptor,SAML 2.0 AuthnAuthorityDescriptor element);
278             DECL_TYPED_CHILDREN(AuthnQueryService);
279             DECL_TYPED_CHILDREN(AssertionIDRequestService);
280             DECL_TYPED_CHILDREN(NameIDFormat);
281             /** AuthnAuthorityDescriptorType local name */
282             static const XMLCh TYPE_NAME[];
283             DECL_ELEMENT_QNAME;
284         END_XMLOBJECT;
285
286         BEGIN_XMLOBJECT(SAML_API,AuthzService,EndpointType,SAML 2.0 AuthzService element);
287         END_XMLOBJECT;
288
289         BEGIN_XMLOBJECT(SAML_API,PDPDescriptor,RoleDescriptor,SAML 2.0 PDPDescriptor element);
290             DECL_TYPED_CHILDREN(AuthzService);
291             DECL_TYPED_CHILDREN(AssertionIDRequestService);
292             DECL_TYPED_CHILDREN(NameIDFormat);
293             /** PDPDescriptorType local name */
294             static const XMLCh TYPE_NAME[];
295             DECL_ELEMENT_QNAME;
296         END_XMLOBJECT;
297
298         BEGIN_XMLOBJECT(SAML_API,AttributeService,EndpointType,SAML 2.0 AttributeService element);
299         END_XMLOBJECT;
300
301         BEGIN_XMLOBJECT(SAML_API,AttributeAuthorityDescriptor,RoleDescriptor,SAML 2.0 AttributeAuthorityDescriptor element);
302             DECL_TYPED_CHILDREN(AttributeService);
303             DECL_TYPED_CHILDREN(AssertionIDRequestService);
304             DECL_TYPED_CHILDREN(NameIDFormat);
305             DECL_TYPED_CHILDREN(AttributeProfile);
306             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
307             /** AttributeAuthorityDescriptorType local name */
308             static const XMLCh TYPE_NAME[];
309             DECL_ELEMENT_QNAME;
310         END_XMLOBJECT;
311
312         BEGIN_XMLOBJECT(SAML_API,QueryDescriptorType,RoleDescriptor,SAML 2.0 QueryDescriptorType abstract type);
313             DECL_BOOLEAN_ATTRIB(WantAssertionsSigned,WANTASSERTIONSSIGNED,false);
314             DECL_TYPED_CHILDREN(NameIDFormat);
315             /** QueryDescriptorType local name */
316             static const XMLCh TYPE_NAME[];
317         END_XMLOBJECT;
318
319         BEGIN_XMLOBJECT(SAML_API,AuthnQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthnQueryDescriptorType extension type);
320             /** AuthnQueryDescriptorType local name */
321             static const XMLCh TYPE_NAME[];
322             DECL_TYPE_QNAME;
323         END_XMLOBJECT;
324
325         BEGIN_XMLOBJECT(SAML_API,AttributeQueryDescriptorType,QueryDescriptorType,SAML 2.0 AttributeQueryDescriptorType extension type);
326             DECL_TYPED_CHILDREN(AttributeConsumingService);
327             /** AttributeQueryDescriptorType local name */
328             static const XMLCh TYPE_NAME[];
329             DECL_TYPE_QNAME;
330         END_XMLOBJECT;
331
332         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionQueryDescriptorType,QueryDescriptorType,SAML 2.0 AuthzDecisionQueryDescriptorType extension type);
333             DECL_TYPED_CHILDREN(ActionNamespace);
334             /** AuthzDecisionQueryDescriptorType local name */
335             static const XMLCh TYPE_NAME[];
336             DECL_TYPE_QNAME;
337         END_XMLOBJECT;
338
339         BEGIN_XMLOBJECT4(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
340                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 AffiliationDescriptor element);
341             DECL_STRING_ATTRIB(ID,ID);
342             DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID);
343             DECL_TYPED_CHILD(Extensions);
344             DECL_TYPED_CHILDREN(AffiliateMember);
345             DECL_TYPED_CHILDREN(KeyDescriptor);
346             /** AffiliationDescriptorType local name */
347             static const XMLCh TYPE_NAME[];
348         END_XMLOBJECT;
349
350         BEGIN_XMLOBJECT4(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
351                 CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 EntityDescriptor element);
352             DECL_STRING_ATTRIB(ID,ID);
353             DECL_STRING_ATTRIB(EntityID,ENTITYID);
354             DECL_TYPED_CHILD(Extensions);
355             DECL_TYPED_CHILD(AffiliationDescriptor);
356             DECL_TYPED_CHILDREN(RoleDescriptor);
357             DECL_TYPED_CHILDREN(IDPSSODescriptor);
358             DECL_TYPED_CHILDREN(SPSSODescriptor);
359             DECL_TYPED_CHILDREN(AuthnAuthorityDescriptor);
360             DECL_TYPED_CHILDREN(AttributeAuthorityDescriptor);
361             DECL_TYPED_CHILDREN(PDPDescriptor);
362             DECL_TYPED_CHILDREN(AuthnQueryDescriptorType);
363             DECL_TYPED_CHILDREN(AttributeQueryDescriptorType);
364             DECL_TYPED_CHILDREN(AuthzDecisionQueryDescriptorType);
365             DECL_TYPED_CHILD(Organization);
366             DECL_TYPED_CHILDREN(ContactPerson);
367             DECL_TYPED_CHILDREN(AdditionalMetadataLocation);
368             /** Finds an arbitrary role type supporting a given protocol. */
369             virtual const RoleDescriptor* getRoleDescriptor(const xmltooling::QName& qname, const XMLCh* protocol) const=0;
370             /** EntityDescriptorType local name */
371             static const XMLCh TYPE_NAME[];
372         END_XMLOBJECT;
373
374         BEGIN_XMLOBJECT3(SAML_API,EntitiesDescriptor,SignableObject,CacheableSAMLObject,
375                 TimeBoundSAMLObject,SAML 2.0 EntitiesDescriptor element);
376             DECL_STRING_ATTRIB(ID,ID);
377             DECL_STRING_ATTRIB(Name,NAME);
378             DECL_TYPED_CHILD(Extensions);
379             DECL_TYPED_CHILDREN(EntityDescriptor);
380             DECL_TYPED_CHILDREN(EntitiesDescriptor);
381             /** EntitiesDescriptorType local name */
382             static const XMLCh TYPE_NAME[];
383         END_XMLOBJECT;
384
385         /**
386          * Predicate to test a role for validity and protocol support.
387          */
388         class isValidForProtocol
389         {
390         public:
391             /**
392              * Constructor.
393              *
394              * @param protocol  support constant to test for
395              */
396             isValidForProtocol(const XMLCh* protocol) : m_time(time(NULL)), m_protocol(protocol) {
397             }
398
399             /**
400              * Returns true iff the supplied role is valid now and supports the right protocol.
401              *
402              * @param role  role to test
403              * @return  result of predicate
404              */
405             bool operator()(const RoleDescriptor* role) const {
406                 return role ? (role->isValid(m_time) && role->hasSupport(m_protocol)) : false;
407             }
408
409         private:
410             time_t m_time;
411             const XMLCh* m_protocol;
412         };
413
414         /**
415          * Predicate to test a role for type equivalence, validity, and protocol support.
416          */
417         class ofTypeValidForProtocol : public isValidForProtocol, public xmltooling::hasSchemaType
418         {
419         public:
420             /**
421              * Constructor.
422              *
423              * @param q         schema type to test for
424              * @param protocol  support constant to test for
425              */
426             ofTypeValidForProtocol(const xmltooling::QName& q, const XMLCh* protocol)
427                 : isValidForProtocol(protocol), xmltooling::hasSchemaType(q)  {
428             }
429
430             /**
431              * Returns true iff the supplied role is of the right type, valid now, and supports the right protocol.
432              *
433              * @param role  role to test
434              * @return  result of predicate
435              */
436             bool operator()(const RoleDescriptor* role) const {
437                 return xmltooling::hasSchemaType::operator()(role) && isValidForProtocol::operator()(role);
438             }
439         };
440
441         DECL_SAML2MDOBJECTBUILDER(AdditionalMetadataLocation);
442         DECL_SAML2MDOBJECTBUILDER(AffiliateMember);
443         DECL_SAML2MDOBJECTBUILDER(AffiliationDescriptor);
444         DECL_SAML2MDOBJECTBUILDER(ArtifactResolutionService);
445         DECL_SAML2MDOBJECTBUILDER(AssertionConsumerService);
446         DECL_SAML2MDOBJECTBUILDER(AssertionIDRequestService);
447         DECL_SAML2MDOBJECTBUILDER(AttributeAuthorityDescriptor);
448         DECL_SAML2MDOBJECTBUILDER(AttributeConsumingService);
449         DECL_SAML2MDOBJECTBUILDER(AttributeProfile);
450         DECL_SAML2MDOBJECTBUILDER(AttributeService);
451         DECL_SAML2MDOBJECTBUILDER(AuthnAuthorityDescriptor);
452         DECL_SAML2MDOBJECTBUILDER(AuthnQueryService);
453         DECL_SAML2MDOBJECTBUILDER(AuthzService);
454         DECL_SAML2MDOBJECTBUILDER(Company);
455         DECL_SAML2MDOBJECTBUILDER(ContactPerson);
456         DECL_SAML2MDOBJECTBUILDER(EmailAddress);
457         DECL_SAML2MDOBJECTBUILDER(EntitiesDescriptor);
458         DECL_SAML2MDOBJECTBUILDER(EntityDescriptor);
459         DECL_SAML2MDOBJECTBUILDER(Extensions);
460         DECL_SAML2MDOBJECTBUILDER(GivenName);
461         DECL_SAML2MDOBJECTBUILDER(IDPSSODescriptor);
462         DECL_SAML2MDOBJECTBUILDER(KeyDescriptor);
463         DECL_SAML2MDOBJECTBUILDER(ManageNameIDService);
464         DECL_SAML2MDOBJECTBUILDER(NameIDFormat);
465         DECL_SAML2MDOBJECTBUILDER(NameIDMappingService);
466         DECL_SAML2MDOBJECTBUILDER(Organization);
467         DECL_SAML2MDOBJECTBUILDER(OrganizationName);
468         DECL_SAML2MDOBJECTBUILDER(OrganizationDisplayName);
469         DECL_SAML2MDOBJECTBUILDER(OrganizationURL);
470         DECL_SAML2MDOBJECTBUILDER(PDPDescriptor);
471         DECL_SAML2MDOBJECTBUILDER(RequestedAttribute);
472         DECL_SAML2MDOBJECTBUILDER(ServiceDescription);
473         DECL_SAML2MDOBJECTBUILDER(ServiceName);
474         DECL_SAML2MDOBJECTBUILDER(SingleLogoutService);
475         DECL_SAML2MDOBJECTBUILDER(SingleSignOnService);
476         DECL_SAML2MDOBJECTBUILDER(SPSSODescriptor);
477         DECL_SAML2MDOBJECTBUILDER(SurName);
478         DECL_SAML2MDOBJECTBUILDER(TelephoneNumber);
479
480         DECL_XMLOBJECTBUILDER(SAML_API,ActionNamespace,samlconstants::SAML20MD_QUERY_EXT_NS,samlconstants::SAML20MD_QUERY_EXT_PREFIX);
481         DECL_XMLOBJECTBUILDER(SAML_API,SourceID,samlconstants::SAML1MD_NS,samlconstants::SAML1MD_PREFIX);
482
483         /**
484          * Builder for localizedNameType objects.
485          *
486          * This is customized to force the element name to be specified.
487          */
488         class SAML_API localizedNameTypeBuilder : public xmltooling::XMLObjectBuilder {
489         public:
490             virtual ~localizedNameTypeBuilder() {}
491             /** Builder that allows element/type override. */
492 #ifdef HAVE_COVARIANT_RETURNS
493             virtual localizedNameType* buildObject(
494 #else
495             virtual xmltooling::XMLObject* buildObject(
496 #endif
497                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
498                 ) const;
499
500             /** Singleton builder. */
501             static localizedNameType* buildlocalizedNameType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
502                 const localizedNameTypeBuilder* b = dynamic_cast<const localizedNameTypeBuilder*>(
503                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME))
504                     );
505                 if (b) {
506                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedNameType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
507 #ifdef HAVE_COVARIANT_RETURNS
508                     return b->buildObject(nsURI, localName, prefix, &schemaType);
509 #else
510                     return dynamic_cast<localizedNameType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
511 #endif
512                 }
513                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedNameType.");
514             }
515         };
516
517         /**
518          * Builder for localizedURIType objects.
519          *
520          * This is customized to force the element name to be specified.
521          */
522         class SAML_API localizedURITypeBuilder : public xmltooling::XMLObjectBuilder {
523         public:
524             virtual ~localizedURITypeBuilder() {}
525             /** Builder that allows element/type override. */
526 #ifdef HAVE_COVARIANT_RETURNS
527             virtual localizedURIType* buildObject(
528 #else
529             virtual xmltooling::XMLObject* buildObject(
530 #endif
531                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
532                 ) const;
533
534             /** Singleton builder. */
535             static localizedURIType* buildlocalizedURIType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
536                 const localizedURITypeBuilder* b = dynamic_cast<const localizedURITypeBuilder*>(
537                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME))
538                     );
539                 if (b) {
540                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,localizedURIType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
541 #ifdef HAVE_COVARIANT_RETURNS
542                     return b->buildObject(nsURI, localName, prefix, &schemaType);
543 #else
544                     return dynamic_cast<localizedURIType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
545 #endif
546                 }
547                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for localizedURIType.");
548             }
549         };
550
551         /**
552          * Builder for EndpointType objects.
553          *
554          * This is customized to force the element name to be specified.
555          */
556         class SAML_API EndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
557         public:
558             virtual ~EndpointTypeBuilder() {}
559             /** Builder that allows element/type override. */
560 #ifdef HAVE_COVARIANT_RETURNS
561             virtual EndpointType* buildObject(
562 #else
563             virtual xmltooling::XMLObject* buildObject(
564 #endif
565                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
566                 ) const;
567
568             /** Singleton builder. */
569             static EndpointType* buildEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
570                 const EndpointTypeBuilder* b = dynamic_cast<const EndpointTypeBuilder*>(
571                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME))
572                     );
573                 if (b) {
574                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,EndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
575 #ifdef HAVE_COVARIANT_RETURNS
576                     return b->buildObject(nsURI, localName, prefix, &schemaType);
577 #else
578                     return dynamic_cast<EndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
579 #endif
580                 }
581                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for EndpointType.");
582             }
583         };
584
585         /**
586          * Builder for IndexedEndpointType objects.
587          *
588          * This is customized to force the element name to be specified.
589          */
590         class SAML_API IndexedEndpointTypeBuilder : public xmltooling::XMLObjectBuilder {
591         public:
592             virtual ~IndexedEndpointTypeBuilder() {}
593             /** Builder that allows element/type override. */
594 #ifdef HAVE_COVARIANT_RETURNS
595             virtual IndexedEndpointType* buildObject(
596 #else
597             virtual xmltooling::XMLObject* buildObject(
598 #endif
599                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
600                 ) const;
601
602             /** Singleton builder. */
603             static IndexedEndpointType* buildIndexedEndpointType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
604                 const IndexedEndpointTypeBuilder* b = dynamic_cast<const IndexedEndpointTypeBuilder*>(
605                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME))
606                     );
607                 if (b) {
608                     xmltooling::QName schemaType(samlconstants::SAML20MD_NS,IndexedEndpointType::TYPE_NAME,samlconstants::SAML20MD_PREFIX);
609 #ifdef HAVE_COVARIANT_RETURNS
610                     return b->buildObject(nsURI, localName, prefix, &schemaType);
611 #else
612                     return dynamic_cast<IndexedEndpointType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
613 #endif
614                 }
615                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for IndexedEndpointType.");
616             }
617         };
618
619         /**
620          * Builder for RoleDescriptor extension objects.
621          *
622          * This is customized to force the schema type to be specified.
623          */
624         class SAML_API RoleDescriptorBuilder : public xmltooling::XMLObjectBuilder {
625         public:
626             virtual ~RoleDescriptorBuilder() {}
627             /** Builder that allows element/type override. */
628 #ifdef HAVE_COVARIANT_RETURNS
629             virtual RoleDescriptor* buildObject(
630 #else
631             virtual xmltooling::XMLObject* buildObject(
632 #endif
633                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
634                 ) const;
635
636             /** Singleton builder. */
637             static RoleDescriptor* buildRoleDescriptor(const xmltooling::QName& schemaType) {
638                 const RoleDescriptorBuilder* b = dynamic_cast<const RoleDescriptorBuilder*>(
639                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_NS,RoleDescriptor::LOCAL_NAME))
640                     );
641                 if (b) {
642 #ifdef HAVE_COVARIANT_RETURNS
643                     return b->buildObject(samlconstants::SAML20MD_NS, RoleDescriptor::LOCAL_NAME, samlconstants::SAML20MD_PREFIX, &schemaType);
644 #else
645                     return dynamic_cast<RoleDescriptor*>(b->buildObject(samlconstants::SAML20MD_NS, RoleDescriptor::LOCAL_NAME, samlconstants::SAML20MD_PREFIX, &schemaType));
646 #endif
647                 }
648                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for RoleDescriptor.");
649             }
650         };
651
652         /**
653          * Builder for AuthnQueryDescriptorType objects.
654          *
655          * This is customized to return a RoleDescriptor element with an
656          * xsi:type of AuthnQueryDescriptorType.
657          */
658         class SAML_API AuthnQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
659         public:
660             virtual ~AuthnQueryDescriptorTypeBuilder() {}
661             /** Default builder. */
662 #ifdef HAVE_COVARIANT_RETURNS
663             virtual AuthnQueryDescriptorType* buildObject() const {
664 #else
665             virtual xmltooling::XMLObject* buildObject() const {
666 #endif
667                 xmltooling::QName schemaType(
668                     samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
669                     );
670                 return buildObject(
671                     samlconstants::SAML20MD_NS,AuthnQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
672                     );
673             }
674             /** Builder that allows element/type override. */
675 #ifdef HAVE_COVARIANT_RETURNS
676             virtual AuthnQueryDescriptorType* buildObject(
677 #else
678             virtual xmltooling::XMLObject* buildObject(
679 #endif
680                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
681                 ) const;
682
683             /** Singleton builder. */
684             static AuthnQueryDescriptorType* buildAuthnQueryDescriptorType() {
685                 const AuthnQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthnQueryDescriptorTypeBuilder*>(
686                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME))
687                     );
688                 if (b) {
689 #ifdef HAVE_COVARIANT_RETURNS
690                     return b->buildObject();
691 #else
692                     return dynamic_cast<AuthnQueryDescriptorType*>(b->buildObject());
693 #endif
694                 }
695                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthnQueryDescriptorType.");
696             }
697         };
698
699         /**
700          * Builder for AttributeQueryDescriptorType objects.
701          *
702          * This is customized to return a RoleDescriptor element with an
703          * xsi:type of AttributeQueryDescriptorType.
704          */
705         class SAML_API AttributeQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
706         public:
707             virtual ~AttributeQueryDescriptorTypeBuilder() {}
708             /** Default builder. */
709 #ifdef HAVE_COVARIANT_RETURNS
710             virtual AttributeQueryDescriptorType* buildObject() const {
711 #else
712             virtual xmltooling::XMLObject* buildObject() const {
713 #endif
714                 xmltooling::QName schemaType(
715                     samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
716                     );
717                 return buildObject(
718                     samlconstants::SAML20MD_NS,AttributeQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
719                     );
720             }
721             /** Builder that allows element/type override. */
722 #ifdef HAVE_COVARIANT_RETURNS
723             virtual AttributeQueryDescriptorType* buildObject(
724 #else
725             virtual xmltooling::XMLObject* buildObject(
726 #endif
727                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
728                 ) const;
729
730             /** Singleton builder. */
731             static AttributeQueryDescriptorType* buildAttributeQueryDescriptorType() {
732                 const AttributeQueryDescriptorTypeBuilder* b = dynamic_cast<const AttributeQueryDescriptorTypeBuilder*>(
733                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME))
734                     );
735                 if (b) {
736 #ifdef HAVE_COVARIANT_RETURNS
737                     return b->buildObject();
738 #else
739                     return dynamic_cast<AttributeQueryDescriptorType*>(b->buildObject());
740 #endif
741                 }
742                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AttributeQueryDescriptorType.");
743             }
744         };
745
746         /**
747          * Builder for AuthzDecisionQueryDescriptorType objects.
748          *
749          * This is customized to return a RoleDescriptor element with an
750          * xsi:type of AuthzDecisionQueryDescriptorType.
751          */
752         class SAML_API AuthzDecisionQueryDescriptorTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
753         public:
754             virtual ~AuthzDecisionQueryDescriptorTypeBuilder() {}
755             /** Default builder. */
756 #ifdef HAVE_COVARIANT_RETURNS
757             virtual AuthzDecisionQueryDescriptorType* buildObject() const {
758 #else
759             virtual xmltooling::XMLObject* buildObject() const {
760 #endif
761                 xmltooling::QName schemaType(
762                     samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME,samlconstants::SAML20MD_QUERY_EXT_PREFIX
763                     );
764                 return buildObject(
765                     samlconstants::SAML20MD_NS,AuthzDecisionQueryDescriptorType::LOCAL_NAME,samlconstants::SAML20MD_PREFIX,&schemaType
766                     );
767             }
768             /** Builder that allows element/type override. */
769 #ifdef HAVE_COVARIANT_RETURNS
770             virtual AuthzDecisionQueryDescriptorType* buildObject(
771 #else
772             virtual xmltooling::XMLObject* buildObject(
773 #endif
774                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
775                 ) const;
776
777             /** Singleton builder. */
778             static AuthzDecisionQueryDescriptorType* buildAuthzDecisionQueryDescriptorType() {
779                 const AuthzDecisionQueryDescriptorTypeBuilder* b = dynamic_cast<const AuthzDecisionQueryDescriptorTypeBuilder*>(
780                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME))
781                     );
782                 if (b) {
783 #ifdef HAVE_COVARIANT_RETURNS
784                     return b->buildObject();
785 #else
786                     return dynamic_cast<AuthzDecisionQueryDescriptorType*>(b->buildObject());
787 #endif
788                 }
789                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for AuthzDecisionQueryDescriptorType.");
790             }
791         };
792
793         /**
794          * Registers builders and validators for SAML 2.0 Metadata classes into the runtime.
795          */
796         void SAML_API registerMetadataClasses();
797     };
798 };
799
800 #endif /* __saml2_metadata_h__ */