Multi-line svn commit, see body.
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / Protocols.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 Protocols.h
19  * 
20  * XMLObjects representing the SAML 2.0 Protocols schema
21  */
22
23 #ifndef __saml2_protocols_h__
24 #define __saml2_protocols_h__
25
26 #include <saml/saml2/core/Assertions.h>
27
28
29 #define DECL_SAML2POBJECTBUILDER(cname) \
30     DECL_XMLOBJECTBUILDER(SAML_API,cname,opensaml::SAMLConstants::SAML20P_NS,opensaml::SAMLConstants::SAML20P_PREFIX)
31
32 namespace opensaml {
33
34     /**
35      * @namespace saml2p
36      * SAML 2.0 protocol namespace
37      */
38     namespace saml2p {
39
40         //TODO sync C++ and Java class/interface names, e.g. -Type or no -Type, etc
41
42         DECL_XMLOBJECT_SIMPLE(SAML_API,Artifact,Artifact,SAML 2.0 Artifact element);
43         DECL_XMLOBJECT_SIMPLE(SAML_API,GetComplete,GetComplete,SAML 2.0 GetComplete element);
44         DECL_XMLOBJECT_SIMPLE(SAML_API,NewID,NewID,SAML 2.0 NewID element);
45         DECL_XMLOBJECT_SIMPLE(SAML_API,RequesterID,RequesterID,SAML 2.0 RequesterID element);
46         DECL_XMLOBJECT_SIMPLE(SAML_API,SessionIndex,SessionIndex,SAML 2.0 SessionIndex element);
47         DECL_XMLOBJECT_SIMPLE(SAML_API,StatusMessage,Message,SAML 2.0 StatusMessage element);
48
49         BEGIN_XMLOBJECT(SAML_API,Extensions,xmltooling::ElementProxy,SAML 2.0 protocol Extensions element);
50             /** ExtensionsType local name */
51             static const XMLCh TYPE_NAME[];
52         END_XMLOBJECT;
53
54         BEGIN_XMLOBJECT(SAML_API,Request,SignableObject,SAML 2.0 Request element);
55             DECL_STRING_ATTRIB(ID,ID);
56             DECL_STRING_ATTRIB(Version,VER);
57             DECL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
58             DECL_STRING_ATTRIB(Destination,DESTINATION);
59             DECL_STRING_ATTRIB(Consent,CONSENT);
60             DECL_TYPED_FOREIGN_CHILD(Issuer,saml2);
61             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
62             DECL_TYPED_CHILD(Extensions);
63             /** RequestAbstractType local name */
64             static const XMLCh TYPE_NAME[];
65         END_XMLOBJECT;
66
67         BEGIN_XMLOBJECT(SAML_API,StatusCode,xmltooling::XMLObject,SAML 2.0 StatusCode element);
68             DECL_STRING_ATTRIB(Value,VALUE);
69             DECL_TYPED_CHILD(StatusCode);
70             /** StatusCodeType local name */
71             static const XMLCh TYPE_NAME[];
72         END_XMLOBJECT;
73
74         BEGIN_XMLOBJECT(SAML_API,StatusDetail,xmltooling::XMLObject,SAML 2.0 StatusDetail element);
75             DECL_XMLOBJECT_CHILDREN(Detail);
76             /** StatusDetailType local name */
77             static const XMLCh TYPE_NAME[];
78         END_XMLOBJECT;
79
80         BEGIN_XMLOBJECT(SAML_API,Status,xmltooling::XMLObject,SAML 2.0 Status element);
81             DECL_TYPED_CHILD(StatusCode);
82             DECL_TYPED_CHILD(StatusMessage);
83             DECL_TYPED_CHILD(StatusDetail);
84             /** StatusType local name */
85             static const XMLCh TYPE_NAME[];
86         END_XMLOBJECT;
87
88         BEGIN_XMLOBJECT(SAML_API,StatusResponse,SignableObject,SAML 2.0 StatusResponse element);
89             DECL_STRING_ATTRIB(ID,ID);
90             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
91             DECL_STRING_ATTRIB(Version,VER);
92             DECL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
93             DECL_STRING_ATTRIB(Destination,DESTINATION);
94             DECL_STRING_ATTRIB(Consent,CONSENT);
95
96             DECL_TYPED_FOREIGN_CHILD(Issuer,saml2);
97             DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
98             DECL_TYPED_CHILD(Extensions);
99             DECL_TYPED_CHILD(Status);
100
101             /** StatusResponseType local name */
102             static const XMLCh TYPE_NAME[];
103         END_XMLOBJECT;
104
105         BEGIN_XMLOBJECT(SAML_API,AssertionIDRequest,Request,SAML 2.0 AssertionIDRequest element);
106             DECL_TYPED_FOREIGN_CHILDREN(AssertionIDRef,saml2);
107             /** AssertionIDRequest local name */
108             static const XMLCh TYPE_NAME[];
109         END_XMLOBJECT;
110
111         BEGIN_XMLOBJECT(SAML_API,SubjectQuery,Request,SAML 2.0 SubjectQuery element);
112             DECL_TYPED_FOREIGN_CHILD(Subject,saml2);
113             /** SubjectQueryType local name */
114             static const XMLCh TYPE_NAME[];
115         END_XMLOBJECT;
116
117         BEGIN_XMLOBJECT(SAML_API,RequestedAuthnContext,xmltooling::XMLObject,SAML 2.0 RequestedAuthnContext element);
118             //TODO whether, and how, to enforce the controlled vocabulary (schema enumeration) for the Comparison attrib, as in the Java ? 
119             DECL_STRING_ATTRIB(Comparison,COMPARISON);
120             DECL_TYPED_FOREIGN_CHILDREN(AuthnContextClassRef,saml2);
121             DECL_TYPED_FOREIGN_CHILDREN(AuthnContextDeclRef,saml2);
122             /** exact Comparison */
123             static const XMLCh COMPARISON_EXACT[];
124             /** minimum Comparison */
125             static const XMLCh COMPARISON_MINIMUM[];
126             /** maximum Comparison */
127             static const XMLCh COMPARISON_MAXIMUM[];
128             /** better Comparison */
129             static const XMLCh COMPARISON_BETTER[];
130             /** RequestedAuthnContextType local name */
131             static const XMLCh TYPE_NAME[];
132         END_XMLOBJECT;
133
134         BEGIN_XMLOBJECT(SAML_API,AuthnQuery,SubjectQuery,SAML 2.0 AuthnQuery element);
135             DECL_STRING_ATTRIB(SessionIndex,SESSIONINDEX);
136             DECL_TYPED_CHILD(RequestedAuthnContext);
137             /** AuthnQueryType local name */
138             static const XMLCh TYPE_NAME[];
139         END_XMLOBJECT;
140
141         BEGIN_XMLOBJECT(SAML_API,AttributeQuery,SubjectQuery,SAML 2.0 AttributeQuery element);
142             DECL_TYPED_FOREIGN_CHILDREN(Attribute,saml2);
143             /** AttributeQueryType local name */
144             static const XMLCh TYPE_NAME[];
145         END_XMLOBJECT;
146         
147         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionQuery,SubjectQuery,SAML 2.0 AuthzDecisionQuery element);
148             DECL_STRING_ATTRIB(Resource,RESOURCE);
149             DECL_TYPED_FOREIGN_CHILDREN(Action,saml2);
150             DECL_TYPED_FOREIGN_CHILD(Evidence,saml2);
151             /** AuthzDecisionQueryType local name */
152             static const XMLCh TYPE_NAME[];
153         END_XMLOBJECT;
154
155         BEGIN_XMLOBJECT(SAML_API,NameIDPolicy,xmltooling::XMLObject,SAML 2.0 NameIDPolicy element);
156             DECL_STRING_ATTRIB(Format,FORMAT);
157             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
158             DECL_BOOLEAN_ATTRIB(AllowCreate,ALLOWCREATE);
159             /** NameIDPolicyType local name */
160             static const XMLCh TYPE_NAME[];
161         END_XMLOBJECT;
162
163         BEGIN_XMLOBJECT(SAML_API,IDPEntry,xmltooling::XMLObject,SAML2.0 IDPEntry element);
164             DECL_STRING_ATTRIB(ProviderID,PROVIDERID);
165             DECL_STRING_ATTRIB(Name,NAME);
166             DECL_STRING_ATTRIB(Loc,LOC);
167             /** IDPEntryType local name */
168             static const XMLCh TYPE_NAME[];
169         END_XMLOBJECT;
170
171         BEGIN_XMLOBJECT(SAML_API,IDPList,xmltooling::XMLObject,SAML 2.0 IDPList element);
172             DECL_TYPED_CHILDREN(IDPEntry);
173             DECL_TYPED_CHILD(GetComplete);
174             /** IDPListType local name */
175             static const XMLCh TYPE_NAME[];
176         END_XMLOBJECT;
177
178         BEGIN_XMLOBJECT(SAML_API,Scoping,xmltooling::XMLObject,SAML 2.0 Scoping element);
179             DECL_INTEGER_ATTRIB(ProxyCount,PROXYCOUNT);
180             DECL_TYPED_CHILD(IDPList);
181             DECL_TYPED_CHILDREN(RequesterID);
182             /** ScopingType local name */
183             static const XMLCh TYPE_NAME[];
184             /** ProxyCount value to express no restriction*/
185             static const int NO_PROXY_COUNT;
186         END_XMLOBJECT;
187
188         BEGIN_XMLOBJECT(SAML_API,AuthnRequest,Request,SAML 2.0 AuthnRequest element);
189             DECL_BOOLEAN_ATTRIB(ForceAuthn,FORCEAUTHN);
190             DECL_BOOLEAN_ATTRIB(IsPassive,ISPASSIVE);
191             DECL_STRING_ATTRIB(ProtocolBinding,PROTOCOLBINDING);
192             DECL_INTEGER_ATTRIB(AssertionConsumerServiceIndex,ASSERTIONCONSUMERSERVICEINDEX);
193             DECL_STRING_ATTRIB(AssertionConsumerServiceURL,ASSERTIONCONSUMERSERVICEURL);
194             DECL_INTEGER_ATTRIB(AttributeConsumingServiceIndex,ATTRIBUTECONSUMINGSERVICEINDEX);
195             DECL_STRING_ATTRIB(ProviderName,PROVIDERNAME);
196
197             DECL_TYPED_FOREIGN_CHILD(Subject,saml2);
198             DECL_TYPED_CHILD(NameIDPolicy);
199             DECL_TYPED_FOREIGN_CHILD(Conditions,saml2);
200             DECL_TYPED_CHILD(RequestedAuthnContext);
201             DECL_TYPED_CHILD(Scoping);
202             /** AuthnRequestType local name */
203             static const XMLCh TYPE_NAME[];
204         END_XMLOBJECT;
205
206         BEGIN_XMLOBJECT(SAML_API,Response,StatusResponse,SAML 2.0 Response element);
207             DECL_TYPED_FOREIGN_CHILDREN(Assertion,saml2);
208             DECL_TYPED_FOREIGN_CHILDREN(EncryptedAssertion,saml2);
209             /** ResponseType local name */
210             static const XMLCh TYPE_NAME[];
211         END_XMLOBJECT;
212
213         BEGIN_XMLOBJECT(SAML_API,ArtifactResolve,Request,SAML 2.0 ArtifactResolve element);
214             DECL_TYPED_CHILD(Artifact);
215             /** ArtifiactResolveType local name */
216             static const XMLCh TYPE_NAME[];
217         END_XMLOBJECT;
218
219         BEGIN_XMLOBJECT(SAML_API,ArtifactResponse,StatusResponse,SAML 2.0 ArtifactResponse element);
220             DECL_XMLOBJECT_CHILD(Payload);
221             /** ArtifiactResponseType local name */
222             static const XMLCh TYPE_NAME[];
223         END_XMLOBJECT;
224
225         BEGIN_XMLOBJECT(SAML_API,Terminate,xmltooling::XMLObject,SAML 2.0 Terminate element);
226             /** TerminateType local name */
227             static const XMLCh TYPE_NAME[];
228         END_XMLOBJECT;
229
230         BEGIN_XMLOBJECT(SAML_API,NewEncryptedID,saml2::EncryptedElementType,SAML 2.0 NewEncryptedID element);
231         END_XMLOBJECT;
232
233         BEGIN_XMLOBJECT(SAML_API,ManageNameIDRequest,Request,SAML 2.0 ManageNameIDRequest element);
234             DECL_TYPED_FOREIGN_CHILD(NameID,saml2);
235             DECL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
236             DECL_TYPED_CHILD(NewID);
237             DECL_TYPED_CHILD(NewEncryptedID);
238             DECL_TYPED_CHILD(Terminate);
239             /** ManageNameIDRequestType local name */
240             static const XMLCh TYPE_NAME[];
241         END_XMLOBJECT;
242
243         BEGIN_XMLOBJECT(SAML_API,ManageNameIDResponse,StatusResponse,SAML 2.0 ManageNameIDResponse element);
244         END_XMLOBJECT;
245         
246         BEGIN_XMLOBJECT(SAML_API,LogoutRequest,Request,SAML 2.0 LogoutRequest element);
247             DECL_STRING_ATTRIB(Reason,REASON);
248             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
249             DECL_TYPED_FOREIGN_CHILD(BaseID,saml2);
250             DECL_TYPED_FOREIGN_CHILD(NameID,saml2);
251             DECL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
252             DECL_TYPED_CHILDREN(SessionIndex);
253             /** LogoutRequestType local name */
254             static const XMLCh TYPE_NAME[];
255         END_XMLOBJECT;
256
257         BEGIN_XMLOBJECT(SAML_API,LogoutResponse,StatusResponse,SAML 2.0 LogoutResponse element);
258         END_XMLOBJECT;
259
260         BEGIN_XMLOBJECT(SAML_API,NameIDMappingRequest,Request,SAML 2.0 NameIDMappingRequest element);
261             DECL_TYPED_FOREIGN_CHILD(BaseID,saml2);
262             DECL_TYPED_FOREIGN_CHILD(NameID,saml2);
263             DECL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
264             DECL_TYPED_CHILD(NameIDPolicy);
265             /** NameIDMappingRequestType local name */
266             static const XMLCh TYPE_NAME[];
267         END_XMLOBJECT;
268
269         BEGIN_XMLOBJECT(SAML_API,NameIDMappingResponse,StatusResponse,SAML 2.0 NameIDMappingResponse element);
270             DECL_TYPED_FOREIGN_CHILD(NameID,saml2);
271             DECL_TYPED_FOREIGN_CHILD(EncryptedID,saml2);
272             /** NameIDMappingResponseType local name */
273             static const XMLCh TYPE_NAME[];
274         END_XMLOBJECT;
275
276         // Builders
277         DECL_SAML2POBJECTBUILDER(Artifact);
278         DECL_SAML2POBJECTBUILDER(ArtifactResolve);
279         DECL_SAML2POBJECTBUILDER(ArtifactResponse);
280         DECL_SAML2POBJECTBUILDER(AssertionIDRequest);
281         DECL_SAML2POBJECTBUILDER(AttributeQuery);
282         DECL_SAML2POBJECTBUILDER(AuthnQuery);
283         DECL_SAML2POBJECTBUILDER(AuthnRequest);
284         DECL_SAML2POBJECTBUILDER(AuthzDecisionQuery);
285         DECL_SAML2POBJECTBUILDER(Extensions);
286         DECL_SAML2POBJECTBUILDER(GetComplete);
287         DECL_SAML2POBJECTBUILDER(IDPEntry);
288         DECL_SAML2POBJECTBUILDER(IDPList);
289         DECL_SAML2POBJECTBUILDER(LogoutRequest);
290         DECL_SAML2POBJECTBUILDER(LogoutResponse);
291         DECL_SAML2POBJECTBUILDER(ManageNameIDRequest);
292         DECL_SAML2POBJECTBUILDER(ManageNameIDResponse);
293         DECL_SAML2POBJECTBUILDER(NameIDMappingRequest);
294         DECL_SAML2POBJECTBUILDER(NameIDMappingResponse);
295         DECL_SAML2POBJECTBUILDER(NameIDPolicy);
296         DECL_SAML2POBJECTBUILDER(NewEncryptedID);
297         DECL_SAML2POBJECTBUILDER(NewID);
298         DECL_SAML2POBJECTBUILDER(RequestedAuthnContext);
299         DECL_SAML2POBJECTBUILDER(RequesterID);
300         DECL_SAML2POBJECTBUILDER(Response);
301         DECL_SAML2POBJECTBUILDER(Scoping);
302         DECL_SAML2POBJECTBUILDER(SessionIndex);
303         DECL_SAML2POBJECTBUILDER(Status);
304         DECL_SAML2POBJECTBUILDER(StatusCode);
305         DECL_SAML2POBJECTBUILDER(StatusDetail);
306         DECL_SAML2POBJECTBUILDER(StatusMessage);
307         DECL_SAML2POBJECTBUILDER(Terminate);
308
309         //
310         // Custom builders
311         //
312
313         /**
314          * Builder for StatusResponse objects.
315          * 
316          * This is customized to force the element name to be specified.
317          */
318         class SAML_API StatusResponseBuilder : public xmltooling::XMLObjectBuilder {
319         public:
320             virtual ~StatusResponseBuilder() {}
321             /** Builder that allows element/type override. */
322             virtual StatusResponse* buildObject(
323                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
324                 ) const;
325         
326             /** Singleton builder. */
327             static StatusResponse* buildStatusResponse(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
328                 const StatusResponseBuilder* b = dynamic_cast<const StatusResponseBuilder*>(
329                     XMLObjectBuilder::getBuilder(xmltooling::QName(SAMLConstants::SAML20P_NS,StatusResponse::TYPE_NAME))
330                     );
331                 if (b) {
332                     xmltooling::QName schemaType(SAMLConstants::SAML20P_NS,StatusResponse::TYPE_NAME,SAMLConstants::SAML20P_PREFIX);
333                     return b->buildObject(nsURI, localName, prefix, &schemaType);
334                 }
335                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for StatusResponse.");
336             }
337         };
338
339         
340         /**
341          * Registers builders and validators for SAML 2.0 Protocol classes into the runtime.
342          */
343         void SAML_API registerProtocolClasses();
344
345         /**
346          * Validator suite for SAML 2.0 Protocol schema validation.
347          */
348         extern SAML_API xmltooling::ValidatorSuite ProtocolSchemaValidators;
349     };
350 };
351
352 #endif /* __saml2_protocols_h__ */