Convert from NULL macro to nullptr, remove unused zlib code.
[shibboleth/cpp-opensaml.git] / saml / saml1 / core / Protocols.h
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  * @file saml/saml1/core/Protocols.h
19  *
20  * XMLObjects representing the SAML 1.x Protocols schema.
21  */
22
23 #ifndef __saml1_protocols_h__
24 #define __saml1_protocols_h__
25
26 #include <saml/RootObject.h>
27 #include <saml/util/SAMLConstants.h>
28
29 #include <xmltooling/ConcreteXMLObjectBuilder.h>
30 #include <xmltooling/ElementExtensibleXMLObject.h>
31
32 #define DECL_SAML1POBJECTBUILDER(cname) \
33     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML1P_NS,samlconstants::SAML1P_PREFIX)
34
35 namespace xmltooling {
36     class XMLTOOL_API DateTime;
37 };
38
39 namespace xmlsignature {
40     class XMLTOOL_API KeyInfo;
41     class XMLTOOL_API Signature;
42 };
43
44 namespace opensaml {
45
46     namespace saml1 {
47         class SAML_API Action;
48         class SAML_API Assertion;
49         class SAML_API AssertionIDReference;
50         class SAML_API AttributeDesignator;
51         class SAML_API Evidence;
52         class SAML_API Subject;
53     };
54
55     /**
56      * @namespace opensaml::saml1p
57      * SAML 1.x protocol namespace
58      */
59     namespace saml1p {
60
61         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionArtifact,Artifact,SAML 1.x AssertionArtifact element);
62         DECL_XMLOBJECT_SIMPLE(SAML_API,StatusMessage,Message,SAML 1.x StatusMessage element);
63
64         BEGIN_XMLOBJECT(SAML_API,RespondWith,xmltooling::XMLObject,SAML 1.x RespondWith element);
65             /** Gets the QName content of the element. */
66             virtual xmltooling::QName* getQName() const=0;
67             /** Sets the QName content of the element. */
68             virtual void setQName(const xmltooling::QName* qname)=0;
69         END_XMLOBJECT;
70
71         BEGIN_XMLOBJECT(SAML_API,Query,xmltooling::XMLObject,SAML 1.x Query element);
72         END_XMLOBJECT;
73
74         BEGIN_XMLOBJECT(SAML_API,SubjectQuery,Query,SAML 1.x SubjectQuery element);
75             DECL_TYPED_FOREIGN_CHILD(Subject,saml1);
76         END_XMLOBJECT;
77
78         BEGIN_XMLOBJECT(SAML_API,AuthenticationQuery,SubjectQuery,SAML 1.x AuthenticationQuery element);
79             DECL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD);
80             /** AuthenticationQueryType local name */
81             static const XMLCh TYPE_NAME[];
82         END_XMLOBJECT;
83
84         BEGIN_XMLOBJECT(SAML_API,AttributeQuery,SubjectQuery,SAML 1.x AttributeQuery element);
85             DECL_STRING_ATTRIB(Resource,RESOURCE);
86             DECL_TYPED_FOREIGN_CHILDREN(AttributeDesignator,saml1);
87             /** AttributeQueryType local name */
88             static const XMLCh TYPE_NAME[];
89         END_XMLOBJECT;
90
91         BEGIN_XMLOBJECT(SAML_API,AuthorizationDecisionQuery,SubjectQuery,SAML 1.x AuthorizationDecisionQuery element);
92             DECL_STRING_ATTRIB(Resource,RESOURCE);
93             DECL_TYPED_FOREIGN_CHILDREN(Action,saml1);
94             DECL_TYPED_FOREIGN_CHILD(Evidence,saml1);
95             /** AuthorizationDecisionQueryType local name */
96             static const XMLCh TYPE_NAME[];
97         END_XMLOBJECT;
98
99         BEGIN_XMLOBJECT(SAML_API,RequestAbstractType,RootObject,SAML 1.x RequestAbstractType base type);
100             DECL_INTEGER_ATTRIB(MinorVersion,MINORVERSION);
101             DECL_STRING_ATTRIB(RequestID,REQUESTID);
102             DECL_INHERITED_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
103             DECL_TYPED_CHILDREN(RespondWith);
104             /** RequestAbstractType local name */
105             static const XMLCh TYPE_NAME[];
106         END_XMLOBJECT;
107
108         BEGIN_XMLOBJECT(SAML_API,Request,RequestAbstractType,SAML 1.x Request element);
109             DECL_TYPED_CHILD(Query);
110             DECL_TYPED_CHILD(SubjectQuery);
111             DECL_TYPED_CHILD(AuthenticationQuery);
112             DECL_TYPED_CHILD(AttributeQuery);
113             DECL_TYPED_CHILD(AuthorizationDecisionQuery);
114             DECL_TYPED_FOREIGN_CHILDREN(AssertionIDReference,saml1);
115             DECL_TYPED_CHILDREN(AssertionArtifact);
116             /** RequestType local name */
117             static const XMLCh TYPE_NAME[];
118         END_XMLOBJECT;
119
120         BEGIN_XMLOBJECT(SAML_API,StatusCode,xmltooling::XMLObject,SAML 1.x StatusCode element);
121             DECL_XMLOBJECT_ATTRIB(Value,VALUE,xmltooling::QName);
122             DECL_TYPED_CHILD(StatusCode);
123             /** StatusCodeType local name */
124             static const XMLCh TYPE_NAME[];
125             /** Success Status Code */
126             static xmltooling::QName SUCCESS;
127             /** Requester Error Status Code */
128             static xmltooling::QName REQUESTER;
129             /** Responder Error Status Code */
130             static xmltooling::QName RESPONDER;
131             /** Version Mismatch Error Status Code */
132             static xmltooling::QName VERSIONMISMATCH;
133         END_XMLOBJECT;
134
135         BEGIN_XMLOBJECT(SAML_API,StatusDetail,xmltooling::ElementExtensibleXMLObject,SAML 1.x StatusDetail element);
136             /** StatusDetailType local name */
137             static const XMLCh TYPE_NAME[];
138         END_XMLOBJECT;
139
140         BEGIN_XMLOBJECT(SAML_API,Status,xmltooling::XMLObject,SAML 1.x Status element);
141             DECL_TYPED_CHILD(StatusCode);
142             DECL_TYPED_CHILD(StatusMessage);
143             DECL_TYPED_CHILD(StatusDetail);
144             /** StatusType local name */
145             static const XMLCh TYPE_NAME[];
146         END_XMLOBJECT;
147
148         BEGIN_XMLOBJECT(SAML_API,ResponseAbstractType,RootObject,SAML 1.x ResponseAbstractType base type);
149             DECL_INTEGER_ATTRIB(MinorVersion,MINORVERSION);
150             DECL_STRING_ATTRIB(ResponseID,RESPONSEID);
151             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
152             DECL_INHERITED_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
153             DECL_STRING_ATTRIB(Recipient,RECIPIENT);
154             /** ResponseAbstractType local name */
155             static const XMLCh TYPE_NAME[];
156         END_XMLOBJECT;
157
158         BEGIN_XMLOBJECT(SAML_API,Response,ResponseAbstractType,SAML 1.x Response element);
159             DECL_TYPED_CHILD(Status);
160             DECL_TYPED_FOREIGN_CHILDREN(Assertion,saml1);
161             /** ResponseType local name */
162             static const XMLCh TYPE_NAME[];
163         END_XMLOBJECT;
164
165         DECL_SAML1POBJECTBUILDER(AssertionArtifact);
166         DECL_SAML1POBJECTBUILDER(AttributeQuery);
167         DECL_SAML1POBJECTBUILDER(AuthenticationQuery);
168         DECL_SAML1POBJECTBUILDER(AuthorizationDecisionQuery);
169         DECL_SAML1POBJECTBUILDER(Request);
170         DECL_SAML1POBJECTBUILDER(RespondWith);
171         DECL_SAML1POBJECTBUILDER(Response);
172         DECL_SAML1POBJECTBUILDER(Status);
173         DECL_SAML1POBJECTBUILDER(StatusCode);
174         DECL_SAML1POBJECTBUILDER(StatusDetail);
175         DECL_SAML1POBJECTBUILDER(StatusMessage);
176
177         /**
178          * Builder for Query extension objects.
179          *
180          * This is customized to force the schema type to be specified.
181          */
182         class SAML_API QueryBuilder : public xmltooling::XMLObjectBuilder {
183         public:
184             virtual ~QueryBuilder() {}
185             /** Builder that allows element/type override. */
186 #ifdef HAVE_COVARIANT_RETURNS
187             virtual Query* buildObject(
188 #else
189             virtual xmltooling::XMLObject* buildObject(
190 #endif
191                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=nullptr, const xmltooling::QName* schemaType=nullptr
192                 ) const;
193
194             /** Singleton builder. */
195             static Query* buildQuery(const xmltooling::QName& schemaType) {
196                 const QueryBuilder* b = dynamic_cast<const QueryBuilder*>(
197                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML1P_NS,Query::LOCAL_NAME))
198                     );
199                 if (b) {
200 #ifdef HAVE_COVARIANT_RETURNS
201                     return b->buildObject(samlconstants::SAML1P_NS, Query::LOCAL_NAME, samlconstants::SAML1P_PREFIX, &schemaType);
202 #else
203                     return dynamic_cast<Query*>(b->buildObject(samlconstants::SAML1P_NS, Query::LOCAL_NAME, samlconstants::SAML1P_PREFIX, &schemaType));
204 #endif
205                 }
206                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for Query.");
207             }
208         };
209
210         /**
211          * Registers builders and validators for SAML 1.x Protocol classes into the runtime.
212          */
213         void SAML_API registerProtocolClasses();
214     };
215 };
216
217 #endif /* __saml1_protocols_h__ */