Add XML objects for DelegationRestriction and EntityAttributes extensions.
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / Assertions.h
1 /*
2  *  Copyright 2001-2009 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/core/Assertions.h
19  *
20  * XMLObjects representing the SAML 2.0 Assertions schema
21  */
22
23 #ifndef __saml2_assertions_h__
24 #define __saml2_assertions_h__
25
26 #include <saml/Assertion.h>
27 #include <saml/util/SAMLConstants.h>
28
29 #include <xmltooling/XMLObjectBuilder.h>
30 #include <xmltooling/encryption/Encryption.h>
31 #include <xmltooling/security/CredentialCriteria.h>
32 #include <xmltooling/security/CredentialResolver.h>
33 #include <xmltooling/signature/Signature.h>
34 #include <xmltooling/util/DateTime.h>
35
36 #define DECL_SAML2OBJECTBUILDER(cname) \
37     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20_NS,samlconstants::SAML20_PREFIX)
38
39 namespace opensaml {
40
41     namespace saml2md {
42         class SAML_API MetadataProvider;
43         class SAML_API MetadataCredentialCriteria;
44     };
45
46     /**
47      * @namespace opensaml::saml2
48      * SAML 2.0 assertion namespace
49      */
50     namespace saml2 {
51
52         // Forward references
53         class SAML_API Assertion;
54         class SAML_API EncryptedAssertion;
55
56         /**
57          * Marker interface for SAML types that can be encrypted.
58          */
59         class SAML_API EncryptableObject : public virtual xmltooling::XMLObject
60         {
61         protected:
62             EncryptableObject() {}
63             virtual ~EncryptableObject() {}
64         };
65
66         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionIDRef,AssertionID,SAML 2.0 AssertionIDRef element);
67         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionURIRef,AssertionURI,SAML 2.0 AssertionURIRef element);
68         DECL_XMLOBJECT_SIMPLE(SAML_API,Audience,AudienceURI,SAML 2.0 Audience element);
69         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextClassRef,Reference,SAML 2.0 AuthnContextClassRef element);
70         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextDeclRef,Reference,SAML 2.0 AuthnContextDeclRef element);
71         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthenticatingAuthority,ID,SAML 2.0 AuthenticatingAuthority element);
72
73         BEGIN_XMLOBJECT(SAML_API,EncryptedElementType,xmltooling::XMLObject,SAML 2.0 EncryptedElementType type);
74             DECL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
75             DECL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption);
76             /** EncryptedElementType local name */
77             static const XMLCh TYPE_NAME[];
78
79             /**
80              * Encrypts an object to a single recipient using this object as a container.
81              *
82              * @param xmlObject         object to encrypt
83              * @param metadataProvider  a locked MetadataProvider to supply encryption keys
84              * @param criteria          metadata-based CredentialCriteria to use
85              * @param compact           true iff compact KeyInfo should be used
86              * @param algorithm         optionally specifies data encryption algorithm if none can be determined from metadata
87              * @return  the encrypted object
88              */
89             virtual void encrypt(
90                 const EncryptableObject& xmlObject,
91                 const saml2md::MetadataProvider& metadataProvider,
92                 saml2md::MetadataCredentialCriteria& criteria,
93                 bool compact=false,
94                 const XMLCh* algorithm=NULL
95                 );
96
97             /**
98              * Encrypts an object to multiple recipients using this object as a container.
99              *
100              * @param xmlObject     object to encrypt
101              * @param recipients    pairs containing a locked MetadataProvider to supply encryption keys,
102              *                      and a metadata-based CredentialCriteria to use
103              * @param compact       true iff compact KeyInfo should be used
104              * @param algorithm     optionally specifies data encryption algorithm if none can be determined from metadata
105              * @return  the encrypted object
106              */
107             virtual void encrypt(
108                 const EncryptableObject& xmlObject,
109                 const std::vector< std::pair<const saml2md::MetadataProvider*, saml2md::MetadataCredentialCriteria*> >& recipients,
110                 bool compact=false,
111                 const XMLCh* algorithm=NULL
112                 );
113
114             /**
115              * Decrypts the element using the supplied CredentialResolver.
116              *
117              * <p>The object returned will be unmarshalled around the decrypted DOM element in a
118              * new Document owned by the object.
119              *
120              * @param credResolver  locked resolver supplying decryption keys
121              * @param recipient     identifier naming the recipient (the entity performing the decryption)
122              * @param criteria      optional external criteria to use with resolver
123              * @return  the decrypted and unmarshalled object
124              */
125             virtual xmltooling::XMLObject* decrypt(
126                 const xmltooling::CredentialResolver& credResolver, const XMLCh* recipient, xmltooling::CredentialCriteria* criteria=NULL
127                 ) const;
128         END_XMLOBJECT;
129
130         BEGIN_XMLOBJECT(SAML_API,EncryptedID,EncryptedElementType,SAML 2.0 EncryptedID element);
131         END_XMLOBJECT;
132
133         BEGIN_XMLOBJECT(SAML_API,BaseID,EncryptableObject,SAML 2.0 BaseID abstract element);
134             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
135             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
136         END_XMLOBJECT;
137
138         BEGIN_XMLOBJECT(SAML_API,NameIDType,xmltooling::XMLObject,SAML 2.0 NameIDType type);
139             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
140             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
141             DECL_STRING_ATTRIB(Format,FORMAT);
142             DECL_STRING_ATTRIB(SPProvidedID,SPPROVIDEDID);
143             DECL_SIMPLE_CONTENT(Name);
144             /** NameIDType local name */
145             static const XMLCh TYPE_NAME[];
146             /** Unspecified name format ID */
147             static const XMLCh UNSPECIFIED[];
148             /** Email address name format ID */
149             static const XMLCh EMAIL[];
150             /** X.509 subject name format ID */
151             static const XMLCh X509_SUBJECT[];
152             /** Windows domain qualified name format ID */
153             static const XMLCh WIN_DOMAIN_QUALIFIED[];
154             /** Kerberos principal name format ID */
155             static const XMLCh KERBEROS[];
156             /** Entity identifier name format ID */
157             static const XMLCh ENTITY[];
158             /** Persistent identifier name format ID */
159             static const XMLCh PERSISTENT[];
160             /** Transient identifier name format ID */
161             static const XMLCh TRANSIENT[];
162         END_XMLOBJECT;
163
164         BEGIN_XMLOBJECT2(SAML_API,NameID,NameIDType,EncryptableObject,SAML 2.0 NameID element);
165         END_XMLOBJECT;
166
167         BEGIN_XMLOBJECT(SAML_API,Issuer,NameIDType,SAML 2.0 Issuer element);
168         END_XMLOBJECT;
169
170         BEGIN_XMLOBJECT(SAML_API,Condition,xmltooling::XMLObject,SAML 2.0 Condition element);
171         END_XMLOBJECT;
172
173         BEGIN_XMLOBJECT(SAML_API,AudienceRestriction,Condition,SAML 2.0 AudienceRestriction element);
174             DECL_TYPED_CHILDREN(Audience);
175             /** AudienceRestrictionType local name */
176             static const XMLCh TYPE_NAME[];
177         END_XMLOBJECT;
178
179         BEGIN_XMLOBJECT(SAML_API,OneTimeUse,Condition,SAML 2.0 OneTimeUse element);
180             /** OneTimeUseType local name */
181             static const XMLCh TYPE_NAME[];
182         END_XMLOBJECT;
183
184         BEGIN_XMLOBJECT(SAML_API,ProxyRestriction,Condition,SAML 2.0 ProxyRestriction element);
185             DECL_INTEGER_ATTRIB(Count,COUNT);
186             DECL_TYPED_CHILDREN(Audience);
187             /** ProxyRestrictionType local name */
188             static const XMLCh TYPE_NAME[];
189         END_XMLOBJECT;
190
191         BEGIN_XMLOBJECT(SAML_API,Delegate,xmltooling::XMLObject,SAML 2.0 Delegation Restriction Condition Delegate element);
192             DECL_STRING_ATTRIB(ConfirmationMethod,CONFIRMATIONMETHOD);
193             DECL_DATETIME_ATTRIB(DelegationInstant,DELEGATIONINSTANT);
194             DECL_TYPED_CHILD(BaseID);
195             DECL_TYPED_CHILD(NameID);
196             DECL_TYPED_CHILD(EncryptedID);
197             /** DelegateType local name */
198             static const XMLCh TYPE_NAME[];
199         END_XMLOBJECT;
200
201         BEGIN_XMLOBJECT(SAML_API,DelegationRestrictionType,Condition,SAML 2.0 Delegation Restriction Condition type);
202             DECL_TYPED_CHILDREN(Delegate);
203             /** DelegationRestrictionType local name */
204             static const XMLCh TYPE_NAME[];
205         END_XMLOBJECT;
206
207         BEGIN_XMLOBJECT(SAML_API,Conditions,xmltooling::XMLObject,SAML 2.0 Conditions element);
208             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
209             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
210             DECL_TYPED_CHILDREN(AudienceRestriction);
211             DECL_TYPED_CHILDREN(OneTimeUse);
212             DECL_TYPED_CHILDREN(ProxyRestriction);
213             DECL_TYPED_CHILDREN(Condition);
214             /** ConditionsType local name */
215             static const XMLCh TYPE_NAME[];
216         END_XMLOBJECT;
217
218         BEGIN_XMLOBJECT(SAML_API,SubjectConfirmationDataType,xmltooling::XMLObject,SAML 2.0 SubjectConfirmationDataType base type);
219             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
220             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
221             DECL_STRING_ATTRIB(Recipient,RECIPIENT);
222             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
223             DECL_STRING_ATTRIB(Address,ADDRESS);
224         END_XMLOBJECT;
225
226         BEGIN_XMLOBJECT2(SAML_API,SubjectConfirmationData,SubjectConfirmationDataType,xmltooling::ElementProxy,SAML 2.0 SubjectConfirmationData element);
227             DECL_SIMPLE_CONTENT(Data);
228         END_XMLOBJECT;
229
230         BEGIN_XMLOBJECT2(SAML_API,KeyInfoConfirmationDataType,SubjectConfirmationDataType,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 KeyInfoConfirmationDataType type);
231             DECL_TYPED_FOREIGN_CHILDREN(KeyInfo,xmlsignature);
232             /** KeyInfoConfirmationDataType local name */
233             static const XMLCh TYPE_NAME[];
234         END_XMLOBJECT;
235
236         BEGIN_XMLOBJECT(SAML_API,SubjectConfirmation,xmltooling::XMLObject,SAML 2.0 SubjectConfirmation element);
237             DECL_STRING_ATTRIB(Method,METHOD);
238             DECL_TYPED_CHILD(BaseID);
239             DECL_TYPED_CHILD(NameID);
240             DECL_TYPED_CHILD(EncryptedID);
241             DECL_XMLOBJECT_CHILD(SubjectConfirmationData);
242             /** SubjectConfirmationType local name */
243             static const XMLCh TYPE_NAME[];
244             /** Bearer confirmation method */
245             static const XMLCh BEARER[];
246             /** Holder of key confirmation method */
247             static const XMLCh HOLDER_KEY[];
248             /** Sender vouches confirmation method */
249             static const XMLCh SENDER_VOUCHES[];
250         END_XMLOBJECT;
251
252         BEGIN_XMLOBJECT(SAML_API,Subject,xmltooling::XMLObject,SAML 2.0 Subject element);
253             DECL_TYPED_CHILD(BaseID);
254             DECL_TYPED_CHILD(NameID);
255             DECL_TYPED_CHILD(EncryptedID);
256             DECL_TYPED_CHILDREN(SubjectConfirmation);
257             /** SubjectType local name */
258             static const XMLCh TYPE_NAME[];
259         END_XMLOBJECT;
260
261         BEGIN_XMLOBJECT(SAML_API,Statement,xmltooling::XMLObject,SAML 2.0 Statement element);
262         END_XMLOBJECT;
263
264         BEGIN_XMLOBJECT(SAML_API,SubjectLocality,xmltooling::XMLObject,SAML 2.0 SubjectLocality element);
265             DECL_STRING_ATTRIB(Address,ADDRESS);
266             DECL_STRING_ATTRIB(DNSName,DNSNAME);
267             /** SubjectLocalityType local name */
268             static const XMLCh TYPE_NAME[];
269         END_XMLOBJECT;
270
271         BEGIN_XMLOBJECT(SAML_API,AuthnContextDecl,xmltooling::ElementProxy,SAML 2.0 AuthnContextDecl element);
272         END_XMLOBJECT;
273
274         BEGIN_XMLOBJECT(SAML_API,AuthnContext,xmltooling::XMLObject,SAML 2.0 AuthnContext element);
275             DECL_TYPED_CHILD(AuthnContextClassRef);
276             DECL_XMLOBJECT_CHILD(AuthnContextDecl);
277             DECL_TYPED_CHILD(AuthnContextDeclRef);
278             DECL_TYPED_CHILDREN(AuthenticatingAuthority);
279             /** AuthnContextType local name */
280             static const XMLCh TYPE_NAME[];
281         END_XMLOBJECT;
282
283         BEGIN_XMLOBJECT(SAML_API,AuthnStatement,Statement,SAML 2.0 AuthnStatement element);
284             DECL_DATETIME_ATTRIB(AuthnInstant,AUTHNINSTANT);
285             DECL_STRING_ATTRIB(SessionIndex,SESSIONINDEX);
286             DECL_DATETIME_ATTRIB(SessionNotOnOrAfter,SESSIONNOTONORAFTER);
287             DECL_TYPED_CHILD(SubjectLocality);
288             DECL_TYPED_CHILD(AuthnContext);
289             /** AuthnStatementType local name */
290             static const XMLCh TYPE_NAME[];
291         END_XMLOBJECT;
292
293         BEGIN_XMLOBJECT(SAML_API,Action,xmltooling::XMLObject,SAML 2.0 Action element);
294             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
295             DECL_SIMPLE_CONTENT(Action);
296             /** ActionType local name */
297             static const XMLCh TYPE_NAME[];
298             /** Read/Write/Execute/Delete/Control Action Namespace */
299             static const XMLCh RWEDC_NEG_ACTION_NAMESPACE[];
300             /** Read/Write/Execute/Delete/Control with Negation Action Namespace */
301             static const XMLCh RWEDC_ACTION_NAMESPACE[];
302             /** Get/Head/Put/Post Action Namespace */
303             static const XMLCh GHPP_ACTION_NAMESPACE[];
304             /** UNIX File Permissions Action Namespace */
305             static const XMLCh UNIX_ACTION_NAMESPACE[];
306         END_XMLOBJECT;
307
308         BEGIN_XMLOBJECT(SAML_API,Evidence,xmltooling::XMLObject,SAML 2.0 Evidence element);
309             DECL_TYPED_CHILDREN(AssertionIDRef);
310             DECL_TYPED_CHILDREN(AssertionURIRef);
311             DECL_TYPED_CHILDREN(Assertion);
312             DECL_TYPED_CHILDREN(EncryptedAssertion);
313             /** EvidenceType local name */
314             static const XMLCh TYPE_NAME[];
315         END_XMLOBJECT;
316
317         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionStatement,Statement,SAML 2.0 AuthzDecisionStatement element);
318             DECL_STRING_ATTRIB(Resource,RESOURCE);
319             DECL_STRING_ATTRIB(Decision,DECISION);
320             DECL_TYPED_CHILDREN(Action);
321             DECL_TYPED_CHILD(Evidence);
322             /** AuthzDecisionStatementType local name */
323             static const XMLCh TYPE_NAME[];
324             /** Permit Decision */
325             static const XMLCh DECISION_PERMIT[];
326             /** Deny Decision */
327             static const XMLCh DECISION_DENY[];
328             /** Indeterminate Decision */
329             static const XMLCh DECISION_INDETERMINATE[];
330         END_XMLOBJECT;
331
332         BEGIN_XMLOBJECT(SAML_API,AttributeValue,xmltooling::ElementProxy,SAML 2.0 AttributeValue element);
333         END_XMLOBJECT;
334
335         BEGIN_XMLOBJECT2(SAML_API,Attribute,xmltooling::AttributeExtensibleXMLObject,EncryptableObject,SAML 2.0 Attribute element);
336             DECL_STRING_ATTRIB(Name,NAME);
337             DECL_STRING_ATTRIB(NameFormat,NAMEFORMAT);
338             DECL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME);
339             DECL_XMLOBJECT_CHILDREN(AttributeValue);
340             /** AttributeType local name */
341             static const XMLCh TYPE_NAME[];
342             /** Unspecified attribute name format ID */
343             static const XMLCh UNSPECIFIED[];
344             /** URI reference attribute name format ID */
345             static const XMLCh URI_REFERENCE[];
346             /** Basic attribute name format ID */
347             static const XMLCh BASIC[];
348         END_XMLOBJECT;
349
350         BEGIN_XMLOBJECT(SAML_API,EncryptedAttribute,EncryptedElementType,SAML 2.0 EncryptedAttribute element);
351         END_XMLOBJECT;
352
353         BEGIN_XMLOBJECT(SAML_API,AttributeStatement,Statement,SAML 2.0 AttributeStatement element);
354             DECL_TYPED_CHILDREN(Attribute);
355             DECL_TYPED_CHILDREN(EncryptedAttribute);
356             /** AttributeStatementType local name */
357             static const XMLCh TYPE_NAME[];
358         END_XMLOBJECT;
359
360         BEGIN_XMLOBJECT(SAML_API,EncryptedAssertion,EncryptedElementType,SAML 2.0 EncryptedAssertion element);
361         END_XMLOBJECT;
362
363         BEGIN_XMLOBJECT(SAML_API,Advice,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Advice element);
364             DECL_TYPED_CHILDREN(AssertionIDRef);
365             DECL_TYPED_CHILDREN(AssertionURIRef);
366             DECL_TYPED_CHILDREN(Assertion);
367             DECL_TYPED_CHILDREN(EncryptedAssertion);
368             /** AdviceType local name */
369             static const XMLCh TYPE_NAME[];
370         END_XMLOBJECT;
371
372         /**
373          * SAML 2.0 assertion or protocol message.
374          */
375         class SAML_API RootObject : virtual public opensaml::RootObject
376         {
377         protected:
378             RootObject() {}
379         public:
380             virtual ~RootObject() {}
381
382             /** Gets the Version attribute. */
383             virtual const XMLCh* getVersion() const=0;
384
385             /** Gets the Issuer. */
386             virtual Issuer* getIssuer() const=0;
387         };
388
389         BEGIN_XMLOBJECT3(SAML_API,Assertion,saml2::RootObject,opensaml::Assertion,EncryptableObject,SAML 2.0 Assertion element);
390             DECL_INHERITED_STRING_ATTRIB(Version,VER);
391             DECL_INHERITED_STRING_ATTRIB(ID,ID);
392             DECL_INHERITED_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
393             DECL_INHERITED_TYPED_CHILD(Issuer);
394             DECL_TYPED_CHILD(Subject);
395             DECL_TYPED_CHILD(Conditions);
396             DECL_TYPED_CHILD(Advice);
397             DECL_TYPED_CHILDREN(Statement);
398             DECL_TYPED_CHILDREN(AuthnStatement);
399             DECL_TYPED_CHILDREN(AttributeStatement);
400             DECL_TYPED_CHILDREN(AuthzDecisionStatement);
401             /** AssertionType local name */
402             static const XMLCh TYPE_NAME[];
403         END_XMLOBJECT;
404
405         DECL_SAML2OBJECTBUILDER(Action);
406         DECL_SAML2OBJECTBUILDER(Advice);
407         DECL_SAML2OBJECTBUILDER(Assertion);
408         DECL_SAML2OBJECTBUILDER(AssertionIDRef);
409         DECL_SAML2OBJECTBUILDER(AssertionURIRef);
410         DECL_SAML2OBJECTBUILDER(Attribute);
411         DECL_SAML2OBJECTBUILDER(AttributeStatement);
412         DECL_SAML2OBJECTBUILDER(AttributeValue);
413         DECL_SAML2OBJECTBUILDER(Audience);
414         DECL_SAML2OBJECTBUILDER(AudienceRestriction);
415         DECL_SAML2OBJECTBUILDER(AuthenticatingAuthority);
416         DECL_SAML2OBJECTBUILDER(AuthnContext);
417         DECL_SAML2OBJECTBUILDER(AuthnContextClassRef);
418         DECL_SAML2OBJECTBUILDER(AuthnContextDecl);
419         DECL_SAML2OBJECTBUILDER(AuthnContextDeclRef);
420         DECL_SAML2OBJECTBUILDER(AuthnStatement);
421         DECL_SAML2OBJECTBUILDER(AuthzDecisionStatement);
422         DECL_SAML2OBJECTBUILDER(Conditions);
423         DECL_SAML2OBJECTBUILDER(EncryptedAssertion);
424         DECL_SAML2OBJECTBUILDER(EncryptedAttribute);
425         DECL_SAML2OBJECTBUILDER(EncryptedID);
426         DECL_SAML2OBJECTBUILDER(Evidence);
427         DECL_SAML2OBJECTBUILDER(Issuer);
428         DECL_SAML2OBJECTBUILDER(NameID);
429         DECL_SAML2OBJECTBUILDER(OneTimeUse);
430         DECL_SAML2OBJECTBUILDER(ProxyRestriction);
431         DECL_SAML2OBJECTBUILDER(Subject);
432         DECL_SAML2OBJECTBUILDER(SubjectConfirmation);
433         DECL_SAML2OBJECTBUILDER(SubjectConfirmationData);
434         DECL_SAML2OBJECTBUILDER(SubjectLocality);
435
436         DECL_XMLOBJECTBUILDER(SAML_API,Delegate,samlconstants::SAML20_DELEGATION_CONDITION_NS,samlconstants::SAML20_DELEGATION_CONDITION_PREFIX);
437
438         /**
439          * Builder for NameIDType objects.
440          *
441          * This is customized to force the element name to be specified.
442          */
443         class SAML_API NameIDTypeBuilder : public xmltooling::XMLObjectBuilder {
444         public:
445             virtual ~NameIDTypeBuilder() {}
446             /** Builder that allows element/type override. */
447 #ifdef HAVE_COVARIANT_RETURNS
448             virtual NameIDType* buildObject(
449 #else
450             virtual xmltooling::XMLObject* buildObject(
451 #endif
452                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
453                 ) const;
454
455             /** Singleton builder. */
456             static NameIDType* buildNameIDType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
457                 const NameIDTypeBuilder* b = dynamic_cast<const NameIDTypeBuilder*>(
458                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,NameIDType::TYPE_NAME))
459                     );
460                 if (b) {
461                     xmltooling::QName schemaType(samlconstants::SAML20_NS,NameIDType::TYPE_NAME,samlconstants::SAML20_PREFIX);
462 #ifdef HAVE_COVARIANT_RETURNS
463                     return b->buildObject(nsURI, localName, prefix, &schemaType);
464 #else
465                     return dynamic_cast<NameIDType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
466 #endif
467                 }
468                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for NameIDType.");
469             }
470         };
471
472         /**
473          * Builder for Condition extension objects.
474          *
475          * This is customized to force the schema type to be specified.
476          */
477         class SAML_API ConditionBuilder : public xmltooling::XMLObjectBuilder {
478         public:
479             virtual ~ConditionBuilder() {}
480             /** Builder that allows element/type override. */
481 #ifdef HAVE_COVARIANT_RETURNS
482             virtual Condition* buildObject(
483 #else
484             virtual xmltooling::XMLObject* buildObject(
485 #endif
486                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
487                 ) const;
488
489             /** Singleton builder. */
490             static Condition* buildCondition(const xmltooling::QName& schemaType) {
491                 const ConditionBuilder* b = dynamic_cast<const ConditionBuilder*>(
492                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,Condition::LOCAL_NAME))
493                     );
494                 if (b) {
495 #ifdef HAVE_COVARIANT_RETURNS
496                     return b->buildObject(samlconstants::SAML20_NS, Condition::LOCAL_NAME, samlconstants::SAML20_PREFIX, &schemaType);
497 #else
498                     return dynamic_cast<Condition*>(b->buildObject(samlconstants::SAML20_NS, Condition::LOCAL_NAME, samlconstants::SAML20_PREFIX, &schemaType));
499 #endif
500                 }
501                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for Condition.");
502             }
503         };
504
505         /**
506          * Builder for DelegationRestrictionType objects.
507          *
508          * This is customized to return a Condition element with an xsi:type of DelegationRestrictionType.
509          */
510         class SAML_API DelegationRestrictionTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
511         public:
512             virtual ~DelegationRestrictionTypeBuilder() {}
513             /** Default builder. */
514 #ifdef HAVE_COVARIANT_RETURNS
515             virtual DelegationRestrictionType* buildObject() const {
516 #else
517             virtual xmltooling::XMLObject* buildObject() const {
518 #endif
519                 xmltooling::QName schemaType(
520                     samlconstants::SAML20_DELEGATION_CONDITION_NS,
521                     DelegationRestrictionType::TYPE_NAME,
522                     samlconstants::SAML20_DELEGATION_CONDITION_PREFIX
523                     );
524                 return buildObject(
525                     samlconstants::SAML20_DELEGATION_CONDITION_NS,
526                     DelegationRestrictionType::LOCAL_NAME,
527                     samlconstants::SAML20_DELEGATION_CONDITION_PREFIX,
528                     &schemaType
529                     );
530             }
531             /** Builder that allows element/type override. */
532 #ifdef HAVE_COVARIANT_RETURNS
533             virtual DelegationRestrictionType* buildObject(
534 #else
535             virtual xmltooling::XMLObject* buildObject(
536 #endif
537                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
538                 ) const;
539
540             /** Singleton builder. */
541             static DelegationRestrictionType* buildDelegationRestrictionType() {
542                 const DelegationRestrictionTypeBuilder* b = dynamic_cast<const DelegationRestrictionTypeBuilder*>(
543                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_DELEGATION_CONDITION_NS,DelegationRestrictionType::TYPE_NAME))
544                     );
545                 if (b)
546 #ifdef HAVE_COVARIANT_RETURNS
547                     return b->buildObject();
548 #else
549                     return dynamic_cast<DelegationRestrictionType*>(b->buildObject());
550 #endif
551                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for DelegationRestrictionType.");
552             }
553         };
554
555         /**
556          * Builder for KeyInfoConfirmationDataType objects.
557          *
558          * This is customized to return a SubjectConfirmationData element with an
559          * xsi:type of KeyInfoConfirmationDataType.
560          */
561         class SAML_API KeyInfoConfirmationDataTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
562         public:
563             virtual ~KeyInfoConfirmationDataTypeBuilder() {}
564             /** Default builder. */
565 #ifdef HAVE_COVARIANT_RETURNS
566             virtual KeyInfoConfirmationDataType* buildObject() const {
567 #else
568             virtual xmltooling::XMLObject* buildObject() const {
569 #endif
570                 xmltooling::QName schemaType(
571                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME,samlconstants::SAML20_PREFIX
572                     );
573                 return buildObject(
574                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
575                     );
576             }
577             /** Builder that allows element/type override. */
578 #ifdef HAVE_COVARIANT_RETURNS
579             virtual KeyInfoConfirmationDataType* buildObject(
580 #else
581             virtual xmltooling::XMLObject* buildObject(
582 #endif
583                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
584                 ) const;
585
586             /** Singleton builder. */
587             static KeyInfoConfirmationDataType* buildKeyInfoConfirmationDataType() {
588                 const KeyInfoConfirmationDataTypeBuilder* b = dynamic_cast<const KeyInfoConfirmationDataTypeBuilder*>(
589                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME))
590                     );
591                 if (b)
592 #ifdef HAVE_COVARIANT_RETURNS
593                     return b->buildObject();
594 #else
595                     return dynamic_cast<KeyInfoConfirmationDataType*>(b->buildObject());
596 #endif
597                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for KeyInfoConfirmationDataType.");
598             }
599         };
600
601         /**
602          * Builder for Statement extension objects.
603          *
604          * This is customized to force the schema type to be specified.
605          */
606         class SAML_API StatementBuilder : public xmltooling::XMLObjectBuilder {
607         public:
608             virtual ~StatementBuilder() {}
609             /** Builder that allows element/type override. */
610 #ifdef HAVE_COVARIANT_RETURNS
611             virtual Statement* buildObject(
612 #else
613             virtual xmltooling::XMLObject* buildObject(
614 #endif
615                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
616                 ) const;
617
618             /** Singleton builder. */
619             static Statement* buildStatement(const xmltooling::QName& schemaType) {
620                 const StatementBuilder* b = dynamic_cast<const StatementBuilder*>(
621                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,Statement::LOCAL_NAME))
622                     );
623                 if (b) {
624 #ifdef HAVE_COVARIANT_RETURNS
625                     return b->buildObject(samlconstants::SAML20_NS, Statement::LOCAL_NAME, samlconstants::SAML20_PREFIX, &schemaType);
626 #else
627                     return dynamic_cast<Statement*>(b->buildObject(samlconstants::SAML20_NS, Statement::LOCAL_NAME, samlconstants::SAML20_PREFIX, &schemaType));
628 #endif
629                 }
630                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for Statement.");
631             }
632         };
633
634         /**
635          * Registers builders and validators for SAML 2.0 Assertion classes into the runtime.
636          */
637         void SAML_API registerAssertionClasses();
638     };
639 };
640
641 #endif /* __saml2_assertions_h__ */