CPPOST-95 - Add MD RPI extension implementation to metadata classes.
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / impl / MetadataSchemaValidators.cpp
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * MetadataSchemaValidators.cpp
23  *
24  * Schema-based validators for SAML 2.0 Metadata classes.
25  */
26
27 #include "internal.h"
28 #include "exceptions.h"
29 #include "saml2/metadata/Metadata.h"
30
31 #include <xmltooling/encryption/Encryption.h>
32 #include <xmltooling/validation/Validator.h>
33 #include <xmltooling/validation/ValidatorSuite.h>
34
35 using namespace opensaml::saml2md;
36 using namespace opensaml::saml2;
37 using namespace opensaml;
38 using namespace xmltooling;
39 using namespace std;
40 using samlconstants::SAML20MD_NS;
41 using samlconstants::SAML20MD_QUERY_EXT_NS;
42 using samlconstants::SAML20MD_ALGSUPPORT_NS;
43 using samlconstants::SAML20MD_ENTITY_ATTRIBUTE_NS;
44 using samlconstants::SAML20MD_UI_NS;
45 using samlconstants::SAML20MD_RPI_NS;
46 using samlconstants::SAML1MD_NS;
47 using samlconstants::IDP_DISCOVERY_PROTOCOL_NS;
48 using samlconstants::SP_REQUEST_INIT_NS;
49
50 namespace opensaml {
51     namespace saml2md {
52
53         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,ActionNamespace);
54         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,AffiliateMember);
55         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,AttributeProfile);
56         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,Company);
57         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,EmailAddress);
58         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,GivenName);
59         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,NameIDFormat);
60         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,SurName);
61         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,TelephoneNumber);
62
63         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,localizedNameType);
64             XMLOBJECTVALIDATOR_REQUIRE(localizedNameType,TextContent);
65             XMLOBJECTVALIDATOR_REQUIRE(localizedNameType,Lang);
66         END_XMLOBJECTVALIDATOR;
67
68         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,localizedURIType);
69             XMLOBJECTVALIDATOR_REQUIRE(localizedURIType,TextContent);
70             XMLOBJECTVALIDATOR_REQUIRE(localizedURIType,Lang);
71         END_XMLOBJECTVALIDATOR;
72
73         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationName);
74             XMLOBJECTVALIDATOR_REQUIRE(OrganizationName,TextContent);
75             XMLOBJECTVALIDATOR_REQUIRE(OrganizationName,Lang);
76         END_XMLOBJECTVALIDATOR;
77
78         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationDisplayName);
79             XMLOBJECTVALIDATOR_REQUIRE(OrganizationDisplayName,TextContent);
80             XMLOBJECTVALIDATOR_REQUIRE(OrganizationDisplayName,Lang);
81         END_XMLOBJECTVALIDATOR;
82
83         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationURL);
84             XMLOBJECTVALIDATOR_REQUIRE(OrganizationURL,TextContent);
85             XMLOBJECTVALIDATOR_REQUIRE(OrganizationURL,Lang);
86         END_XMLOBJECTVALIDATOR;
87
88         class SAML_DLLLOCAL checkWildcardNS {
89         public:
90             void operator()(const XMLObject* xmlObject) const {
91                 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
92                 if (XMLString::equals(ns,SAML20MD_NS) || !ns || !*ns) {
93                     throw ValidationException(
94                         "Object contains an illegal extension child element ($1).",
95                         params(1,xmlObject->getElementQName().toString().c_str())
96                         );
97                 }
98             }
99         };
100
101         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Extensions);
102             if (!ptr->hasChildren())
103                 throw ValidationException("Extensions must have at least one child element.");
104             const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
105             for_each(anys.begin(),anys.end(),checkWildcardNS());
106         END_XMLOBJECTVALIDATOR;
107
108         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Organization);
109             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationName);
110             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationDisplayName);
111             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationURL);
112         END_XMLOBJECTVALIDATOR;
113
114         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ContactPerson);
115             /* Pending errata decision.
116             if (!ptr->hasChildren())
117                 throw ValidationException("ContactPerson must have at least one child element.");
118                 */
119             if (!XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_TECHNICAL) &&
120                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_SUPPORT) &&
121                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_ADMINISTRATIVE) &&
122                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_BILLING) &&
123                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_OTHER))
124                 throw ValidationException("ContactPerson contactType must be one of the defined values.");
125         END_XMLOBJECTVALIDATOR;
126
127         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AdditionalMetadataLocation);
128             XMLOBJECTVALIDATOR_REQUIRE(AdditionalMetadataLocation,Namespace);
129             XMLOBJECTVALIDATOR_REQUIRE(AdditionalMetadataLocation,Location);
130         END_XMLOBJECTVALIDATOR;
131
132         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,KeyDescriptor);
133             XMLOBJECTVALIDATOR_REQUIRE(KeyDescriptor,KeyInfo);
134             if (ptr->getUse() &&
135                 !XMLString::equals(ptr->getUse(),KeyDescriptor::KEYTYPE_ENCRYPTION) &&
136                 !XMLString::equals(ptr->getUse(),KeyDescriptor::KEYTYPE_SIGNING))
137                 throw ValidationException("KeyDescriptor use must be empty or one of the defined values.");
138         END_XMLOBJECTVALIDATOR;
139
140         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,RoleDescriptor);
141             XMLOBJECTVALIDATOR_REQUIRE(RoleDescriptor,ProtocolSupportEnumeration);
142         END_XMLOBJECTVALIDATOR;
143
144         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EndpointType);
145             XMLOBJECTVALIDATOR_REQUIRE(EndpointType,Binding);
146             XMLOBJECTVALIDATOR_REQUIRE(EndpointType,Location);
147             const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
148             for_each(anys.begin(),anys.end(),checkWildcardNS());
149         END_XMLOBJECTVALIDATOR;
150
151         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,IndexedEndpointType,EndpointType);
152             EndpointTypeSchemaValidator::validate(xmlObject);
153             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(IndexedEndpointType,Index);
154         END_XMLOBJECTVALIDATOR;
155
156         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,ArtifactResolutionService,IndexedEndpointType);
157             IndexedEndpointTypeSchemaValidator::validate(xmlObject);
158         END_XMLOBJECTVALIDATOR;
159
160         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SingleLogoutService,EndpointType);
161             EndpointTypeSchemaValidator::validate(xmlObject);
162         END_XMLOBJECTVALIDATOR;
163
164         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,ManageNameIDService,EndpointType);
165             EndpointTypeSchemaValidator::validate(xmlObject);
166         END_XMLOBJECTVALIDATOR;
167
168         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SingleSignOnService,EndpointType);
169             EndpointTypeSchemaValidator::validate(xmlObject);
170         END_XMLOBJECTVALIDATOR;
171
172         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,NameIDMappingService,EndpointType);
173             EndpointTypeSchemaValidator::validate(xmlObject);
174         END_XMLOBJECTVALIDATOR;
175
176         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AssertionIDRequestService,EndpointType);
177             EndpointTypeSchemaValidator::validate(xmlObject);
178         END_XMLOBJECTVALIDATOR;
179
180         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,IDPSSODescriptor,RoleDescriptor);
181             RoleDescriptorSchemaValidator::validate(xmlObject);
182             XMLOBJECTVALIDATOR_NONEMPTY(IDPSSODescriptor,SingleSignOnService);
183         END_XMLOBJECTVALIDATOR;
184
185         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ServiceName);
186             XMLOBJECTVALIDATOR_REQUIRE(ServiceName,TextContent);
187             XMLOBJECTVALIDATOR_REQUIRE(ServiceName,Lang);
188         END_XMLOBJECTVALIDATOR;
189
190         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ServiceDescription);
191             XMLOBJECTVALIDATOR_REQUIRE(ServiceDescription,TextContent);
192             XMLOBJECTVALIDATOR_REQUIRE(ServiceDescription,Lang);
193         END_XMLOBJECTVALIDATOR;
194
195         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,RequestedAttribute);
196             XMLOBJECTVALIDATOR_REQUIRE(RequestedAttribute,Name);
197         END_XMLOBJECTVALIDATOR;
198
199         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AttributeConsumingService);
200             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(AttributeConsumingService,Index);
201             XMLOBJECTVALIDATOR_NONEMPTY(AttributeConsumingService,ServiceName);
202             XMLOBJECTVALIDATOR_NONEMPTY(AttributeConsumingService,RequestedAttribute);
203         END_XMLOBJECTVALIDATOR;
204
205         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AssertionConsumerService,IndexedEndpointType);
206             IndexedEndpointTypeSchemaValidator::validate(xmlObject);
207         END_XMLOBJECTVALIDATOR;
208
209         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SPSSODescriptor,RoleDescriptor);
210             RoleDescriptorSchemaValidator::validate(xmlObject);
211             XMLOBJECTVALIDATOR_NONEMPTY(SPSSODescriptor,AssertionConsumerService);
212         END_XMLOBJECTVALIDATOR;
213
214         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthnQueryService,EndpointType);
215             EndpointTypeSchemaValidator::validate(xmlObject);
216         END_XMLOBJECTVALIDATOR;
217
218         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthnAuthorityDescriptor,RoleDescriptor);
219             RoleDescriptorSchemaValidator::validate(xmlObject);
220             XMLOBJECTVALIDATOR_NONEMPTY(AuthnAuthorityDescriptor,AuthnQueryService);
221         END_XMLOBJECTVALIDATOR;
222
223         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthzService,EndpointType);
224             EndpointTypeSchemaValidator::validate(xmlObject);
225         END_XMLOBJECTVALIDATOR;
226
227         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,PDPDescriptor,RoleDescriptor);
228             RoleDescriptorSchemaValidator::validate(xmlObject);
229             XMLOBJECTVALIDATOR_NONEMPTY(PDPDescriptor,AuthzService);
230         END_XMLOBJECTVALIDATOR;
231
232         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AttributeService,EndpointType);
233             EndpointTypeSchemaValidator::validate(xmlObject);
234         END_XMLOBJECTVALIDATOR;
235
236         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AttributeAuthorityDescriptor,RoleDescriptor);
237             RoleDescriptorSchemaValidator::validate(xmlObject);
238             XMLOBJECTVALIDATOR_NONEMPTY(AttributeAuthorityDescriptor,AttributeService);
239         END_XMLOBJECTVALIDATOR;
240
241         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AffiliationDescriptor);
242             XMLOBJECTVALIDATOR_REQUIRE(AffiliationDescriptor,AffiliationOwnerID);
243             XMLOBJECTVALIDATOR_NONEMPTY(AffiliationDescriptor,AffiliateMember);
244         END_XMLOBJECTVALIDATOR;
245
246         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntityDescriptor);
247             XMLOBJECTVALIDATOR_REQUIRE(EntityDescriptor,EntityID);
248             if (ptr->getRoleDescriptors().empty() &&
249                 ptr->getIDPSSODescriptors().empty() &&
250                 ptr->getSPSSODescriptors().empty() &&
251                 ptr->getAuthnAuthorityDescriptors().empty() &&
252                 ptr->getAttributeAuthorityDescriptors().empty() &&
253                 ptr->getPDPDescriptors().empty()) {
254
255                 if (!ptr->getAffiliationDescriptor())
256                     throw ValidationException("EntityDescriptor must have at least one child role or affiliation descriptor.");
257             }
258             else if (ptr->getAffiliationDescriptor()) {
259                 throw ValidationException("EntityDescriptor cannot have both an AffiliationDescriptor and role descriptors.");
260             }
261         END_XMLOBJECTVALIDATOR;
262
263         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntitiesDescriptor);
264             if (ptr->getEntityDescriptors().empty() && ptr->getEntitiesDescriptors().empty())
265                 throw ValidationException("EntitiesDescriptor must contain at least one child descriptor.");
266         END_XMLOBJECTVALIDATOR;
267
268         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,SourceID);
269
270         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,DiscoveryResponse,IndexedEndpointType);
271             IndexedEndpointTypeSchemaValidator::validate(xmlObject);
272         END_XMLOBJECTVALIDATOR;
273
274         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,RequestInitiator,EndpointType);
275             EndpointTypeSchemaValidator::validate(xmlObject);
276         END_XMLOBJECTVALIDATOR;
277
278         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntityAttributes);
279             if (!ptr->hasChildren())
280                 throw ValidationException("EntityAttributes must contain at least one child element.");
281         END_XMLOBJECTVALIDATOR;
282
283         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,DigestMethod);
284             XMLOBJECTVALIDATOR_REQUIRE(DigestMethod,Algorithm);
285         END_XMLOBJECTVALIDATOR;
286
287         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,SigningMethod);
288             XMLOBJECTVALIDATOR_REQUIRE(SigningMethod,Algorithm);
289         END_XMLOBJECTVALIDATOR;
290
291         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,DisplayName);
292             XMLOBJECTVALIDATOR_REQUIRE(DisplayName,TextContent);
293             XMLOBJECTVALIDATOR_REQUIRE(DisplayName,Lang);
294         END_XMLOBJECTVALIDATOR;
295
296         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Description);
297             XMLOBJECTVALIDATOR_REQUIRE(Description,TextContent);
298             XMLOBJECTVALIDATOR_REQUIRE(Description,Lang);
299         END_XMLOBJECTVALIDATOR;
300
301         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Keywords);
302             XMLOBJECTVALIDATOR_REQUIRE(Keywords,TextContent);
303             XMLOBJECTVALIDATOR_REQUIRE(Keywords,Lang);
304         END_XMLOBJECTVALIDATOR;
305
306         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Logo);
307             XMLOBJECTVALIDATOR_REQUIRE(Logo,TextContent);
308             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Height);
309             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Width);
310         END_XMLOBJECTVALIDATOR;
311
312         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,InformationURL);
313             XMLOBJECTVALIDATOR_REQUIRE(InformationURL,TextContent);
314             XMLOBJECTVALIDATOR_REQUIRE(InformationURL,Lang);
315         END_XMLOBJECTVALIDATOR;
316
317         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,PrivacyStatementURL);
318             XMLOBJECTVALIDATOR_REQUIRE(PrivacyStatementURL,TextContent);
319             XMLOBJECTVALIDATOR_REQUIRE(PrivacyStatementURL,Lang);
320         END_XMLOBJECTVALIDATOR;
321
322         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,IPHint);
323         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,DomainHint);
324         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,GeolocationHint);
325
326         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,RegistrationInfo);
327             XMLOBJECTVALIDATOR_REQUIRE(RegistrationInfo,RegistrationAuthority);
328         END_XMLOBJECTVALIDATOR;
329
330         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,PublicationInfo);
331             XMLOBJECTVALIDATOR_REQUIRE(PublicationInfo,Publisher);
332         END_XMLOBJECTVALIDATOR;
333
334         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Publication);
335             XMLOBJECTVALIDATOR_REQUIRE(Publication,Publisher);
336         END_XMLOBJECTVALIDATOR;
337
338         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,RegistrationPolicy);
339         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,UsagePolicy);
340     };
341 };
342
343 #define REGISTER_ELEMENT(cname) \
344     q=xmltooling::QName(SAML20MD_NS,cname::LOCAL_NAME); \
345     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
346     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
347
348 #define REGISTER_TYPE(cname) \
349     q=xmltooling::QName(SAML20MD_NS,cname::TYPE_NAME); \
350     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
351     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
352
353 #define REGISTER_ELEMENT_UI(cname) \
354     q=xmltooling::QName(SAML20MD_UI_NS,cname::LOCAL_NAME); \
355     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
356     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
357
358 #define REGISTER_TYPE_UI(cname) \
359     q=xmltooling::QName(SAML20MD_UI_NS,cname::TYPE_NAME); \
360     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
361     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
362
363 #define REGISTER_ELEMENT_UI_NOVAL(cname) \
364     q=xmltooling::QName(SAML20MD_UI_NS,cname::LOCAL_NAME); \
365     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
366
367 #define REGISTER_TYPE_UI_NOVAL(cname) \
368     q=xmltooling::QName(SAML20MD_UI_NS,cname::TYPE_NAME); \
369     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
370
371 #define REGISTER_ELEMENT_RPI(cname) \
372     q=xmltooling::QName(SAML20MD_RPI_NS,cname::LOCAL_NAME); \
373     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
374     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
375
376 #define REGISTER_TYPE_RPI(cname) \
377     q=xmltooling::QName(SAML20MD_RPI_NS,cname::TYPE_NAME); \
378     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
379     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
380
381 #define REGISTER_ELEMENT_RPI_NOVAL(cname) \
382     q=xmltooling::QName(SAML20MD_RPI_NS,cname::LOCAL_NAME); \
383     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
384
385 #define REGISTER_TYPE_RPI_NOVAL(cname) \
386     q=xmltooling::QName(SAML20MD_RPI_NS,cname::TYPE_NAME); \
387     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
388
389 void opensaml::saml2md::registerMetadataClasses() {
390     xmltooling::QName q;
391     REGISTER_ELEMENT(AdditionalMetadataLocation);
392     REGISTER_ELEMENT(AffiliateMember);
393     REGISTER_ELEMENT(AffiliationDescriptor);
394     REGISTER_ELEMENT(ArtifactResolutionService);
395     REGISTER_ELEMENT(AssertionConsumerService);
396     REGISTER_ELEMENT(AssertionIDRequestService);
397     REGISTER_ELEMENT(AttributeAuthorityDescriptor);;
398     REGISTER_ELEMENT(AttributeConsumingService);
399     REGISTER_ELEMENT(AttributeProfile);
400     REGISTER_ELEMENT(AttributeService);
401     REGISTER_ELEMENT(AuthnAuthorityDescriptor);
402     REGISTER_ELEMENT(AuthnQueryService);
403     REGISTER_ELEMENT(AuthzService);
404     REGISTER_ELEMENT(Company);
405     REGISTER_ELEMENT(ContactPerson);
406     REGISTER_ELEMENT(EmailAddress);
407     REGISTER_ELEMENT(EntitiesDescriptor);
408     REGISTER_ELEMENT(EntityDescriptor);
409     REGISTER_ELEMENT(Extensions);
410     REGISTER_ELEMENT(GivenName);
411     REGISTER_ELEMENT(IDPSSODescriptor);
412     REGISTER_ELEMENT(KeyDescriptor);
413     REGISTER_ELEMENT(ManageNameIDService);
414     REGISTER_ELEMENT(NameIDFormat);
415     REGISTER_ELEMENT(NameIDMappingService);
416     REGISTER_ELEMENT(Organization);
417     REGISTER_ELEMENT(OrganizationDisplayName);
418     REGISTER_ELEMENT(OrganizationName);
419     REGISTER_ELEMENT(OrganizationURL);
420     REGISTER_ELEMENT(PDPDescriptor);
421     REGISTER_ELEMENT(RequestedAttribute);
422     REGISTER_ELEMENT(RoleDescriptor);
423     REGISTER_ELEMENT(ServiceDescription);
424     REGISTER_ELEMENT(ServiceName);
425     REGISTER_ELEMENT(SingleLogoutService);
426     REGISTER_ELEMENT(SingleSignOnService);
427     REGISTER_ELEMENT(SPSSODescriptor);
428     REGISTER_ELEMENT(SurName);
429     REGISTER_ELEMENT(TelephoneNumber);
430     REGISTER_TYPE(AdditionalMetadataLocation);
431     REGISTER_TYPE(AffiliationDescriptor);
432     REGISTER_TYPE(AttributeAuthorityDescriptor);;
433     REGISTER_TYPE(AttributeConsumingService);
434     REGISTER_TYPE(AuthnAuthorityDescriptor);
435     REGISTER_TYPE(ContactPerson);
436     REGISTER_TYPE(EndpointType);
437     REGISTER_TYPE(EntitiesDescriptor);
438     REGISTER_TYPE(EntityDescriptor);
439     REGISTER_TYPE(Extensions);
440     REGISTER_TYPE(IDPSSODescriptor);
441     REGISTER_TYPE(IndexedEndpointType);
442     REGISTER_TYPE(KeyDescriptor);
443     REGISTER_TYPE(localizedNameType);
444     REGISTER_TYPE(localizedURIType);
445     REGISTER_TYPE(Organization);
446     REGISTER_TYPE(PDPDescriptor);
447     REGISTER_TYPE(RequestedAttribute);
448     REGISTER_TYPE(SPSSODescriptor);
449
450     q=xmltooling::QName(SAML20MD_NS,xmlencryption::EncryptionMethod::LOCAL_NAME);
451     XMLObjectBuilder::registerBuilder(q,new xmlencryption::EncryptionMethodBuilder());
452
453     q=xmltooling::QName(SAML1MD_NS,SourceID::LOCAL_NAME);
454     XMLObjectBuilder::registerBuilder(q,new SourceIDBuilder());
455     SchemaValidators.registerValidator(q,new SourceIDSchemaValidator());
456
457     q=xmltooling::QName(IDP_DISCOVERY_PROTOCOL_NS,DiscoveryResponse::LOCAL_NAME);
458     XMLObjectBuilder::registerBuilder(q,new DiscoveryResponseBuilder());
459     SchemaValidators.registerValidator(q,new DiscoveryResponseSchemaValidator());
460
461     q=xmltooling::QName(SP_REQUEST_INIT_NS,RequestInitiator::LOCAL_NAME);
462     XMLObjectBuilder::registerBuilder(q,new RequestInitiatorBuilder());
463     SchemaValidators.registerValidator(q,new RequestInitiatorSchemaValidator());
464
465     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,ActionNamespace::LOCAL_NAME);
466     XMLObjectBuilder::registerBuilder(q,new ActionNamespaceBuilder());
467     SchemaValidators.registerValidator(q,new ActionNamespaceSchemaValidator());
468
469     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME);
470     XMLObjectBuilder::registerBuilder(q,new AuthnQueryDescriptorTypeBuilder());
471     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
472
473     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME);
474     XMLObjectBuilder::registerBuilder(q,new AttributeQueryDescriptorTypeBuilder());
475     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
476
477     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME);
478     XMLObjectBuilder::registerBuilder(q,new AuthzDecisionQueryDescriptorTypeBuilder());
479     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
480
481     q=xmltooling::QName(SAML20MD_ENTITY_ATTRIBUTE_NS,EntityAttributes::LOCAL_NAME);
482     XMLObjectBuilder::registerBuilder(q,new EntityAttributesBuilder());
483     SchemaValidators.registerValidator(q,new EntityAttributesSchemaValidator());
484
485     q=xmltooling::QName(SAML20MD_ENTITY_ATTRIBUTE_NS,EntityAttributes::TYPE_NAME);
486     XMLObjectBuilder::registerBuilder(q,new EntityAttributesBuilder());
487     SchemaValidators.registerValidator(q,new EntityAttributesSchemaValidator());
488
489     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,DigestMethod::LOCAL_NAME);
490     XMLObjectBuilder::registerBuilder(q,new DigestMethodBuilder());
491     SchemaValidators.registerValidator(q,new DigestMethodSchemaValidator());
492
493     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,DigestMethod::TYPE_NAME);
494     XMLObjectBuilder::registerBuilder(q,new DigestMethodBuilder());
495     SchemaValidators.registerValidator(q,new DigestMethodSchemaValidator());
496
497     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,SigningMethod::LOCAL_NAME);
498     XMLObjectBuilder::registerBuilder(q,new SigningMethodBuilder());
499     SchemaValidators.registerValidator(q,new SigningMethodSchemaValidator());
500
501     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,SigningMethod::TYPE_NAME);
502     XMLObjectBuilder::registerBuilder(q,new SigningMethodBuilder());
503     SchemaValidators.registerValidator(q,new SigningMethodSchemaValidator());
504
505     REGISTER_ELEMENT_UI(DisplayName);
506     REGISTER_ELEMENT_UI(Description);
507         REGISTER_ELEMENT_UI(Keywords);
508     REGISTER_ELEMENT_UI(Logo);
509     REGISTER_ELEMENT_UI(InformationURL);
510     REGISTER_ELEMENT_UI(PrivacyStatementURL);
511     REGISTER_ELEMENT_UI(IPHint);
512     REGISTER_ELEMENT_UI(DomainHint);
513     REGISTER_ELEMENT_UI(GeolocationHint);
514         REGISTER_TYPE_UI(Keywords);
515     REGISTER_TYPE_UI(Logo);
516     REGISTER_ELEMENT_UI_NOVAL(UIInfo);
517     REGISTER_ELEMENT_UI_NOVAL(DiscoHints);
518     REGISTER_TYPE_UI_NOVAL(UIInfo);
519     REGISTER_TYPE_UI_NOVAL(DiscoHints);
520
521     REGISTER_ELEMENT_RPI(RegistrationInfo);
522     REGISTER_ELEMENT_RPI(RegistrationPolicy);
523     REGISTER_ELEMENT_RPI(PublicationInfo);
524     REGISTER_ELEMENT_RPI(UsagePolicy);
525     REGISTER_ELEMENT_RPI(Publication);
526     REGISTER_TYPE_RPI(RegistrationInfo);
527     REGISTER_TYPE_RPI(PublicationInfo);
528     REGISTER_TYPE_RPI(Publication);
529     REGISTER_ELEMENT_RPI_NOVAL(PublicationPath);
530     REGISTER_TYPE_RPI_NOVAL(PublicationPath);
531 }