Removed unnecessary class from string literals.
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / Assertions.h
1 /*
2  *  Copyright 2001-2006 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/signature/SignableObject.h>
27 #include <saml/util/SAMLConstants.h>
28
29 #include <xmltooling/AttributeExtensibleXMLObject.h>
30 #include <xmltooling/ElementProxy.h>
31 #include <xmltooling/XMLObjectBuilder.h>
32 #include <xmltooling/encryption/Encryption.h>
33 #include <xmltooling/signature/KeyResolver.h>
34 #include <xmltooling/signature/Signature.h>
35 #include <xmltooling/util/DateTime.h>
36
37 #define DECL_SAML2OBJECTBUILDER(cname) \
38     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20_NS,samlconstants::SAML20_PREFIX)
39
40 namespace opensaml {
41
42     /**
43      * @namespace opensaml::saml2
44      * SAML 2.0 assertion namespace
45      */
46     namespace saml2 {
47         
48         // Forward references
49         class SAML_API Assertion;
50         class SAML_API EncryptedAssertion;
51         
52         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionIDRef,AssertionID,SAML 2.0 AssertionIDRef element);
53         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionURIRef,AssertionURI,SAML 2.0 AssertionURIRef element);
54         DECL_XMLOBJECT_SIMPLE(SAML_API,Audience,AudienceURI,SAML 2.0 Audience element);
55         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextClassRef,Reference,SAML 2.0 AuthnContextClassRef element);
56         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextDeclRef,Reference,SAML 2.0 AuthnContextDeclRef element);
57         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthenticatingAuthority,ID,SAML 2.0 AuthenticatingAuthority element);
58
59         BEGIN_XMLOBJECT(SAML_API,EncryptedElementType,xmltooling::XMLObject,SAML 2.0 EncryptedElementType type);
60             DECL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
61             DECL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption);
62             /** EncryptedElementType local name */
63             static const XMLCh TYPE_NAME[];
64             
65             /**
66              * Decrypts the element using a standard approach based on a wrapped decryption key
67              * inside the message. The key decryption key should be supplied using the provided
68              * resolver. The recipient name may be used when multiple encrypted keys are found.
69              * The object returned will be unmarshalled around the decrypted DOM element, but the
70              * DOM itself will be released. 
71              * 
72              * @param KEKresolver   resolver supplying key decryption key
73              * @param recipient     identifier naming the recipient (the entity performing the decryption)
74              * @return  the decrypted and unmarshalled object
75              */
76             virtual xmltooling::XMLObject* decrypt(xmlsignature::KeyResolver* KEKresolver, const XMLCh* recipient) const=0;
77         END_XMLOBJECT;
78
79         BEGIN_XMLOBJECT(SAML_API,EncryptedID,EncryptedElementType,SAML 2.0 EncryptedID element);
80         END_XMLOBJECT;
81
82         BEGIN_XMLOBJECT(SAML_API,BaseID,xmltooling::XMLObject,SAML 2.0 BaseIDAbstractType abstract type);
83             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
84             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
85         END_XMLOBJECT;
86
87         BEGIN_XMLOBJECT(SAML_API,NameIDType,xmltooling::XMLObject,SAML 2.0 NameIDType type);
88             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
89             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
90             DECL_STRING_ATTRIB(Format,FORMAT);
91             DECL_STRING_ATTRIB(SPProvidedID,SPPROVIDEDID);
92             DECL_SIMPLE_CONTENT(Name);
93             /** NameIDType local name */
94             static const XMLCh TYPE_NAME[];
95             /** Unspecified name format ID */
96             static const XMLCh UNSPECIFIED[];
97             /** Email address name format ID */
98             static const XMLCh EMAIL[];
99             /** X.509 subject name format ID */
100             static const XMLCh X509_SUBJECT[];
101             /** Windows domain qualified name format ID */
102             static const XMLCh WIN_DOMAIN_QUALIFIED[];
103             /** Kerberos principal name format ID */
104             static const XMLCh KERBEROS[];
105             /** Entity identifier name format ID */
106             static const XMLCh ENTITY[];
107             /** Persistent identifier name format ID */
108             static const XMLCh PERSISTENT[];
109             /** Transient identifier name format ID */
110             static const XMLCh TRANSIENT[];
111         END_XMLOBJECT;
112
113         BEGIN_XMLOBJECT(SAML_API,NameID,NameIDType,SAML 2.0 NameID element);
114         END_XMLOBJECT;
115
116         BEGIN_XMLOBJECT(SAML_API,Issuer,NameIDType,SAML 2.0 Issuer element);
117         END_XMLOBJECT;
118
119         BEGIN_XMLOBJECT(SAML_API,Condition,xmltooling::XMLObject,SAML 2.0 Condition element);
120         END_XMLOBJECT;
121         
122         BEGIN_XMLOBJECT(SAML_API,AudienceRestriction,Condition,SAML 2.0 AudienceRestriction element);
123             DECL_TYPED_CHILDREN(Audience);
124             /** AudienceRestrictionType local name */
125             static const XMLCh TYPE_NAME[];
126         END_XMLOBJECT;
127
128         BEGIN_XMLOBJECT(SAML_API,OneTimeUse,Condition,SAML 2.0 OneTimeUse element);
129             /** OneTimeUseType local name */
130             static const XMLCh TYPE_NAME[];
131         END_XMLOBJECT;
132
133         BEGIN_XMLOBJECT(SAML_API,ProxyRestriction,Condition,SAML 2.0 ProxyRestriction element);
134             DECL_INTEGER_ATTRIB(Count,COUNT);
135             DECL_TYPED_CHILDREN(Audience);
136             /** ProxyRestrictionType local name */
137             static const XMLCh TYPE_NAME[];
138         END_XMLOBJECT;
139
140         BEGIN_XMLOBJECT(SAML_API,Conditions,xmltooling::XMLObject,SAML 2.0 Conditions element);
141             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
142             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
143             DECL_TYPED_CHILDREN(AudienceRestriction);
144             DECL_TYPED_CHILDREN(OneTimeUse);
145             DECL_TYPED_CHILDREN(ProxyRestriction);
146             DECL_TYPED_CHILDREN(Condition);
147             /** ConditionsType local name */
148             static const XMLCh TYPE_NAME[];
149         END_XMLOBJECT;
150
151         BEGIN_XMLOBJECT2(SAML_API,SubjectConfirmationData,xmltooling::ElementProxy,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 SubjectConfirmationData element);
152             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
153             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
154             DECL_STRING_ATTRIB(Recipient,RECIPIENT);
155             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
156             DECL_STRING_ATTRIB(Address,ADDRESS);
157             DECL_SIMPLE_CONTENT(Data);
158         END_XMLOBJECT;
159
160         BEGIN_XMLOBJECT(SAML_API,KeyInfoConfirmationDataType,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 KeyInfoConfirmationDataType type);
161             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
162             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
163             DECL_STRING_ATTRIB(Recipient,RECIPIENT);
164             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
165             DECL_STRING_ATTRIB(Address,ADDRESS);
166             DECL_TYPED_FOREIGN_CHILDREN(KeyInfo,xmlsignature);
167             /** KeyInfoConfirmationDataType local name */
168             static const XMLCh TYPE_NAME[];
169         END_XMLOBJECT;
170         
171         BEGIN_XMLOBJECT(SAML_API,SubjectConfirmation,xmltooling::XMLObject,SAML 2.0 SubjectConfirmation element);
172             DECL_STRING_ATTRIB(Method,METHOD);
173             DECL_TYPED_CHILD(BaseID);
174             DECL_TYPED_CHILD(NameID);
175             DECL_TYPED_CHILD(EncryptedID);
176             DECL_XMLOBJECT_CHILD(SubjectConfirmationData);
177             DECL_TYPED_CHILD(KeyInfoConfirmationDataType);
178             /** SubjectConfirmationType local name */
179             static const XMLCh TYPE_NAME[];
180             /** Bearer confirmation method */
181             static const XMLCh BEARER[];
182             /** Holder of key confirmation method */
183             static const XMLCh HOLDER_KEY[];
184             /** Sender vouches confirmation method */
185             static const XMLCh SENDER_VOUCHES[];
186         END_XMLOBJECT;
187
188         BEGIN_XMLOBJECT(SAML_API,Subject,xmltooling::XMLObject,SAML 2.0 Subject element);
189             DECL_TYPED_CHILD(BaseID);
190             DECL_TYPED_CHILD(NameID);
191             DECL_TYPED_CHILD(EncryptedID);
192             DECL_TYPED_CHILDREN(SubjectConfirmation);
193             /** SubjectType local name */
194             static const XMLCh TYPE_NAME[];
195         END_XMLOBJECT;
196
197         BEGIN_XMLOBJECT(SAML_API,Statement,xmltooling::XMLObject,SAML 2.0 Statement element);
198         END_XMLOBJECT;
199
200         BEGIN_XMLOBJECT(SAML_API,SubjectLocality,xmltooling::XMLObject,SAML 2.0 SubjectLocality element);
201             DECL_STRING_ATTRIB(Address,ADDRESS);
202             DECL_STRING_ATTRIB(DNSName,DNSNAME);
203             /** SubjectLocalityType local name */
204             static const XMLCh TYPE_NAME[];
205         END_XMLOBJECT;
206
207         BEGIN_XMLOBJECT2(SAML_API,AuthnContextDecl,xmltooling::ElementProxy,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 AuthnContextDecl element);
208         END_XMLOBJECT;
209
210         BEGIN_XMLOBJECT(SAML_API,AuthnContext,xmltooling::XMLObject,SAML 2.0 AuthnContext element);
211             DECL_TYPED_CHILD(AuthnContextClassRef);
212             DECL_XMLOBJECT_CHILD(AuthnContextDecl);
213             DECL_TYPED_CHILD(AuthnContextDeclRef);
214             DECL_TYPED_CHILDREN(AuthenticatingAuthority);
215             /** AuthnContextType local name */
216             static const XMLCh TYPE_NAME[];
217         END_XMLOBJECT;
218
219         BEGIN_XMLOBJECT(SAML_API,AuthnStatement,Statement,SAML 2.0 AuthnStatement element);
220             DECL_DATETIME_ATTRIB(AuthnInstant,AUTHNINSTANT);
221             DECL_STRING_ATTRIB(SessionIndex,SESSIONINDEX);
222             DECL_DATETIME_ATTRIB(SessionNotOnOrAfter,SESSIONNOTONORAFTER);
223             DECL_TYPED_CHILD(SubjectLocality);
224             DECL_TYPED_CHILD(AuthnContext);
225             /** AuthnStatementType local name */
226             static const XMLCh TYPE_NAME[];
227         END_XMLOBJECT;
228
229         BEGIN_XMLOBJECT(SAML_API,Action,xmltooling::XMLObject,SAML 2.0 Action element);
230             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
231             DECL_SIMPLE_CONTENT(Action);
232             /** ActionType local name */
233             static const XMLCh TYPE_NAME[];
234             /** Read/Write/Execute/Delete/Control Action Namespace */
235             static const XMLCh RWEDC_NEG_ACTION_NAMESPACE[];
236             /** Read/Write/Execute/Delete/Control with Negation Action Namespace */
237             static const XMLCh RWEDC_ACTION_NAMESPACE[];
238             /** Get/Head/Put/Post Action Namespace */
239             static const XMLCh GHPP_ACTION_NAMESPACE[];
240             /** UNIX File Permissions Action Namespace */
241             static const XMLCh UNIX_ACTION_NAMESPACE[];
242         END_XMLOBJECT;
243
244         BEGIN_XMLOBJECT(SAML_API,Evidence,xmltooling::XMLObject,SAML 2.0 Evidence element);
245             DECL_TYPED_CHILDREN(AssertionIDRef);
246             DECL_TYPED_CHILDREN(AssertionURIRef);
247             DECL_TYPED_CHILDREN(Assertion);
248             DECL_TYPED_CHILDREN(EncryptedAssertion);
249             /** EvidenceType local name */
250             static const XMLCh TYPE_NAME[];
251         END_XMLOBJECT;
252
253         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionStatement,Statement,SAML 2.0 AuthzDecisionStatement element);
254             DECL_STRING_ATTRIB(Resource,RESOURCE);
255             DECL_STRING_ATTRIB(Decision,DECISION);
256             DECL_TYPED_CHILDREN(Action);
257             DECL_TYPED_CHILD(Evidence);
258             /** AuthzDecisionStatementType local name */
259             static const XMLCh TYPE_NAME[];
260             /** Permit Decision */
261             static const XMLCh DECISION_PERMIT[];
262             /** Deny Decision */
263             static const XMLCh DECISION_DENY[];
264             /** Indeterminate Decision */
265             static const XMLCh DECISION_INDETERMINATE[];
266         END_XMLOBJECT;
267
268         BEGIN_XMLOBJECT2(SAML_API,AttributeValue,xmltooling::ElementProxy,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 AttributeValue element);
269         END_XMLOBJECT;
270
271         BEGIN_XMLOBJECT(SAML_API,Attribute,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 Attribute element);
272             DECL_STRING_ATTRIB(Name,NAME);
273             DECL_STRING_ATTRIB(NameFormat,NAMEFORMAT);
274             DECL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME);
275             DECL_XMLOBJECT_CHILDREN(AttributeValue);
276             /** AttributeType local name */
277             static const XMLCh TYPE_NAME[];
278             /** Unspecified attribute name format ID */
279             static const XMLCh UNSPECIFIED[];
280             /** URI reference attribute name format ID */
281             static const XMLCh URI_REFERENCE[];
282             /** Basic attribute name format ID */
283             static const XMLCh BASIC[];
284         END_XMLOBJECT;
285
286         BEGIN_XMLOBJECT(SAML_API,EncryptedAttribute,EncryptedElementType,SAML 2.0 EncryptedAttribute element);
287         END_XMLOBJECT;
288
289         BEGIN_XMLOBJECT(SAML_API,AttributeStatement,Statement,SAML 2.0 AttributeStatement element);
290             DECL_TYPED_CHILDREN(Attribute);
291             DECL_TYPED_CHILDREN(EncryptedAttribute);
292             /** AttributeStatementType local name */
293             static const XMLCh TYPE_NAME[];
294         END_XMLOBJECT;
295
296         BEGIN_XMLOBJECT(SAML_API,EncryptedAssertion,EncryptedElementType,SAML 2.0 EncryptedAssertion element);
297         END_XMLOBJECT;
298
299         BEGIN_XMLOBJECT(SAML_API,Advice,xmltooling::XMLObject,SAML 2.0 Advice element);
300             DECL_TYPED_CHILDREN(AssertionIDRef);
301             DECL_TYPED_CHILDREN(AssertionURIRef);
302             DECL_TYPED_CHILDREN(Assertion);
303             DECL_TYPED_CHILDREN(EncryptedAssertion);
304             DECL_XMLOBJECT_CHILDREN(Other);
305             /** AdviceType local name */
306             static const XMLCh TYPE_NAME[];
307         END_XMLOBJECT;
308
309         BEGIN_XMLOBJECT(SAML_API,Assertion,SignableObject,SAML 2.0 Assertion element);
310             DECL_STRING_ATTRIB(Version,VER);
311             DECL_STRING_ATTRIB(ID,ID);
312             DECL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
313             DECL_TYPED_CHILD(Issuer);
314             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
315             DECL_TYPED_CHILD(Subject);
316             DECL_TYPED_CHILD(Conditions);
317             DECL_TYPED_CHILD(Advice);
318             DECL_TYPED_CHILDREN(Statement);
319             DECL_TYPED_CHILDREN(AuthnStatement);
320             DECL_TYPED_CHILDREN(AttributeStatement);
321             DECL_TYPED_CHILDREN(AuthzDecisionStatement);
322             /** AssertionType local name */
323             static const XMLCh TYPE_NAME[];
324         END_XMLOBJECT;
325
326         DECL_SAML2OBJECTBUILDER(Action);
327         DECL_SAML2OBJECTBUILDER(Advice);
328         DECL_SAML2OBJECTBUILDER(Assertion);
329         DECL_SAML2OBJECTBUILDER(AssertionIDRef);
330         DECL_SAML2OBJECTBUILDER(AssertionURIRef);
331         DECL_SAML2OBJECTBUILDER(Attribute);
332         DECL_SAML2OBJECTBUILDER(AttributeStatement);
333         DECL_SAML2OBJECTBUILDER(AttributeValue);
334         DECL_SAML2OBJECTBUILDER(Audience);
335         DECL_SAML2OBJECTBUILDER(AudienceRestriction);
336         DECL_SAML2OBJECTBUILDER(AuthenticatingAuthority);
337         DECL_SAML2OBJECTBUILDER(AuthnContext);
338         DECL_SAML2OBJECTBUILDER(AuthnContextClassRef);
339         DECL_SAML2OBJECTBUILDER(AuthnContextDecl);
340         DECL_SAML2OBJECTBUILDER(AuthnContextDeclRef);
341         DECL_SAML2OBJECTBUILDER(AuthnStatement);
342         DECL_SAML2OBJECTBUILDER(AuthzDecisionStatement);
343         DECL_SAML2OBJECTBUILDER(Conditions);
344         DECL_SAML2OBJECTBUILDER(EncryptedAssertion);
345         DECL_SAML2OBJECTBUILDER(EncryptedAttribute);
346         DECL_SAML2OBJECTBUILDER(EncryptedID);
347         DECL_SAML2OBJECTBUILDER(Evidence);
348         DECL_SAML2OBJECTBUILDER(Issuer);
349         DECL_SAML2OBJECTBUILDER(NameID);
350         DECL_SAML2OBJECTBUILDER(OneTimeUse);
351         DECL_SAML2OBJECTBUILDER(ProxyRestriction);
352         DECL_SAML2OBJECTBUILDER(Subject);
353         DECL_SAML2OBJECTBUILDER(SubjectConfirmation);
354         DECL_SAML2OBJECTBUILDER(SubjectConfirmationData);
355         DECL_SAML2OBJECTBUILDER(SubjectLocality);
356         
357         /**
358          * Builder for NameIDType objects.
359          * 
360          * This is customized to force the element name to be specified.
361          */
362         class SAML_API NameIDTypeBuilder : public xmltooling::XMLObjectBuilder {
363         public:
364             virtual ~NameIDTypeBuilder() {}
365             /** Builder that allows element/type override. */
366             virtual NameIDType* buildObject(
367                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
368                 ) const;
369         
370             /** Singleton builder. */
371             static NameIDType* buildNameIDType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
372                 const NameIDTypeBuilder* b = dynamic_cast<const NameIDTypeBuilder*>(
373                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,NameIDType::TYPE_NAME))
374                     );
375                 if (b) {
376                     xmltooling::QName schemaType(samlconstants::SAML20_NS,NameIDType::TYPE_NAME,samlconstants::SAML20_PREFIX);
377                     return b->buildObject(nsURI, localName, prefix, &schemaType);
378                 }
379                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for NameIDType.");
380             }
381         };
382
383         /**
384          * Builder for KeyInfoConfirmationDataType objects.
385          * 
386          * This is customized to return a SubjectConfirmationData element with an
387          * xsi:type of KeyInfoConfirmationDataType.
388          */
389         class SAML_API KeyInfoConfirmationDataTypeBuilder : public xmltooling::XMLObjectBuilder {
390         public:
391             virtual ~KeyInfoConfirmationDataTypeBuilder() {}
392             /** Default builder. */
393             virtual KeyInfoConfirmationDataType* buildObject() const {
394                 xmltooling::QName schemaType(
395                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME,samlconstants::SAML20_PREFIX
396                     );
397                 return buildObject(
398                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
399                     );
400             }
401             /** Builder that allows element/type override. */
402             virtual KeyInfoConfirmationDataType* buildObject(
403                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
404                 ) const;
405         
406             /** Singleton builder. */
407             static KeyInfoConfirmationDataType* buildKeyInfoConfirmationDataType() {
408                 const KeyInfoConfirmationDataTypeBuilder* b = dynamic_cast<const KeyInfoConfirmationDataTypeBuilder*>(
409                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME))
410                     );
411                 if (b)
412                     return b->buildObject();
413                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for KeyInfoConfirmationDataType.");
414             }
415         };
416         
417         /**
418          * Registers builders and validators for SAML 2.0 Assertion classes into the runtime.
419          */
420         void SAML_API registerAssertionClasses();
421     };
422 };
423
424 #endif /* __saml2_assertions_h__ */