Cloning fixes, initial protocol check-in.
[shibboleth/cpp-opensaml.git] / saml / saml1 / core / impl / ProtocolsImpl.cpp
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  * ProtocolsImpl.cpp
19  * 
20  * Implementation classes for SAML 1.x Protocols schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml1/core/Protocols.h"
26
27 #include <xmltooling/AbstractChildlessElement.h>
28 #include <xmltooling/AbstractComplexElement.h>
29 #include <xmltooling/AbstractElementProxy.h>
30 #include <xmltooling/AbstractSimpleElement.h>
31 #include <xmltooling/impl/AnyElement.h>
32 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
33 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
34 #include <xmltooling/util/XMLHelper.h>
35 #include <xmltooling/validation/AbstractValidatingXMLObject.h>
36
37 #include <ctime>
38 #include <xercesc/util/XMLUniDefs.hpp>
39
40 using namespace opensaml::saml1;
41 using namespace opensaml;
42 using namespace xmlsignature;
43 using namespace xmltooling;
44 using namespace std;
45
46 #if defined (_MSC_VER)
47     #pragma warning( push )
48     #pragma warning( disable : 4250 4251 )
49 #endif
50
51 namespace opensaml {
52     namespace saml1 {
53     
54         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact);
55         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
56
57         class SAML_DLLLOCAL RespondWithImpl : public virtual RespondWith,
58             protected AbstractSimpleElement,
59             public AbstractChildlessElement,
60             public AbstractDOMCachingXMLObject,
61             public AbstractValidatingXMLObject,
62             public AbstractXMLObjectMarshaller,
63             public AbstractXMLObjectUnmarshaller
64         {
65             QName* m_qname;
66         public:
67             virtual ~RespondWithImpl() {
68                 delete m_qname;
69             }
70     
71             RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
72                 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
73             }
74                 
75             RespondWithImpl(const RespondWithImpl& src)
76                     : AbstractXMLObject(src),
77                         AbstractSimpleElement(src),
78                         AbstractDOMCachingXMLObject(src),
79                         AbstractValidatingXMLObject(src), m_qname(NULL) {
80                 setQName(src.getQName());
81             }
82             
83             QName* getQName() const {
84                 return m_qname;
85             }
86             
87             void setQName(const QName* qname) {
88                 m_qname=prepareForAssignment(m_qname,qname);
89                 if (m_qname) {
90                     auto_ptr_XMLCh temp(m_qname->toString().c_str());
91                     setTextContent(temp.get());
92                 }
93                 else
94                     setTextContent(NULL);
95             }
96             
97             IMPL_XMLOBJECT_CLONE(RespondWith);
98             IMPL_XMLOBJECT_CONTENT();
99         };
100
101         class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
102             public AbstractComplexElement,
103             public AbstractDOMCachingXMLObject,
104             public AbstractValidatingXMLObject,
105             public AbstractXMLObjectMarshaller,
106             public AbstractXMLObjectUnmarshaller
107         {
108             void init() {
109                 m_Subject=NULL;
110                 m_children.push_back(NULL);
111                 m_pos_Subject=m_children.begin();
112             }
113         protected:
114             SubjectQueryImpl() {
115                 init();
116             }
117         public:
118             virtual ~SubjectQueryImpl() {}
119     
120             SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
121                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
122                 init();
123             }
124                 
125             SubjectQueryImpl(const SubjectQueryImpl& src)
126                     : AbstractXMLObject(src),
127                         AbstractDOMCachingXMLObject(src),
128                         AbstractValidatingXMLObject(src) {
129                 init();
130                 if (src.getSubject())
131                     setSubject(src.getSubject()->cloneSubject());
132             }
133             
134             IMPL_TYPED_CHILD(Subject);
135     
136         protected:
137             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
138                 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
139                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
140             }
141         };
142
143         class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
144         {
145             void init() {
146                 m_AuthenticationMethod=NULL;
147             }
148         public:
149             virtual ~AuthenticationQueryImpl() {
150                 XMLString::release(&m_AuthenticationMethod);
151             }
152     
153             AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
154                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
155                 init();
156             }
157                 
158             AuthenticationQueryImpl(const AuthenticationQueryImpl& src)
159                     : AbstractXMLObject(src), SubjectQueryImpl(src) {
160                 init();
161                 setAuthenticationMethod(src.getAuthenticationMethod());
162             }
163             
164             IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
165             SubjectQuery* cloneSubjectQuery() const {
166                 return cloneAuthenticationQuery();
167             }
168             Query* cloneQuery() const {
169                 return cloneAuthenticationQuery();
170             }
171             IMPL_STRING_ATTRIB(AuthenticationMethod);
172     
173         protected:
174             void marshallAttributes(DOMElement* domElement) const {
175                 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
176                 SubjectQueryImpl::marshallAttributes(domElement);
177             }
178     
179             void processAttribute(const DOMAttr* attribute) {
180                 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
181                 SubjectQueryImpl::processAttribute(attribute);
182             }
183         };
184
185         class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
186         {
187             void init() {
188                 m_Resource=NULL;
189             }
190         public:
191             virtual ~AttributeQueryImpl() {
192                 XMLString::release(&m_Resource);
193             }
194     
195             AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
196                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
197                 init();
198             }
199                 
200             AttributeQueryImpl(const AttributeQueryImpl& src)
201                     : AbstractXMLObject(src), SubjectQueryImpl(src) {
202                 init();
203                 setResource(src.getResource());
204                 VectorOf(AttributeDesignator) v=getAttributeDesignators();
205                 for (vector<AttributeDesignator*>::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) {
206                     if (*i) {
207                         v.push_back((*i)->cloneAttributeDesignator());
208                     }
209                 }
210             }
211             
212             IMPL_XMLOBJECT_CLONE(AttributeQuery);
213             SubjectQuery* cloneSubjectQuery() const {
214                 return cloneAttributeQuery();
215             }
216             Query* cloneQuery() const {
217                 return cloneAttributeQuery();
218             }
219             IMPL_STRING_ATTRIB(Resource);
220             IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
221     
222         protected:
223             void marshallAttributes(DOMElement* domElement) const {
224                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
225                 SubjectQueryImpl::marshallAttributes(domElement);
226             }
227     
228             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
229                 PROC_TYPED_CHILDREN(AttributeDesignator,SAMLConstants::SAML1_NS,true);
230                 SubjectQueryImpl::processChildElement(childXMLObject,root);
231             }
232     
233             void processAttribute(const DOMAttr* attribute) {
234                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
235                 SubjectQueryImpl::processAttribute(attribute);
236             }
237         };
238
239         class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
240         {
241             void init() {
242                 m_Resource=NULL;
243                 m_Evidence=NULL;
244                 m_children.push_back(NULL);
245                 m_pos_Evidence=m_pos_Subject;
246                 m_pos_Evidence++;
247             }
248         public:
249             virtual ~AuthorizationDecisionQueryImpl() {
250                 XMLString::release(&m_Resource);
251             }
252     
253             AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
254                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
255                 init();
256             }
257                 
258             AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src)
259                     : AbstractXMLObject(src), SubjectQueryImpl(src) {
260                 init();
261                 setResource(src.getResource());
262                 if (src.getEvidence())
263                     setEvidence(src.getEvidence()->cloneEvidence());
264                 VectorOf(Action) v=getActions();
265                 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
266                     if (*i) {
267                         v.push_back((*i)->cloneAction());
268                     }
269                 }
270             }
271             
272             IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
273             SubjectQuery* cloneSubjectQuery() const {
274                 return cloneAuthorizationDecisionQuery();
275             }
276             Query* cloneQuery() const {
277                 return cloneAuthorizationDecisionQuery();
278             }
279             IMPL_STRING_ATTRIB(Resource);
280             IMPL_TYPED_CHILD(Evidence);
281             IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
282     
283         protected:
284             void marshallAttributes(DOMElement* domElement) const {
285                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
286                 SubjectQueryImpl::marshallAttributes(domElement);
287             }
288     
289             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
290                 PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false);
291                 PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false);
292                 SubjectQueryImpl::processChildElement(childXMLObject,root);
293             }
294     
295             void processAttribute(const DOMAttr* attribute) {
296                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
297                 SubjectQueryImpl::processAttribute(attribute);
298             }
299         };
300
301         class SAML_DLLLOCAL AbstractRequestImpl : public virtual AbstractRequest,
302             public AbstractComplexElement,
303             public AbstractDOMCachingXMLObject,
304             public AbstractValidatingXMLObject,
305             public AbstractXMLObjectMarshaller,
306             public AbstractXMLObjectUnmarshaller
307         {
308             void init() {
309                 m_MinorVersion=1;
310                 m_RequestID=NULL;
311                 m_IssueInstant=NULL;
312                 m_children.push_back(NULL);
313                 m_Signature=NULL;
314                 m_pos_Signature=m_children.begin();
315             }
316         protected:
317             AbstractRequestImpl() {}
318         public:
319             virtual ~AbstractRequestImpl() {
320                 XMLString::release(&m_RequestID);
321                 delete m_IssueInstant;
322             }
323     
324             AbstractRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
325                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
326                 init();
327             }
328                 
329             AbstractRequestImpl(const AbstractRequestImpl& src)
330                     : AbstractXMLObject(src),
331                         AbstractDOMCachingXMLObject(src),
332                         AbstractValidatingXMLObject(src) {
333                 init();
334                 setMinorVersion(src.getMinorVersion());
335                 setRequestID(src.getRequestID());
336                 setIssueInstant(src.getIssueInstant());
337                 if (src.getSignature())
338                     setSignature(src.getSignature()->cloneSignature());
339                 VectorOf(RespondWith) v=getRespondWiths();
340                 for (vector<RespondWith*>::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) {
341                     if (*i) {
342                         v.push_back((*i)->cloneRespondWith());
343                     }
344                 }
345             }
346             
347             IMPL_INTEGER_ATTRIB(MinorVersion);
348             IMPL_STRING_ATTRIB(RequestID);
349             IMPL_DATETIME_ATTRIB(IssueInstant);
350             IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
351             IMPL_TYPED_CHILD(Signature);
352     
353         protected:
354             void marshallAttributes(DOMElement* domElement) const {
355                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
356                 static const XMLCh ONE[] = { chDigit_1, chNull };
357                 domElement->setAttributeNS(NULL,MAJORVERSION,ONE);
358                 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
359                 if (!m_RequestID)
360                     const_cast<AbstractRequestImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
361                 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
362                 if (!m_IssueInstant)
363                     const_cast<AbstractRequestImpl*>(this)->m_IssueInstant=new DateTime(time(NULL));
364                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
365             }
366
367             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
368                 PROC_TYPED_CHILDREN(RespondWith,SAMLConstants::SAML1P_NS,false);
369                 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
370                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
371             }
372
373             void processAttribute(const DOMAttr* attribute) {
374                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
375                 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
376                     if (XMLString::parseInt(attribute->getValue()) != 1)
377                         throw UnmarshallingException("Request has invalid major version.");
378                 }
379                 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
380                 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
381                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
382             }
383         };
384
385         class SAML_DLLLOCAL RequestImpl : public virtual Request, public AbstractRequestImpl
386         {
387             void init() {
388                 m_children.push_back(NULL);
389                 m_Query=NULL;
390                 m_pos_Query=m_pos_Signature;
391                 m_pos_Query++;
392             }
393         public:
394             virtual ~RequestImpl() {}
395     
396             RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
397                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
398                 init();
399             }
400                 
401             RequestImpl(const RequestImpl& src)
402                     : AbstractXMLObject(src), AbstractRequestImpl(src) {
403                 init();
404                 if (src.getQuery())
405                     setQuery(src.getQuery()->cloneQuery());
406                 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
407                 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
408                     if (*i) {
409                         v.push_back((*i)->cloneAssertionIDReference());
410                     }
411                 }
412                 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
413                 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
414                     if (*i) {
415                         v2.push_back((*i)->cloneAssertionArtifact());
416                     }
417                 }
418             }
419             
420             IMPL_XMLOBJECT_CLONE(Request);
421             AbstractRequest* cloneAbstractRequest() const {
422                 return cloneRequest();
423             }
424             IMPL_TYPED_CHILD(Query);
425             
426             SubjectQuery* getSubjectQuery() const {
427                 return dynamic_cast<SubjectQuery*>(getQuery());
428             }
429             AuthenticationQuery* getAuthenticationQuery() const {
430                 return dynamic_cast<AuthenticationQuery*>(getQuery());
431             }
432             AttributeQuery* getAttributeQuery() const {
433                 return dynamic_cast<AttributeQuery*>(getQuery());
434             }
435             AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
436                 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
437             }
438
439             void setSubjectQuery(SubjectQuery* q) {
440                 setQuery(q);
441             }
442             void setAuthenticationQuery(AuthenticationQuery* q) {
443                 setQuery(q);
444             }
445             void setAttributeQuery(AttributeQuery* q) {
446                 setQuery(q);
447             }
448             void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
449                 setQuery(q);
450             }
451             
452             IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
453             IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
454     
455         protected:
456             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
457                 PROC_TYPED_CHILD(Query,SAMLConstants::SAML1P_NS,true);
458                 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
459                 PROC_TYPED_CHILDREN(AssertionArtifact,SAMLConstants::SAML1P_NS,false);
460                 AbstractRequestImpl::processChildElement(childXMLObject,root);
461             }
462         };
463
464         class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
465             public AbstractComplexElement,
466             public AbstractDOMCachingXMLObject,
467             public AbstractValidatingXMLObject,
468             public AbstractXMLObjectMarshaller,
469             public AbstractXMLObjectUnmarshaller
470         {
471             void init() {
472                 m_Value=NULL;
473                 m_children.push_back(NULL);
474                 m_StatusCode=NULL;
475                 m_pos_StatusCode=m_children.begin();
476             }
477         public:
478             virtual ~StatusCodeImpl() {
479                 delete m_Value;
480             }
481     
482             StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
483                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
484                 init();
485             }
486                 
487             StatusCodeImpl(const StatusCodeImpl& src)
488                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
489                 init();
490                 setValue(src.getValue());
491                 if (src.getStatusCode())
492                     setStatusCode(src.getStatusCode()->cloneStatusCode());
493             }
494             
495             IMPL_XMLOBJECT_CLONE(StatusCode);
496             IMPL_XMLOBJECT_ATTRIB(Value,QName);
497             IMPL_TYPED_CHILD(StatusCode);
498     
499         protected:
500             void marshallAttributes(DOMElement* domElement) const {
501                 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
502             }
503
504             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
505                 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,true);
506                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
507             }
508
509             void processAttribute(const DOMAttr* attribute) {
510                 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
511             }
512         };
513
514         class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
515             public AbstractComplexElement,
516             public AbstractDOMCachingXMLObject,
517             public AbstractValidatingXMLObject,
518             public AbstractXMLObjectMarshaller,
519             public AbstractXMLObjectUnmarshaller
520         {
521         public:
522             virtual ~StatusDetailImpl() {}
523     
524             StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
525                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
526             }
527                 
528             StatusDetailImpl(const StatusDetailImpl& src)
529                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
530                 VectorOf(XMLObject) v=getDetails();
531                 for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
532                     if (*i) {
533                         v.push_back((*i)->clone());
534                     }
535                 }
536             }
537             
538             IMPL_XMLOBJECT_CLONE(StatusDetail);
539             IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
540     
541         protected:
542             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
543                 getDetails().push_back(childXMLObject);
544             }
545         };
546
547     };
548 };
549
550 #if defined (_MSC_VER)
551     #pragma warning( pop )
552 #endif
553
554 // Builder Implementations
555
556 IMPL_XMLOBJECTBUILDER(AssertionArtifact);
557 IMPL_XMLOBJECTBUILDER(AttributeQuery);
558 IMPL_XMLOBJECTBUILDER(AuthenticationQuery);
559 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery);
560 IMPL_XMLOBJECTBUILDER(Request);
561 IMPL_XMLOBJECTBUILDER(RespondWith);
562 IMPL_XMLOBJECTBUILDER(StatusCode);
563 IMPL_XMLOBJECTBUILDER(StatusDetail);
564 IMPL_XMLOBJECTBUILDER(StatusMessage);
565
566 // Unicode literals
567 const XMLCh AbstractRequest::MINORVERSION_ATTRIB_NAME[] =   UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
568 const XMLCh AbstractRequest::REQUESTID_ATTRIB_NAME[] =      UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
569 const XMLCh AbstractRequest::ISSUEINSTANT_ATTRIB_NAME[] =   UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
570 const XMLCh AssertionArtifact::LOCAL_NAME[] =               UNICODE_LITERAL_17(A,s,s,e,r,t,i,o,n,A,r,t,i,f,a,c,t);
571 const XMLCh AttributeQuery::LOCAL_NAME[] =                  UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
572 const XMLCh AttributeQuery::TYPE_NAME[] =                   UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,Q,u,e,r,y,T,y,p,e);
573 const XMLCh AttributeQuery::RESOURCE_ATTRIB_NAME[] =        UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
574 const XMLCh AuthenticationQuery::LOCAL_NAME[] =             UNICODE_LITERAL_19(A,u,t,h,e,n,t,i,c,a,t,i,o,n,Q,u,e,r,y);
575 const XMLCh AuthenticationQuery::TYPE_NAME[] =              UNICODE_LITERAL_23(A,u,t,h,e,n,t,i,c,a,t,i,o,n,Q,u,e,r,y,T,y,p,e);
576 const XMLCh AuthenticationQuery::AUTHENTICATIONMETHOD_ATTRIB_NAME[] =   UNICODE_LITERAL_20(A,u,t,h,e,n,t,i,c,a,t,i,o,n,M,e,t,h,o,d);
577 const XMLCh AuthorizationDecisionQuery::LOCAL_NAME[] =      UNICODE_LITERAL_26(A,u,t,h,o,r,i,z,a,t,i,o,n,D,e,c,i,s,i,o,n,Q,u,e,r,y);
578 const XMLCh AuthorizationDecisionQuery::TYPE_NAME[] =       UNICODE_LITERAL_30(A,u,t,h,o,r,i,z,a,t,i,o,n,D,e,c,i,s,i,o,n,Q,u,e,r,y,T,y,p,e);
579 const XMLCh AuthorizationDecisionQuery::RESOURCE_ATTRIB_NAME[] =        UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
580 const XMLCh Query::LOCAL_NAME[] =                           UNICODE_LITERAL_5(Q,u,e,r,y);
581 const XMLCh Request::LOCAL_NAME[] =                         UNICODE_LITERAL_7(R,e,q,u,e,s,t);
582 const XMLCh Request::TYPE_NAME[] =                          UNICODE_LITERAL_11(R,e,q,u,e,s,t,T,y,p,e);
583 const XMLCh RespondWith::LOCAL_NAME[] =                     UNICODE_LITERAL_11(R,e,s,p,o,n,d,W,i,t,h);
584 const XMLCh StatusCode::LOCAL_NAME[] =                      UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
585 const XMLCh StatusCode::TYPE_NAME[] =                       UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
586 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] =               UNICODE_LITERAL_5(V,a,l,u,e);
587 const XMLCh StatusDetail::LOCAL_NAME[] =                    UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
588 const XMLCh StatusDetail::TYPE_NAME[] =                     UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
589 const XMLCh StatusMessage::LOCAL_NAME[] =                   UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
590 const XMLCh SubjectQuery::LOCAL_NAME[] =                    UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
591
592 #define XCH(ch) chLatin_##ch
593 #define XNUM(d) chDigit_##d
594
595 const XMLCh _SUCCESS[] =                                    UNICODE_LITERAL_7(S,u,c,c,e,s,s);
596 const XMLCh _REQUESTER[] =                                  UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r);
597 const XMLCh _RESPONDER[] =                                  UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r);
598 const XMLCh _VERSIONMISMATCH[] =                            UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
599  
600 QName StatusCode::SUCCESS(SAMLConstants::SAML1P_NS,_SUCCESS,SAMLConstants::SAML1P_PREFIX);
601 QName StatusCode::REQUESTER(SAMLConstants::SAML1P_NS,_REQUESTER,SAMLConstants::SAML1P_PREFIX);
602 QName StatusCode::RESPONDER(SAMLConstants::SAML1P_NS,_RESPONDER,SAMLConstants::SAML1P_PREFIX);
603 QName StatusCode::VERSIONMISMATCH(SAMLConstants::SAML1P_NS,_VERSIONMISMATCH,SAMLConstants::SAML1P_PREFIX);