97e221a492c778f2f48f7efabadb072b3136c79d
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / impl / MetadataSchemaValidators.cpp
1 /*
2  *  Copyright 2001-2010 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  * MetadataSchemaValidators.cpp
19  *
20  * Schema-based validators for SAML 2.0 Metadata classes.
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml2/metadata/Metadata.h"
26
27 #include <xmltooling/encryption/Encryption.h>
28 #include <xmltooling/validation/Validator.h>
29 #include <xmltooling/validation/ValidatorSuite.h>
30
31 using namespace opensaml::saml2md;
32 using namespace opensaml::saml2;
33 using namespace opensaml;
34 using namespace xmltooling;
35 using namespace std;
36 using samlconstants::SAML20MD_NS;
37 using samlconstants::SAML20MD_QUERY_EXT_NS;
38 using samlconstants::SAML20MD_ALGSUPPORT_NS;
39 using samlconstants::SAML20MD_ENTITY_ATTRIBUTE_NS;
40 using samlconstants::SAML20MD_UI_NS;
41
42 namespace opensaml {
43     namespace saml2md {
44
45         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,ActionNamespace);
46         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,AffiliateMember);
47         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,AttributeProfile);
48         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,Company);
49         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,EmailAddress);
50         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,GivenName);
51         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,NameIDFormat);
52         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,SurName);
53         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,TelephoneNumber);
54
55         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,localizedNameType);
56             XMLOBJECTVALIDATOR_REQUIRE(localizedNameType,TextContent);
57             XMLOBJECTVALIDATOR_REQUIRE(localizedNameType,Lang);
58         END_XMLOBJECTVALIDATOR;
59
60         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,localizedURIType);
61             XMLOBJECTVALIDATOR_REQUIRE(localizedURIType,TextContent);
62             XMLOBJECTVALIDATOR_REQUIRE(localizedURIType,Lang);
63         END_XMLOBJECTVALIDATOR;
64
65         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationName);
66             XMLOBJECTVALIDATOR_REQUIRE(OrganizationName,TextContent);
67             XMLOBJECTVALIDATOR_REQUIRE(OrganizationName,Lang);
68         END_XMLOBJECTVALIDATOR;
69
70         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationDisplayName);
71             XMLOBJECTVALIDATOR_REQUIRE(OrganizationDisplayName,TextContent);
72             XMLOBJECTVALIDATOR_REQUIRE(OrganizationDisplayName,Lang);
73         END_XMLOBJECTVALIDATOR;
74
75         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,OrganizationURL);
76             XMLOBJECTVALIDATOR_REQUIRE(OrganizationURL,TextContent);
77             XMLOBJECTVALIDATOR_REQUIRE(OrganizationURL,Lang);
78         END_XMLOBJECTVALIDATOR;
79
80         class SAML_DLLLOCAL checkWildcardNS {
81         public:
82             void operator()(const XMLObject* xmlObject) const {
83                 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
84                 if (XMLString::equals(ns,SAML20MD_NS) || !ns || !*ns) {
85                     throw ValidationException(
86                         "Object contains an illegal extension child element ($1).",
87                         params(1,xmlObject->getElementQName().toString().c_str())
88                         );
89                 }
90             }
91         };
92
93         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Extensions);
94             if (!ptr->hasChildren())
95                 throw ValidationException("Extensions must have at least one child element.");
96             const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
97             for_each(anys.begin(),anys.end(),checkWildcardNS());
98         END_XMLOBJECTVALIDATOR;
99
100         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Organization);
101             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationName);
102             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationDisplayName);
103             XMLOBJECTVALIDATOR_NONEMPTY(Organization,OrganizationURL);
104         END_XMLOBJECTVALIDATOR;
105
106         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ContactPerson);
107             /* Pending errata decision.
108             if (!ptr->hasChildren())
109                 throw ValidationException("ContactPerson must have at least one child element.");
110                 */
111             if (!XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_TECHNICAL) &&
112                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_SUPPORT) &&
113                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_ADMINISTRATIVE) &&
114                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_BILLING) &&
115                 !XMLString::equals(ptr->getContactType(),ContactPerson::CONTACT_OTHER))
116                 throw ValidationException("ContactPerson contactType must be one of the defined values.");
117         END_XMLOBJECTVALIDATOR;
118
119         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AdditionalMetadataLocation);
120             XMLOBJECTVALIDATOR_REQUIRE(AdditionalMetadataLocation,Namespace);
121             XMLOBJECTVALIDATOR_REQUIRE(AdditionalMetadataLocation,Location);
122         END_XMLOBJECTVALIDATOR;
123
124         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,KeyDescriptor);
125             XMLOBJECTVALIDATOR_REQUIRE(KeyDescriptor,KeyInfo);
126             if (ptr->getUse() &&
127                 !XMLString::equals(ptr->getUse(),KeyDescriptor::KEYTYPE_ENCRYPTION) &&
128                 !XMLString::equals(ptr->getUse(),KeyDescriptor::KEYTYPE_SIGNING))
129                 throw ValidationException("KeyDescriptor use must be empty or one of the defined values.");
130         END_XMLOBJECTVALIDATOR;
131
132         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,RoleDescriptor);
133             XMLOBJECTVALIDATOR_REQUIRE(RoleDescriptor,ProtocolSupportEnumeration);
134         END_XMLOBJECTVALIDATOR;
135
136         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EndpointType);
137             XMLOBJECTVALIDATOR_REQUIRE(EndpointType,Binding);
138             XMLOBJECTVALIDATOR_REQUIRE(EndpointType,Location);
139             const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
140             for_each(anys.begin(),anys.end(),checkWildcardNS());
141         END_XMLOBJECTVALIDATOR;
142
143         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,IndexedEndpointType,EndpointType);
144             EndpointTypeSchemaValidator::validate(xmlObject);
145             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(IndexedEndpointType,Index);
146         END_XMLOBJECTVALIDATOR;
147
148         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,ArtifactResolutionService,IndexedEndpointType);
149             IndexedEndpointTypeSchemaValidator::validate(xmlObject);
150         END_XMLOBJECTVALIDATOR;
151
152         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SingleLogoutService,EndpointType);
153             EndpointTypeSchemaValidator::validate(xmlObject);
154         END_XMLOBJECTVALIDATOR;
155
156         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,ManageNameIDService,EndpointType);
157             EndpointTypeSchemaValidator::validate(xmlObject);
158         END_XMLOBJECTVALIDATOR;
159
160         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SingleSignOnService,EndpointType);
161             EndpointTypeSchemaValidator::validate(xmlObject);
162         END_XMLOBJECTVALIDATOR;
163
164         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,NameIDMappingService,EndpointType);
165             EndpointTypeSchemaValidator::validate(xmlObject);
166         END_XMLOBJECTVALIDATOR;
167
168         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AssertionIDRequestService,EndpointType);
169             EndpointTypeSchemaValidator::validate(xmlObject);
170         END_XMLOBJECTVALIDATOR;
171
172         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,IDPSSODescriptor,RoleDescriptor);
173             RoleDescriptorSchemaValidator::validate(xmlObject);
174             XMLOBJECTVALIDATOR_NONEMPTY(IDPSSODescriptor,SingleSignOnService);
175         END_XMLOBJECTVALIDATOR;
176
177         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ServiceName);
178             XMLOBJECTVALIDATOR_REQUIRE(ServiceName,TextContent);
179             XMLOBJECTVALIDATOR_REQUIRE(ServiceName,Lang);
180         END_XMLOBJECTVALIDATOR;
181
182         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,ServiceDescription);
183             XMLOBJECTVALIDATOR_REQUIRE(ServiceDescription,TextContent);
184             XMLOBJECTVALIDATOR_REQUIRE(ServiceDescription,Lang);
185         END_XMLOBJECTVALIDATOR;
186
187         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,RequestedAttribute);
188             XMLOBJECTVALIDATOR_REQUIRE(RequestedAttribute,Name);
189         END_XMLOBJECTVALIDATOR;
190
191         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AttributeConsumingService);
192             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(AttributeConsumingService,Index);
193             XMLOBJECTVALIDATOR_NONEMPTY(AttributeConsumingService,ServiceName);
194             XMLOBJECTVALIDATOR_NONEMPTY(AttributeConsumingService,RequestedAttribute);
195         END_XMLOBJECTVALIDATOR;
196
197         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AssertionConsumerService,IndexedEndpointType);
198             IndexedEndpointTypeSchemaValidator::validate(xmlObject);
199         END_XMLOBJECTVALIDATOR;
200
201         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,SPSSODescriptor,RoleDescriptor);
202             RoleDescriptorSchemaValidator::validate(xmlObject);
203             XMLOBJECTVALIDATOR_NONEMPTY(SPSSODescriptor,AssertionConsumerService);
204         END_XMLOBJECTVALIDATOR;
205
206         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthnQueryService,EndpointType);
207             EndpointTypeSchemaValidator::validate(xmlObject);
208         END_XMLOBJECTVALIDATOR;
209
210         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthnAuthorityDescriptor,RoleDescriptor);
211             RoleDescriptorSchemaValidator::validate(xmlObject);
212             XMLOBJECTVALIDATOR_NONEMPTY(AuthnAuthorityDescriptor,AuthnQueryService);
213         END_XMLOBJECTVALIDATOR;
214
215         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AuthzService,EndpointType);
216             EndpointTypeSchemaValidator::validate(xmlObject);
217         END_XMLOBJECTVALIDATOR;
218
219         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,PDPDescriptor,RoleDescriptor);
220             RoleDescriptorSchemaValidator::validate(xmlObject);
221             XMLOBJECTVALIDATOR_NONEMPTY(PDPDescriptor,AuthzService);
222         END_XMLOBJECTVALIDATOR;
223
224         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AttributeService,EndpointType);
225             EndpointTypeSchemaValidator::validate(xmlObject);
226         END_XMLOBJECTVALIDATOR;
227
228         BEGIN_XMLOBJECTVALIDATOR_SUB(SAML_DLLLOCAL,AttributeAuthorityDescriptor,RoleDescriptor);
229             RoleDescriptorSchemaValidator::validate(xmlObject);
230             XMLOBJECTVALIDATOR_NONEMPTY(AttributeAuthorityDescriptor,AttributeService);
231         END_XMLOBJECTVALIDATOR;
232
233         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,AffiliationDescriptor);
234             XMLOBJECTVALIDATOR_REQUIRE(AffiliationDescriptor,AffiliationOwnerID);
235             XMLOBJECTVALIDATOR_NONEMPTY(AffiliationDescriptor,AffiliateMember);
236         END_XMLOBJECTVALIDATOR;
237
238         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntityDescriptor);
239             XMLOBJECTVALIDATOR_REQUIRE(EntityDescriptor,EntityID);
240             if (ptr->getRoleDescriptors().empty() &&
241                 ptr->getIDPSSODescriptors().empty() &&
242                 ptr->getSPSSODescriptors().empty() &&
243                 ptr->getAuthnAuthorityDescriptors().empty() &&
244                 ptr->getAttributeAuthorityDescriptors().empty() &&
245                 ptr->getPDPDescriptors().empty()) {
246
247                 if (!ptr->getAffiliationDescriptor())
248                     throw ValidationException("EntityDescriptor must have at least one child role or affiliation descriptor.");
249             }
250             else if (ptr->getAffiliationDescriptor()) {
251                 throw ValidationException("EntityDescriptor cannot have both an AffiliationDescriptor and role descriptors.");
252             }
253         END_XMLOBJECTVALIDATOR;
254
255         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntitiesDescriptor);
256             if (ptr->getEntityDescriptors().empty() && ptr->getEntitiesDescriptors().empty())
257                 throw ValidationException("EntitiesDescriptor must contain at least one child descriptor.");
258         END_XMLOBJECTVALIDATOR;
259
260         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,SourceID);
261
262         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,EntityAttributes);
263             if (!ptr->hasChildren())
264                 throw ValidationException("EntityAttributes must contain at least one child element.");
265         END_XMLOBJECTVALIDATOR;
266
267         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,DigestMethod);
268             XMLOBJECTVALIDATOR_REQUIRE(DigestMethod,Algorithm);
269         END_XMLOBJECTVALIDATOR;
270
271         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,SigningMethod);
272             XMLOBJECTVALIDATOR_REQUIRE(SigningMethod,Algorithm);
273         END_XMLOBJECTVALIDATOR;
274
275         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,DisplayName);
276             XMLOBJECTVALIDATOR_REQUIRE(DisplayName,TextContent);
277             XMLOBJECTVALIDATOR_REQUIRE(DisplayName,Lang);
278         END_XMLOBJECTVALIDATOR;
279
280         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Description);
281             XMLOBJECTVALIDATOR_REQUIRE(Description,TextContent);
282             XMLOBJECTVALIDATOR_REQUIRE(Description,Lang);
283         END_XMLOBJECTVALIDATOR;
284
285         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Logo);
286             XMLOBJECTVALIDATOR_REQUIRE(Logo,TextContent);
287             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Height);
288             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Width);
289         END_XMLOBJECTVALIDATOR;
290
291         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,InformationURL);
292             XMLOBJECTVALIDATOR_REQUIRE(InformationURL,TextContent);
293             XMLOBJECTVALIDATOR_REQUIRE(InformationURL,Lang);
294         END_XMLOBJECTVALIDATOR;
295
296         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,PrivacyStatementURL);
297             XMLOBJECTVALIDATOR_REQUIRE(PrivacyStatementURL,TextContent);
298             XMLOBJECTVALIDATOR_REQUIRE(PrivacyStatementURL,Lang);
299         END_XMLOBJECTVALIDATOR;
300
301         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,IPHint);
302         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,DomainHint);
303         XMLOBJECTVALIDATOR_SIMPLE(SAML_DLLLOCAL,GeolocationHint);
304     };
305 };
306
307 #define REGISTER_ELEMENT(cname) \
308     q=xmltooling::QName(SAML20MD_NS,cname::LOCAL_NAME); \
309     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
310     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
311
312 #define REGISTER_TYPE(cname) \
313     q=xmltooling::QName(SAML20MD_NS,cname::TYPE_NAME); \
314     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
315     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
316
317 #define REGISTER_ELEMENT_UI(cname) \
318     q=xmltooling::QName(SAML20MD_UI_NS,cname::LOCAL_NAME); \
319     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
320     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
321
322 #define REGISTER_TYPE_UI(cname) \
323     q=xmltooling::QName(SAML20MD_UI_NS,cname::TYPE_NAME); \
324     XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
325     SchemaValidators.registerValidator(q,new cname##SchemaValidator())
326
327 #define REGISTER_ELEMENT_UI_NOVAL(cname) \
328     q=xmltooling::QName(SAML20MD_UI_NS,cname::LOCAL_NAME); \
329     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
330
331 #define REGISTER_TYPE_UI_NOVAL(cname) \
332     q=xmltooling::QName(SAML20MD_UI_NS,cname::TYPE_NAME); \
333     XMLObjectBuilder::registerBuilder(q,new cname##Builder());
334
335 void opensaml::saml2md::registerMetadataClasses() {
336     xmltooling::QName q;
337     REGISTER_ELEMENT(AdditionalMetadataLocation);
338     REGISTER_ELEMENT(AffiliateMember);
339     REGISTER_ELEMENT(AffiliationDescriptor);
340     REGISTER_ELEMENT(ArtifactResolutionService);
341     REGISTER_ELEMENT(AssertionConsumerService);
342     REGISTER_ELEMENT(AssertionIDRequestService);
343     REGISTER_ELEMENT(AttributeAuthorityDescriptor);;
344     REGISTER_ELEMENT(AttributeConsumingService);
345     REGISTER_ELEMENT(AttributeProfile);
346     REGISTER_ELEMENT(AttributeService);
347     REGISTER_ELEMENT(AuthnAuthorityDescriptor);
348     REGISTER_ELEMENT(AuthnQueryService);
349     REGISTER_ELEMENT(AuthzService);
350     REGISTER_ELEMENT(Company);
351     REGISTER_ELEMENT(ContactPerson);
352     REGISTER_ELEMENT(EmailAddress);
353     REGISTER_ELEMENT(EntitiesDescriptor);
354     REGISTER_ELEMENT(EntityDescriptor);
355     REGISTER_ELEMENT(Extensions);
356     REGISTER_ELEMENT(GivenName);
357     REGISTER_ELEMENT(IDPSSODescriptor);
358     REGISTER_ELEMENT(KeyDescriptor);
359     REGISTER_ELEMENT(ManageNameIDService);
360     REGISTER_ELEMENT(NameIDFormat);
361     REGISTER_ELEMENT(NameIDMappingService);
362     REGISTER_ELEMENT(Organization);
363     REGISTER_ELEMENT(OrganizationDisplayName);
364     REGISTER_ELEMENT(OrganizationName);
365     REGISTER_ELEMENT(OrganizationURL);
366     REGISTER_ELEMENT(PDPDescriptor);
367     REGISTER_ELEMENT(RequestedAttribute);
368     REGISTER_ELEMENT(RoleDescriptor);
369     REGISTER_ELEMENT(ServiceDescription);
370     REGISTER_ELEMENT(ServiceName);
371     REGISTER_ELEMENT(SingleLogoutService);
372     REGISTER_ELEMENT(SingleSignOnService);
373     REGISTER_ELEMENT(SPSSODescriptor);
374     REGISTER_ELEMENT(SurName);
375     REGISTER_ELEMENT(TelephoneNumber);
376     REGISTER_TYPE(AdditionalMetadataLocation);
377     REGISTER_TYPE(AffiliationDescriptor);
378     REGISTER_TYPE(AttributeAuthorityDescriptor);;
379     REGISTER_TYPE(AttributeConsumingService);
380     REGISTER_TYPE(AuthnAuthorityDescriptor);
381     REGISTER_TYPE(ContactPerson);
382     REGISTER_TYPE(EndpointType);
383     REGISTER_TYPE(EntitiesDescriptor);
384     REGISTER_TYPE(EntityDescriptor);
385     REGISTER_TYPE(Extensions);
386     REGISTER_TYPE(IDPSSODescriptor);
387     REGISTER_TYPE(IndexedEndpointType);
388     REGISTER_TYPE(KeyDescriptor);
389     REGISTER_TYPE(localizedNameType);
390     REGISTER_TYPE(localizedURIType);
391     REGISTER_TYPE(Organization);
392     REGISTER_TYPE(PDPDescriptor);
393     REGISTER_TYPE(RequestedAttribute);
394     REGISTER_TYPE(SPSSODescriptor);
395
396     q=xmltooling::QName(SAML20MD_NS,xmlencryption::EncryptionMethod::LOCAL_NAME);
397     XMLObjectBuilder::registerBuilder(q,new xmlencryption::EncryptionMethodBuilder());
398
399     q=xmltooling::QName(samlconstants::SAML1MD_NS,SourceID::LOCAL_NAME);
400     XMLObjectBuilder::registerBuilder(q,new SourceIDBuilder());
401     SchemaValidators.registerValidator(q,new SourceIDSchemaValidator());
402
403     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,ActionNamespace::LOCAL_NAME);
404     XMLObjectBuilder::registerBuilder(q,new ActionNamespaceBuilder());
405     SchemaValidators.registerValidator(q,new ActionNamespaceSchemaValidator());
406
407     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AuthnQueryDescriptorType::TYPE_NAME);
408     XMLObjectBuilder::registerBuilder(q,new AuthnQueryDescriptorTypeBuilder());
409     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
410
411     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AttributeQueryDescriptorType::TYPE_NAME);
412     XMLObjectBuilder::registerBuilder(q,new AttributeQueryDescriptorTypeBuilder());
413     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
414
415     q=xmltooling::QName(SAML20MD_QUERY_EXT_NS,AuthzDecisionQueryDescriptorType::TYPE_NAME);
416     XMLObjectBuilder::registerBuilder(q,new AuthzDecisionQueryDescriptorTypeBuilder());
417     SchemaValidators.registerValidator(q,new RoleDescriptorSchemaValidator());
418
419     q=xmltooling::QName(SAML20MD_ENTITY_ATTRIBUTE_NS,EntityAttributes::LOCAL_NAME);
420     XMLObjectBuilder::registerBuilder(q,new EntityAttributesBuilder());
421     SchemaValidators.registerValidator(q,new EntityAttributesSchemaValidator());
422
423     q=xmltooling::QName(SAML20MD_ENTITY_ATTRIBUTE_NS,EntityAttributes::TYPE_NAME);
424     XMLObjectBuilder::registerBuilder(q,new EntityAttributesBuilder());
425     SchemaValidators.registerValidator(q,new EntityAttributesSchemaValidator());
426
427     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,DigestMethod::LOCAL_NAME);
428     XMLObjectBuilder::registerBuilder(q,new DigestMethodBuilder());
429     SchemaValidators.registerValidator(q,new DigestMethodSchemaValidator());
430
431     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,DigestMethod::TYPE_NAME);
432     XMLObjectBuilder::registerBuilder(q,new DigestMethodBuilder());
433     SchemaValidators.registerValidator(q,new DigestMethodSchemaValidator());
434
435     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,SigningMethod::LOCAL_NAME);
436     XMLObjectBuilder::registerBuilder(q,new SigningMethodBuilder());
437     SchemaValidators.registerValidator(q,new SigningMethodSchemaValidator());
438
439     q=xmltooling::QName(SAML20MD_ALGSUPPORT_NS,SigningMethod::TYPE_NAME);
440     XMLObjectBuilder::registerBuilder(q,new SigningMethodBuilder());
441     SchemaValidators.registerValidator(q,new SigningMethodSchemaValidator());
442
443     REGISTER_ELEMENT_UI(DisplayName);
444     REGISTER_ELEMENT_UI(Description);
445     REGISTER_ELEMENT_UI(Logo);
446     REGISTER_ELEMENT_UI(InformationURL);
447     REGISTER_ELEMENT_UI(PrivacyStatementURL);
448     REGISTER_ELEMENT_UI(IPHint);
449     REGISTER_ELEMENT_UI(DomainHint);
450     REGISTER_ELEMENT_UI(GeolocationHint);
451     REGISTER_TYPE_UI(Logo);
452     REGISTER_ELEMENT_UI_NOVAL(UIInfo);
453     REGISTER_ELEMENT_UI_NOVAL(DiscoHints);
454     REGISTER_TYPE_UI_NOVAL(UIInfo);
455     REGISTER_TYPE_UI_NOVAL(DiscoHints);
456 }