Completed SAML 1 assertion schema, started test cases.
[shibboleth/cpp-opensaml.git] / saml / saml1 / core / impl / AssertionsImpl.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  * AssertionsImpl.cpp
19  * 
20  * Implementation classes for SAML 1.x Assertions schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "saml1/core/Assertions.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,AssertionIDReference);
55         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,Audience);
56         DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,ConfirmationMethod);
57         
58         class XMLTOOL_DLLLOCAL AudienceRestrictionConditionImpl : public virtual AudienceRestrictionCondition,
59             public AbstractComplexElement,
60             public AbstractDOMCachingXMLObject,
61             public AbstractValidatingXMLObject,
62             public AbstractXMLObjectMarshaller,
63             public AbstractXMLObjectUnmarshaller
64         {
65         public:
66             virtual ~AudienceRestrictionConditionImpl() {}
67     
68             AudienceRestrictionConditionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
69                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
70             }
71                 
72             AudienceRestrictionConditionImpl(const AudienceRestrictionConditionImpl& src)
73                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
74                 VectorOf(Audience) v=getAudiences();
75                 for (vector<Audience*>::const_iterator i=src.m_Audiences.begin(); i!=src.m_Audiences.end(); i++) {
76                     if (*i) {
77                         v.push_back((*i)->cloneAudience());
78                     }
79                 }
80             }
81             
82             IMPL_XMLOBJECT_CLONE(AudienceRestrictionCondition);
83             Condition* cloneCondition() const {
84                 return cloneAudienceRestrictionCondition();
85             }
86             IMPL_TYPED_CHILDREN(Audience,m_children.end());
87     
88         protected:
89             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
90                 PROC_TYPED_CHILDREN(Audience,SAMLConstants::SAML1_NS,false);
91                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
92             }
93         };
94
95         class XMLTOOL_DLLLOCAL DoNotCacheConditionImpl : public virtual DoNotCacheCondition,
96             public AbstractChildlessElement,
97             public AbstractDOMCachingXMLObject,
98             public AbstractValidatingXMLObject,
99             public AbstractXMLObjectMarshaller,
100             public AbstractXMLObjectUnmarshaller
101         {
102         public:
103             virtual ~DoNotCacheConditionImpl() {}
104     
105             DoNotCacheConditionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
106                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
107             }
108                 
109             DoNotCacheConditionImpl(const DoNotCacheConditionImpl& src)
110                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
111             }
112             
113             IMPL_XMLOBJECT_CLONE(DoNotCacheCondition);
114             Condition* cloneCondition() const {
115                 return cloneDoNotCacheCondition();
116             }
117         };
118
119         class SAML_DLLLOCAL ConditionsImpl : public virtual Conditions,
120             public AbstractComplexElement,
121             public AbstractDOMCachingXMLObject,
122             public AbstractValidatingXMLObject,
123             public AbstractXMLObjectMarshaller,
124             public AbstractXMLObjectUnmarshaller
125         {
126         public:
127             virtual ~ConditionsImpl() {
128                 delete m_NotBefore;
129                 delete m_NotOnOrAfter;
130             }
131     
132             ConditionsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
133                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
134                 init();
135             }
136                 
137             ConditionsImpl(const ConditionsImpl& src)
138                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
139                 init();
140                 setNotBefore(src.getNotBefore());
141                 setNotOnOrAfter(src.getNotOnOrAfter());
142
143                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
144                     if (*i) {
145                         AudienceRestrictionCondition* arc=dynamic_cast<AudienceRestrictionCondition*>(*i);
146                         if (arc) {
147                             getAudienceRestrictionConditions().push_back(arc->cloneAudienceRestrictionCondition());
148                             continue;
149                         }
150     
151                         DoNotCacheCondition* dncc=dynamic_cast<DoNotCacheCondition*>(*i);
152                         if (dncc) {
153                             getDoNotCacheConditions().push_back(dncc->cloneDoNotCacheCondition());
154                             continue;
155                         }
156     
157                         Condition* c=dynamic_cast<Condition*>(*i);
158                         if (c) {
159                             getConditions().push_back(c->cloneCondition());
160                             continue;
161                         }
162                     }
163                 }
164             }
165             
166             void init() {
167                 m_NotBefore=m_NotOnOrAfter=NULL;
168             }
169             
170             IMPL_XMLOBJECT_CLONE(Conditions);
171             IMPL_DATETIME_ATTRIB(NotBefore);
172             IMPL_DATETIME_ATTRIB(NotOnOrAfter);
173             IMPL_TYPED_CHILDREN(AudienceRestrictionCondition, m_children.end());
174             IMPL_TYPED_CHILDREN(DoNotCacheCondition,m_children.end());
175             IMPL_TYPED_CHILDREN(Condition,m_children.end());
176     
177         protected:
178             void marshallAttributes(DOMElement* domElement) const {
179                 MARSHALL_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
180                 MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
181             }
182     
183             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
184                 PROC_TYPED_CHILDREN(AudienceRestrictionCondition,SAMLConstants::SAML1_NS,true);
185                 PROC_TYPED_CHILDREN(DoNotCacheCondition,SAMLConstants::SAML1_NS,true);
186                 PROC_TYPED_CHILDREN(Condition,SAMLConstants::SAML1_NS,true);
187                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
188             }
189     
190             void processAttribute(const DOMAttr* attribute) {
191                 PROC_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
192                 PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
193             }
194         };
195
196         class SAML_DLLLOCAL NameIdentifierImpl : public virtual NameIdentifier,
197             public AbstractSimpleElement,
198             public AbstractChildlessElement,
199             public AbstractDOMCachingXMLObject,
200             public AbstractValidatingXMLObject,
201             public AbstractXMLObjectMarshaller,
202             public AbstractXMLObjectUnmarshaller
203         {
204         public:
205             virtual ~NameIdentifierImpl() {
206                 XMLString::release(&m_Format);
207                 XMLString::release(&m_NameQualifier);
208             }
209     
210             NameIdentifierImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
211                     : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
212                 init();
213             }
214                 
215             NameIdentifierImpl(const NameIdentifierImpl& src)
216                     : AbstractXMLObject(src), AbstractSimpleElement(src),
217                         AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
218                 init();
219                 setFormat(src.getFormat());
220                 setNameQualifier(src.getNameQualifier());
221             }
222             
223             void init() {
224                 m_Format=m_NameQualifier=NULL;
225             }
226             
227             IMPL_XMLOBJECT_CLONE(NameIdentifier);
228             IMPL_STRING_ATTRIB(Format);
229             IMPL_STRING_ATTRIB(NameQualifier);
230             IMPL_XMLOBJECT_CONTENT;
231     
232         protected:
233             void marshallAttributes(DOMElement* domElement) const {
234                 MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
235                 MARSHALL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
236             }
237
238             void processAttribute(const DOMAttr* attribute) {
239                 PROC_STRING_ATTRIB(Format,FORMAT,NULL);
240                 PROC_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
241             }
242         };
243
244         class SAML_DLLLOCAL SubjectConfirmationDataImpl
245             : public virtual SubjectConfirmationData, public AnyElementImpl, public AbstractValidatingXMLObject
246         {
247         public:
248             virtual ~SubjectConfirmationDataImpl() {}
249     
250             SubjectConfirmationDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
251                 : AnyElementImpl(nsURI, localName, prefix, schemaType) {
252             }
253                 
254             SubjectConfirmationDataImpl(const SubjectConfirmationDataImpl& src)
255                 : AnyElementImpl(src), AbstractValidatingXMLObject(src) {
256             }
257             
258             IMPL_XMLOBJECT_CLONE(SubjectConfirmationData);
259         };
260
261         class SAML_DLLLOCAL SubjectConfirmationImpl : public virtual SubjectConfirmation,
262             public AbstractComplexElement,
263             public AbstractDOMCachingXMLObject,
264             public AbstractValidatingXMLObject,
265             public AbstractXMLObjectMarshaller,
266             public AbstractXMLObjectUnmarshaller
267         {
268         public:
269             virtual ~SubjectConfirmationImpl() {}
270     
271             SubjectConfirmationImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
272                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
273                 init();
274             }
275                 
276             SubjectConfirmationImpl(const SubjectConfirmationImpl& src)
277                     : AbstractXMLObject(src),
278                         AbstractDOMCachingXMLObject(src),
279                         AbstractValidatingXMLObject(src) {
280                 init();
281                 if (src.getSubjectConfirmationData())
282                     setSubjectConfirmationData(src.getSubjectConfirmationData()->clone());
283                 if (src.getKeyInfo())
284                     setKeyInfo(src.getKeyInfo()->cloneKeyInfo());
285                 VectorOf(ConfirmationMethod) v=getConfirmationMethods();
286                 for (vector<ConfirmationMethod*>::const_iterator i=src.m_ConfirmationMethods.begin(); i!=src.m_ConfirmationMethods.end(); i++) {
287                     if (*i) {
288                         v.push_back((*i)->cloneConfirmationMethod());
289                     }
290                 }
291             }
292             
293             void init() {
294                 m_SubjectConfirmationData=NULL;
295                 m_KeyInfo=NULL;
296                 m_children.push_back(NULL);
297                 m_children.push_back(NULL);
298                 m_pos_SubjectConfirmationData=m_children.begin();
299                 m_pos_KeyInfo=m_pos_SubjectConfirmationData;
300                 ++m_pos_KeyInfo;
301             }
302
303             IMPL_XMLOBJECT_CLONE(SubjectConfirmation);
304             IMPL_TYPED_CHILDREN(ConfirmationMethod,m_pos_SubjectConfirmationData);
305             IMPL_XMLOBJECT_CHILD(SubjectConfirmationData);
306             IMPL_TYPED_CHILD(KeyInfo);
307     
308         protected:
309             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
310                 PROC_TYPED_CHILDREN(ConfirmationMethod,SAMLConstants::SAML1_NS,false);
311                 PROC_TYPED_CHILD(KeyInfo,XMLConstants::XMLSIG_NS,false);
312                 
313                 // Anything else we'll assume is the data.
314                 if (getSubjectConfirmationData())
315                     throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString().c_str()));
316                 setSubjectConfirmationData(childXMLObject);
317             }
318         };
319
320         class SAML_DLLLOCAL SubjectImpl : public virtual Subject,
321             public AbstractComplexElement,
322             public AbstractDOMCachingXMLObject,
323             public AbstractValidatingXMLObject,
324             public AbstractXMLObjectMarshaller,
325             public AbstractXMLObjectUnmarshaller
326         {
327         public:
328             virtual ~SubjectImpl() {}
329     
330             SubjectImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
331                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
332                 init();
333             }
334                 
335             SubjectImpl(const SubjectImpl& src)
336                     : AbstractXMLObject(src),
337                         AbstractDOMCachingXMLObject(src),
338                         AbstractValidatingXMLObject(src) {
339                 init();
340                 if (src.getNameIdentifier())
341                     setNameIdentifier(src.getNameIdentifier()->cloneNameIdentifier());
342                 if (src.getSubjectConfirmation())
343                     setSubjectConfirmation(src.getSubjectConfirmation()->cloneSubjectConfirmation());
344             }
345             
346             void init() {
347                 m_NameIdentifier=NULL;
348                 m_SubjectConfirmation=NULL;
349                 m_children.push_back(NULL);
350                 m_children.push_back(NULL);
351                 m_pos_NameIdentifier=m_children.begin();
352                 m_pos_SubjectConfirmation=m_pos_NameIdentifier;
353                 ++m_pos_SubjectConfirmation;
354             }
355
356             IMPL_XMLOBJECT_CLONE(Subject);
357             IMPL_TYPED_CHILD(NameIdentifier);
358             IMPL_TYPED_CHILD(SubjectConfirmation);
359     
360         protected:
361             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
362                 PROC_TYPED_CHILD(NameIdentifier,SAMLConstants::SAML1_NS,true);
363                 PROC_TYPED_CHILD(SubjectConfirmation,SAMLConstants::SAML1_NS,true);
364                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
365             }
366         };
367
368         class SAML_DLLLOCAL SubjectStatementImpl : public virtual SubjectStatement,
369             public AbstractComplexElement,
370             public AbstractDOMCachingXMLObject,
371             public AbstractValidatingXMLObject,
372             public AbstractXMLObjectMarshaller,
373             public AbstractXMLObjectUnmarshaller
374         {
375         public:
376             virtual ~SubjectStatementImpl() {}
377     
378             SubjectStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
379                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
380                 init();
381             }
382                 
383             SubjectStatementImpl(const SubjectStatementImpl& src)
384                     : AbstractXMLObject(src),
385                         AbstractDOMCachingXMLObject(src),
386                         AbstractValidatingXMLObject(src) {
387                 init();
388                 if (src.getSubject())
389                     setSubject(src.getSubject()->cloneSubject());
390             }
391             
392             void init() {
393                 m_Subject=NULL;
394                 m_children.push_back(NULL);
395                 m_pos_Subject=m_children.begin();
396             }
397
398             IMPL_TYPED_CHILD(Subject);
399     
400         protected:
401             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
402                 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
403                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
404             }
405         };
406
407         class SAML_DLLLOCAL SubjectLocalityImpl : public virtual SubjectLocality,
408             public AbstractChildlessElement,
409             public AbstractDOMCachingXMLObject,
410             public AbstractValidatingXMLObject,
411             public AbstractXMLObjectMarshaller,
412             public AbstractXMLObjectUnmarshaller
413         {
414         public:
415             virtual ~SubjectLocalityImpl() {
416                 XMLString::release(&m_IPAddress);
417                 XMLString::release(&m_DNSAddress);
418             }
419     
420             SubjectLocalityImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
421                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
422                 init();
423             }
424                 
425             SubjectLocalityImpl(const SubjectLocalityImpl& src)
426                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
427                 init();
428                 setIPAddress(src.getIPAddress());
429                 setDNSAddress(src.getDNSAddress());
430             }
431             
432             void init() {
433                 m_IPAddress=m_DNSAddress=NULL;
434             }
435             
436             IMPL_XMLOBJECT_CLONE(SubjectLocality);
437             IMPL_STRING_ATTRIB(IPAddress);
438             IMPL_STRING_ATTRIB(DNSAddress);
439     
440         protected:
441             void marshallAttributes(DOMElement* domElement) const {
442                 MARSHALL_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
443                 MARSHALL_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
444             }
445     
446             void processAttribute(const DOMAttr* attribute) {
447                 PROC_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
448                 PROC_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
449             }
450         };
451
452         class SAML_DLLLOCAL AuthorityBindingImpl : public virtual AuthorityBinding,
453             public AbstractChildlessElement,
454             public AbstractDOMCachingXMLObject,
455             public AbstractValidatingXMLObject,
456             public AbstractXMLObjectMarshaller,
457             public AbstractXMLObjectUnmarshaller
458         {
459         public:
460             virtual ~AuthorityBindingImpl() {
461                 delete m_AuthorityKind;
462                 XMLString::release(&m_Location);
463                 XMLString::release(&m_Binding);
464             }
465     
466             AuthorityBindingImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
467                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
468                 init();
469             }
470                 
471             AuthorityBindingImpl(const AuthorityBindingImpl& src)
472                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
473                 init();
474                 setAuthorityKind(src.getAuthorityKind());
475                 setLocation(src.getLocation());
476                 setBinding(src.getBinding());
477             }
478             
479             void init() {
480                 m_AuthorityKind=NULL;
481                 m_Location=m_Binding=NULL;
482             }
483             
484             IMPL_XMLOBJECT_CLONE(AuthorityBinding);
485             IMPL_XMLOBJECT_ATTRIB(AuthorityKind,QName);
486             IMPL_STRING_ATTRIB(Location);
487             IMPL_STRING_ATTRIB(Binding);
488     
489         protected:
490             void marshallAttributes(DOMElement* domElement) const {
491                 MARSHALL_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
492                 MARSHALL_STRING_ATTRIB(Location,LOCATION,NULL);
493                 MARSHALL_STRING_ATTRIB(Binding,BINDING,NULL);
494             }
495     
496             void processAttribute(const DOMAttr* attribute) {
497                 PROC_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
498                 PROC_STRING_ATTRIB(Location,LOCATION,NULL);
499                 PROC_STRING_ATTRIB(Binding,BINDING,NULL);
500             }
501         };
502
503         class SAML_DLLLOCAL AuthenticationStatementImpl : public virtual AuthenticationStatement, public SubjectStatementImpl
504         {
505         public:
506             virtual ~AuthenticationStatementImpl() {
507                 XMLString::release(&m_AuthenticationMethod);
508                 delete m_AuthenticationInstant;
509             }
510     
511             AuthenticationStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
512                 : SubjectStatementImpl(nsURI, localName, prefix, schemaType) {
513                 init();
514             }
515                 
516             AuthenticationStatementImpl(const AuthenticationStatementImpl& src) : SubjectStatementImpl(src) {
517                 init();
518                 setAuthenticationMethod(src.getAuthenticationMethod());
519                 setAuthenticationInstant(src.getAuthenticationInstant());
520                 if (src.getSubjectLocality())
521                     setSubjectLocality(src.getSubjectLocality()->cloneSubjectLocality());
522                 VectorOf(AuthorityBinding) v=getAuthorityBindings();
523                 for (vector<AuthorityBinding*>::const_iterator i=src.m_AuthorityBindings.begin(); i!=src.m_AuthorityBindings.end(); i++) {
524                     if (*i) {
525                         v.push_back((*i)->cloneAuthorityBinding());
526                     }
527                 }
528             }
529             
530             void init() {
531                 SubjectStatementImpl::init();
532                 m_AuthenticationMethod=NULL;
533                 m_AuthenticationInstant=NULL;
534                 m_SubjectLocality=NULL;
535                 m_children.push_back(NULL);
536                 m_pos_SubjectLocality=m_pos_Subject;
537                 m_pos_SubjectLocality++;
538             }
539             
540             IMPL_XMLOBJECT_CLONE(AuthenticationStatement);
541             SubjectStatement* cloneSubjectStatement() const {
542                 return cloneAuthenticationStatement();
543             }
544             Statement* cloneStatement() const {
545                 return cloneAuthenticationStatement();
546             }
547             IMPL_STRING_ATTRIB(AuthenticationMethod);
548             IMPL_DATETIME_ATTRIB(AuthenticationInstant);
549             IMPL_TYPED_CHILD(SubjectLocality);
550             IMPL_TYPED_CHILDREN(AuthorityBinding, m_children.end());
551     
552         protected:
553             void marshallAttributes(DOMElement* domElement) const {
554                 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
555                 MARSHALL_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
556                 SubjectStatementImpl::marshallAttributes(domElement);
557             }
558     
559             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
560                 PROC_TYPED_CHILD(SubjectLocality,SAMLConstants::SAML1_NS,false);
561                 PROC_TYPED_CHILDREN(AuthorityBinding,SAMLConstants::SAML1_NS,false);
562                 SubjectStatementImpl::processChildElement(childXMLObject,root);
563             }
564     
565             void processAttribute(const DOMAttr* attribute) {
566                 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
567                 PROC_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
568                 SubjectStatementImpl::processAttribute(attribute);
569             }
570         };
571
572         class SAML_DLLLOCAL ActionImpl : public virtual Action,
573             public AbstractSimpleElement,
574             public AbstractChildlessElement,
575             public AbstractDOMCachingXMLObject,
576             public AbstractValidatingXMLObject,
577             public AbstractXMLObjectMarshaller,
578             public AbstractXMLObjectUnmarshaller
579         {
580         public:
581             virtual ~ActionImpl() {
582                 XMLString::release(&m_Namespace);
583             }
584     
585             ActionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
586                     : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Namespace(NULL) {
587             }
588                 
589             ActionImpl(const ActionImpl& src)
590                     : AbstractXMLObject(src), AbstractSimpleElement(src),
591                         AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
592                 setNamespace(src.getNamespace());
593             }
594             
595             IMPL_XMLOBJECT_CLONE(Action);
596             IMPL_STRING_ATTRIB(Namespace);
597             IMPL_XMLOBJECT_CONTENT;
598     
599         protected:
600             void marshallAttributes(DOMElement* domElement) const {
601                 MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
602             }
603
604             void processAttribute(const DOMAttr* attribute) {
605                 PROC_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
606             }
607         };
608
609         class SAML_DLLLOCAL EvidenceImpl : public virtual Evidence,
610             public AbstractComplexElement,
611             public AbstractDOMCachingXMLObject,
612             public AbstractValidatingXMLObject,
613             public AbstractXMLObjectMarshaller,
614             public AbstractXMLObjectUnmarshaller
615         {
616         public:
617             virtual ~EvidenceImpl() {}
618     
619             EvidenceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
620                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
621             }
622                 
623             EvidenceImpl(const EvidenceImpl& src)
624                     : AbstractXMLObject(src),
625                         AbstractDOMCachingXMLObject(src),
626                         AbstractValidatingXMLObject(src) {
627     
628                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
629                     if (*i) {
630                         AssertionIDReference* ref=dynamic_cast<AssertionIDReference*>(*i);
631                         if (ref) {
632                             getAssertionIDReferences().push_back(ref->cloneAssertionIDReference());
633                             continue;
634                         }
635     
636                         Assertion* assertion=dynamic_cast<Assertion*>(*i);
637                         if (assertion) {
638                             getAssertions().push_back(assertion->cloneAssertion());
639                             continue;
640                         }
641                     }
642                 }
643             }
644             
645             IMPL_XMLOBJECT_CLONE(Evidence);
646             IMPL_TYPED_CHILDREN(AssertionIDReference,m_children.end());
647             IMPL_TYPED_CHILDREN(Assertion,m_children.end());
648     
649         protected:
650             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
651                 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
652                 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
653                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
654             }
655         };
656
657         class SAML_DLLLOCAL AuthorizationDecisionStatementImpl
658             : public virtual AuthorizationDecisionStatement, public SubjectStatementImpl
659         {
660         public:
661             virtual ~AuthorizationDecisionStatementImpl() {
662                 XMLString::release(&m_Resource);
663                 XMLString::release(&m_Decision);
664             }
665     
666             AuthorizationDecisionStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
667                 : SubjectStatementImpl(nsURI, localName, prefix, schemaType) {
668                 init();
669             }
670                 
671             AuthorizationDecisionStatementImpl(const AuthorizationDecisionStatementImpl& src) : SubjectStatementImpl(src) {
672                 init();
673                 setResource(src.getResource());
674                 setDecision(src.getDecision());
675                 if (src.getEvidence())
676                     setEvidence(src.getEvidence()->cloneEvidence());
677                 VectorOf(Action) v=getActions();
678                 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
679                     if (*i) {
680                         v.push_back((*i)->cloneAction());
681                     }
682                 }
683             }
684             
685             void init() {
686                 SubjectStatementImpl::init();
687                 m_Resource=NULL;
688                 m_Decision=NULL;
689                 m_Evidence=NULL;
690                 m_children.push_back(NULL);
691                 m_pos_Evidence=m_pos_Subject;
692                 m_pos_Evidence++;
693             }
694             
695             IMPL_XMLOBJECT_CLONE(AuthorizationDecisionStatement);
696             SubjectStatement* cloneSubjectStatement() const {
697                 return cloneAuthorizationDecisionStatement();
698             }
699             Statement* cloneStatement() const {
700                 return cloneAuthorizationDecisionStatement();
701             }
702             IMPL_STRING_ATTRIB(Resource);
703             IMPL_STRING_ATTRIB(Decision);
704             IMPL_TYPED_CHILD(Evidence);
705             IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
706     
707         protected:
708             void marshallAttributes(DOMElement* domElement) const {
709                 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
710                 MARSHALL_STRING_ATTRIB(Decision,DECISION,NULL);
711                 SubjectStatementImpl::marshallAttributes(domElement);
712             }
713     
714             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
715                 PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false);
716                 PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false);
717                 SubjectStatementImpl::processChildElement(childXMLObject,root);
718             }
719     
720             void processAttribute(const DOMAttr* attribute) {
721                 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
722                 PROC_STRING_ATTRIB(Decision,DECISION,NULL);
723                 SubjectStatementImpl::processAttribute(attribute);
724             }
725         };
726
727         class SAML_DLLLOCAL AttributeDesignatorImpl : public virtual AttributeDesignator,
728             public AbstractChildlessElement,
729             public AbstractDOMCachingXMLObject,
730             public AbstractValidatingXMLObject,
731             public AbstractXMLObjectMarshaller,
732             public AbstractXMLObjectUnmarshaller
733         {
734         public:
735             virtual ~AttributeDesignatorImpl() {
736                 XMLString::release(&m_AttributeName);
737                 XMLString::release(&m_AttributeNamespace);
738             }
739     
740             AttributeDesignatorImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
741                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
742                 init();
743             }
744                 
745             AttributeDesignatorImpl(const AttributeDesignatorImpl& src)
746                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
747                 init();
748                 setAttributeName(src.getAttributeName());
749                 setAttributeNamespace(src.getAttributeNamespace());
750             }
751             
752             void init() {
753                 m_AttributeName=m_AttributeNamespace=NULL;
754             }
755             
756             IMPL_XMLOBJECT_CLONE(AttributeDesignator);
757             IMPL_STRING_ATTRIB(AttributeName);
758             IMPL_STRING_ATTRIB(AttributeNamespace);
759     
760         protected:
761             void marshallAttributes(DOMElement* domElement) const {
762                 MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
763                 MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
764             }
765     
766             void processAttribute(const DOMAttr* attribute) {
767                 PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
768                 PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
769             }
770         };
771
772         class SAML_DLLLOCAL AttributeImpl : public virtual Attribute,
773             public AbstractComplexElement,
774             public AbstractDOMCachingXMLObject,
775             public AbstractValidatingXMLObject,
776             public AbstractXMLObjectMarshaller,
777             public AbstractXMLObjectUnmarshaller
778         {
779         public:
780             virtual ~AttributeImpl() {
781                 XMLString::release(&m_AttributeName);
782                 XMLString::release(&m_AttributeNamespace);
783             }
784     
785             AttributeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
786                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
787                 init();
788             }
789                 
790             AttributeImpl(const AttributeImpl& src)
791                     : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
792                 init();
793                 setAttributeName(src.getAttributeName());
794                 setAttributeNamespace(src.getAttributeNamespace());
795                 VectorOf(XMLObject) v=getAttributeValues();
796                 for (vector<XMLObject*>::const_iterator i=src.m_AttributeValues.begin(); i!=src.m_AttributeValues.end(); i++) {
797                     if (*i) {
798                         v.push_back((*i)->clone());
799                     }
800                 }
801             }
802             
803             void init() {
804                 m_AttributeName=m_AttributeNamespace=NULL;
805             }
806             
807             IMPL_XMLOBJECT_CLONE(Attribute);
808             AttributeDesignator* cloneAttributeDesignator() const {
809                 return cloneAttribute();
810             }
811             IMPL_STRING_ATTRIB(AttributeName);
812             IMPL_STRING_ATTRIB(AttributeNamespace);
813             IMPL_XMLOBJECT_CHILDREN(AttributeValue,m_children.end());
814     
815         protected:
816             void marshallAttributes(DOMElement* domElement) const {
817                 MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
818                 MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
819             }
820
821             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
822                 getAttributeValues().push_back(childXMLObject);
823             }
824
825             void processAttribute(const DOMAttr* attribute) {
826                 PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
827                 PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
828             }
829         };
830
831         class SAML_DLLLOCAL AttributeValueImpl
832             : public virtual AttributeValue, public AnyElementImpl, public AbstractValidatingXMLObject
833         {
834         public:
835             virtual ~AttributeValueImpl() {}
836     
837             AttributeValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
838                 : AnyElementImpl(nsURI, localName, prefix, schemaType) {
839             }
840                 
841             AttributeValueImpl(const AttributeValueImpl& src) : AnyElementImpl(src), AbstractValidatingXMLObject(src) {}
842             
843             IMPL_XMLOBJECT_CLONE(AttributeValue);
844         };
845
846         class SAML_DLLLOCAL AttributeStatementImpl : public virtual AttributeStatement, public SubjectStatementImpl
847         {
848         public:
849             virtual ~AttributeStatementImpl() {}
850     
851             AttributeStatementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
852                 : SubjectStatementImpl(nsURI, localName, prefix, schemaType) {
853                 init();
854             }
855                 
856             AttributeStatementImpl(const AttributeStatementImpl& src) : SubjectStatementImpl(src) {
857                 VectorOf(Attribute) v=getAttributes();
858                 for (vector<Attribute*>::const_iterator i=src.m_Attributes.begin(); i!=src.m_Attributes.end(); i++) {
859                     if (*i) {
860                         v.push_back((*i)->cloneAttribute());
861                     }
862                 }
863             }
864             
865             IMPL_XMLOBJECT_CLONE(AttributeStatement);
866             SubjectStatement* cloneSubjectStatement() const {
867                 return cloneAttributeStatement();
868             }
869             Statement* cloneStatement() const {
870                 return cloneAttributeStatement();
871             }
872             IMPL_TYPED_CHILDREN(Attribute, m_children.end());
873     
874         protected:
875             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
876                 PROC_TYPED_CHILDREN(Attribute,SAMLConstants::SAML1_NS,true);
877                 SubjectStatementImpl::processChildElement(childXMLObject,root);
878             }
879         };
880
881         class SAML_DLLLOCAL AdviceImpl : public virtual Advice,
882             public AbstractComplexElement,
883             public AbstractDOMCachingXMLObject,
884             public AbstractValidatingXMLObject,
885             public AbstractXMLObjectMarshaller,
886             public AbstractXMLObjectUnmarshaller
887         {
888         public:
889             virtual ~AdviceImpl() {}
890     
891             AdviceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
892                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
893             }
894                 
895             AdviceImpl(const AdviceImpl& src)
896                     : AbstractXMLObject(src),
897                         AbstractDOMCachingXMLObject(src),
898                         AbstractValidatingXMLObject(src) {
899     
900                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
901                     if (*i) {
902                         AssertionIDReference* ref=dynamic_cast<AssertionIDReference*>(*i);
903                         if (ref) {
904                             getAssertionIDReferences().push_back(ref->cloneAssertionIDReference());
905                             continue;
906                         }
907     
908                         Assertion* assertion=dynamic_cast<Assertion*>(*i);
909                         if (assertion) {
910                             getAssertions().push_back(assertion->cloneAssertion());
911                             continue;
912                         }
913     
914                         getOthers().push_back((*i)->clone());
915                     }
916                 }
917             }
918             
919             IMPL_XMLOBJECT_CLONE(Advice);
920             IMPL_TYPED_CHILDREN(AssertionIDReference,m_children.end());
921             IMPL_TYPED_CHILDREN(Assertion,m_children.end());
922             IMPL_XMLOBJECT_CHILDREN(Other,m_children.end());
923     
924         protected:
925             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
926                 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
927                 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
928                 
929                 // Unknown child.
930                 const XMLCh* nsURI=root->getNamespaceURI();
931                 if (!XMLString::equals(nsURI,SAMLConstants::SAML1_NS) && nsURI && *nsURI)
932                     getOthers().push_back(childXMLObject);
933                 
934                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
935             }
936         };
937
938         class SAML_DLLLOCAL AssertionImpl : public virtual Assertion,
939             public AbstractComplexElement,
940             public AbstractDOMCachingXMLObject,
941             public AbstractValidatingXMLObject,
942             public AbstractXMLObjectMarshaller,
943             public AbstractXMLObjectUnmarshaller
944         {
945         public:
946             virtual ~AssertionImpl() {
947                 XMLString::release(&m_AssertionID);
948                 XMLString::release(&m_Issuer);
949                 delete m_IssueInstant;
950             }
951     
952             AssertionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
953                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
954                 init();
955             }
956                 
957             AssertionImpl(const AssertionImpl& src)                     
958                 : AbstractXMLObject(src),
959                     AbstractDOMCachingXMLObject(src),
960                     AbstractValidatingXMLObject(src) {
961                 init();
962                 setMinorVersion(src.getMinorVersion());
963                 setAssertionID(src.getAssertionID());
964                 setIssuer(src.getIssuer());
965                 setIssueInstant(src.getIssueInstant());
966                 if (src.getConditions())
967                     setConditions(src.getConditions()->cloneConditions());
968                 if (src.getAdvice())
969                     setAdvice(src.getAdvice()->cloneAdvice());
970                 if (src.getSignature())
971                     setSignature(src.getSignature()->cloneSignature());
972                 for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {
973                     if (*i) {
974                         AuthenticationStatement* authst=dynamic_cast<AuthenticationStatement*>(*i);
975                         if (authst) {
976                             getAuthenticationStatements().push_back(authst->cloneAuthenticationStatement());
977                             continue;
978                         }
979     
980                         SubjectStatement* subst=dynamic_cast<SubjectStatement*>(*i);
981                         if (subst) {
982                             getSubjectStatements().push_back(subst->cloneSubjectStatement());
983                             continue;
984                         }
985     
986                         Statement* st=dynamic_cast<Statement*>(*i);
987                         if (st) {
988                             getStatements().push_back(st->cloneStatement());
989                             continue;
990                         }
991                     }
992                 }
993             }
994             
995             void init() {
996                 m_MinorVersion=1;
997                 m_AssertionID=NULL;
998                 m_Issuer=NULL;
999                 m_IssueInstant=NULL;
1000                 m_children.push_back(NULL);
1001                 m_children.push_back(NULL);
1002                 m_children.push_back(NULL);
1003                 m_Conditions=NULL;
1004                 m_Advice=NULL;
1005                 m_Signature=NULL;
1006                 m_pos_Conditions=m_children.begin();
1007                 m_pos_Advice=m_pos_Conditions;
1008                 m_pos_Advice++;
1009                 m_pos_Signature=m_pos_Advice;
1010                 m_pos_Signature++;
1011             }
1012             
1013             IMPL_XMLOBJECT_CLONE(Assertion);
1014             IMPL_INTEGER_ATTRIB(MinorVersion);
1015             IMPL_STRING_ATTRIB(AssertionID);
1016             IMPL_STRING_ATTRIB(Issuer);
1017             IMPL_DATETIME_ATTRIB(IssueInstant);
1018             IMPL_TYPED_CHILD(Conditions);
1019             IMPL_TYPED_CHILD(Advice);
1020             IMPL_TYPED_CHILD(Signature);
1021             IMPL_TYPED_CHILDREN(Statement, m_pos_Signature);
1022             IMPL_TYPED_CHILDREN(SubjectStatement, m_pos_Signature);
1023             IMPL_TYPED_CHILDREN(AuthenticationStatement, m_pos_Signature);
1024     
1025         protected:
1026             void marshallAttributes(DOMElement* domElement) const {
1027                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
1028                 static const XMLCh ONE[] = { chDigit_1, chNull };
1029                 domElement->setAttributeNS(NULL,MAJORVERSION,ONE);
1030                 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
1031                 if (!m_AssertionID)
1032                     const_cast<AssertionImpl*>(this)->m_AssertionID=SAMLConfig::getConfig().generateIdentifier();
1033                 MARSHALL_ID_ATTRIB(AssertionID,ASSERTIONID,NULL);
1034                 MARSHALL_STRING_ATTRIB(Issuer,ISSUER,NULL);
1035                 if (!m_IssueInstant)
1036                     const_cast<AssertionImpl*>(this)->m_IssueInstant=new DateTime(time(NULL));
1037                 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1038             }
1039     
1040             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
1041                 PROC_TYPED_CHILD(Conditions,SAMLConstants::SAML1_NS,false);
1042                 PROC_TYPED_CHILD(Advice,SAMLConstants::SAML1_NS,false);
1043                 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
1044                 PROC_TYPED_CHILDREN(AuthenticationStatement,SAMLConstants::SAML1_NS,false);
1045                 PROC_TYPED_CHILDREN(SubjectStatement,SAMLConstants::SAML1_NS,true);
1046                 PROC_TYPED_CHILDREN(Statement,SAMLConstants::SAML1_NS,true);
1047                 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
1048             }
1049     
1050             void processAttribute(const DOMAttr* attribute) {
1051                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
1052                 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
1053                     if (XMLString::parseInt(attribute->getValue()) != 1)
1054                         throw UnmarshallingException("Assertion has invalid major version.");
1055                 }
1056                 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
1057                 PROC_ID_ATTRIB(AssertionID,ASSERTIONID,NULL);
1058                 PROC_STRING_ATTRIB(Issuer,ISSUER,NULL);
1059                 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
1060             }
1061         };
1062     
1063     };
1064 };
1065
1066 #if defined (_MSC_VER)
1067     #pragma warning( pop )
1068 #endif
1069
1070 // Builder Implementations
1071
1072 IMPL_XMLOBJECTBUILDER(Action);
1073 IMPL_XMLOBJECTBUILDER(Advice);
1074 IMPL_XMLOBJECTBUILDER(Assertion);
1075 IMPL_XMLOBJECTBUILDER(AssertionIDReference);
1076 IMPL_XMLOBJECTBUILDER(Attribute);
1077 IMPL_XMLOBJECTBUILDER(AttributeDesignator);
1078 IMPL_XMLOBJECTBUILDER(AttributeStatement);
1079 IMPL_XMLOBJECTBUILDER(AttributeValue);
1080 IMPL_XMLOBJECTBUILDER(Audience);
1081 IMPL_XMLOBJECTBUILDER(AudienceRestrictionCondition);
1082 IMPL_XMLOBJECTBUILDER(AuthenticationStatement);
1083 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionStatement);
1084 IMPL_XMLOBJECTBUILDER(AuthorityBinding);
1085 IMPL_XMLOBJECTBUILDER(Conditions);
1086 IMPL_XMLOBJECTBUILDER(ConfirmationMethod);
1087 IMPL_XMLOBJECTBUILDER(DoNotCacheCondition);
1088 IMPL_XMLOBJECTBUILDER(Evidence);
1089 IMPL_XMLOBJECTBUILDER(NameIdentifier);
1090 IMPL_XMLOBJECTBUILDER(Subject);
1091 IMPL_XMLOBJECTBUILDER(SubjectConfirmation);
1092 IMPL_XMLOBJECTBUILDER(SubjectConfirmationData);
1093 IMPL_XMLOBJECTBUILDER(SubjectLocality);
1094
1095 // Unicode literals
1096 const XMLCh Action::LOCAL_NAME[] =                  UNICODE_LITERAL_6(A,c,t,i,o,n);
1097 const XMLCh Action::TYPE_NAME[] =                   UNICODE_LITERAL_10(A,c,t,i,o,n,T,y,p,e);
1098 const XMLCh Action::NAMESPACE_ATTRIB_NAME[] =       UNICODE_LITERAL_9(N,a,m,e,s,p,a,c,e);
1099 const XMLCh Advice::LOCAL_NAME[] =                  UNICODE_LITERAL_6(A,d,v,i,c,e);
1100 const XMLCh Advice::TYPE_NAME[] =                   UNICODE_LITERAL_10(A,d,v,i,c,e,T,y,p,e);
1101 const XMLCh Assertion::LOCAL_NAME[] =               UNICODE_LITERAL_9(A,s,s,e,r,t,i,o,n);
1102 const XMLCh Assertion::TYPE_NAME[] =                UNICODE_LITERAL_13(A,s,s,e,r,t,i,o,n,T,y,p,e);
1103 const XMLCh Assertion::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
1104 const XMLCh Assertion::ASSERTIONID_ATTRIB_NAME[] =  UNICODE_LITERAL_11(A,s,s,e,r,t,i,o,n,I,D);
1105 const XMLCh Assertion::ISSUER_ATTRIB_NAME[] =       UNICODE_LITERAL_6(I,s,s,u,e,r);
1106 const XMLCh Assertion::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
1107 const XMLCh AssertionIDReference::LOCAL_NAME[] =    UNICODE_LITERAL_20(A,s,s,e,r,t,i,o,n,I,D,R,e,f,e,r,e,n,c,e);
1108 const XMLCh Attribute::LOCAL_NAME[] =               UNICODE_LITERAL_9(A,t,t,r,i,b,u,t,e);
1109 const XMLCh Attribute::TYPE_NAME[] =                UNICODE_LITERAL_13(A,t,t,r,i,b,u,t,e,T,y,p,e);
1110 const XMLCh AttributeDesignator::LOCAL_NAME[] =     UNICODE_LITERAL_19(A,t,t,r,i,b,u,t,e,D,e,s,i,g,n,a,t,o,r);
1111 const XMLCh AttributeDesignator::TYPE_NAME[] =      UNICODE_LITERAL_23(A,t,t,r,i,b,u,t,e,D,e,s,i,g,n,a,t,o,r,T,y,p,e);
1112 const XMLCh AttributeDesignator::ATTRIBUTENAME_ATTRIB_NAME[] =              UNICODE_LITERAL_13(A,t,t,r,i,b,u,t,e,N,a,m,e);
1113 const XMLCh AttributeDesignator::ATTRIBUTENAMESPACE_ATTRIB_NAME[] =         UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,N,a,m,e,s,p,a,c,e);
1114 const XMLCh AttributeStatement::LOCAL_NAME[] =      UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,S,t,a,t,e,m,e,n,t);
1115 const XMLCh AttributeStatement::TYPE_NAME[] =       UNICODE_LITERAL_22(A,t,t,r,i,b,u,t,e,S,t,a,t,e,m,e,n,t,T,y,p,e);
1116 const XMLCh AttributeValue::LOCAL_NAME[] =          UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,V,a,l,u,e);
1117 const XMLCh Audience::LOCAL_NAME[] =                UNICODE_LITERAL_8(A,u,d,i,e,n,c,e);
1118 const XMLCh AudienceRestrictionCondition::LOCAL_NAME[] =    UNICODE_LITERAL_28(A,u,d,i,e,n,c,e,R,e,s,t,r,i,c,t,i,o,n,C,o,n,d,i,t,i,o,n);
1119 const XMLCh AudienceRestrictionCondition::TYPE_NAME[] =     UNICODE_LITERAL_32(A,u,d,i,e,n,c,e,R,e,s,t,r,i,c,t,i,o,n,C,o,n,d,i,t,i,o,n,T,y,p,e);
1120 const XMLCh AuthenticationStatement::LOCAL_NAME[] = UNICODE_LITERAL_23(A,u,t,h,e,n,t,i,c,a,t,i,o,n,S,t,a,t,e,m,e,n,t);
1121 const XMLCh AuthenticationStatement::TYPE_NAME[] =  UNICODE_LITERAL_27(A,u,t,h,e,n,t,i,c,a,t,i,o,n,S,t,a,t,e,m,e,n,t,T,y,p,e);
1122 const XMLCh AuthenticationStatement::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);
1123 const XMLCh AuthenticationStatement::AUTHENTICATIONINSTANT_ATTRIB_NAME[] =  UNICODE_LITERAL_21(A,u,t,h,e,n,t,i,c,a,t,i,o,n,I,n,s,t,a,n,t);
1124 const XMLCh AuthorityBinding::LOCAL_NAME[] =        UNICODE_LITERAL_16(A,u,t,h,o,r,i,t,y,B,i,n,d,i,n,g);
1125 const XMLCh AuthorityBinding::TYPE_NAME[] =         UNICODE_LITERAL_20(A,u,t,h,o,r,i,t,y,B,i,n,d,i,n,g,T,y,p,e);
1126 const XMLCh AuthorityBinding::AUTHORITYKIND_ATTRIB_NAME[] = UNICODE_LITERAL_13(A,u,t,h,o,r,i,t,y,K,i,n,d);
1127 const XMLCh AuthorityBinding::LOCATION_ATTRIB_NAME[] =      UNICODE_LITERAL_8(L,o,c,a,t,i,o,n);
1128 const XMLCh AuthorityBinding::BINDING_ATTRIB_NAME[] =       UNICODE_LITERAL_7(B,i,n,d,i,n,g);
1129 const XMLCh AuthorizationDecisionStatement::LOCAL_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,S,t,a,t,e,m,e,n,t);
1130 const XMLCh AuthorizationDecisionStatement::TYPE_NAME[] =   UNICODE_LITERAL_34(A,u,t,h,o,r,i,z,a,t,i,o,n,D,e,c,i,s,i,o,n,S,t,a,t,e,m,e,n,t,T,y,p,e);
1131 const XMLCh AuthorizationDecisionStatement::RESOURCE_ATTRIB_NAME[] =        UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
1132 const XMLCh AuthorizationDecisionStatement::DECISION_ATTRIB_NAME[] =        UNICODE_LITERAL_8(D,e,c,i,s,i,o,n);
1133 const XMLCh AuthorizationDecisionStatement::DECISION_PERMIT[] =             UNICODE_LITERAL_6(P,e,r,m,i,t);
1134 const XMLCh AuthorizationDecisionStatement::DECISION_DENY[] =               UNICODE_LITERAL_4(D,e,n,y);
1135 const XMLCh AuthorizationDecisionStatement::DECISION_INDETERMINATE[] =      UNICODE_LITERAL_13(I,n,d,e,t,e,r,m,i,n,a,t,e);
1136 const XMLCh Condition::LOCAL_NAME[] =               UNICODE_LITERAL_9(C,o,n,d,i,t,i,o,n);
1137 const XMLCh Conditions::LOCAL_NAME[] =              UNICODE_LITERAL_10(C,o,n,d,i,t,i,o,n,s);
1138 const XMLCh Conditions::TYPE_NAME[] =               UNICODE_LITERAL_14(C,o,n,d,i,t,i,o,n,s,T,y,p,e);
1139 const XMLCh Conditions::NOTBEFORE_ATTRIB_NAME[] =   UNICODE_LITERAL_9(N,o,t,B,e,f,o,r,e);
1140 const XMLCh Conditions::NOTONORAFTER_ATTRIB_NAME[] =UNICODE_LITERAL_12(N,o,t,O,n,O,r,A,f,t,e,r);
1141 const XMLCh ConfirmationMethod::LOCAL_NAME[] =      UNICODE_LITERAL_18(C,o,n,f,i,r,m,a,t,i,o,n,M,e,t,h,o,d);
1142 const XMLCh DoNotCacheCondition::LOCAL_NAME[] =     UNICODE_LITERAL_19(D,o,N,o,t,C,a,c,h,e,C,o,n,d,i,t,i,o,n);
1143 const XMLCh DoNotCacheCondition::TYPE_NAME[] =      UNICODE_LITERAL_23(D,o,N,o,t,C,a,c,h,e,C,o,n,d,i,t,i,o,n,T,y,p,e);
1144 const XMLCh Evidence::LOCAL_NAME[] =                UNICODE_LITERAL_8(E,v,i,d,e,n,c,e);
1145 const XMLCh Evidence::TYPE_NAME[] =                 UNICODE_LITERAL_12(E,v,i,d,e,n,c,e,T,y,p,e);
1146 const XMLCh NameIdentifier::LOCAL_NAME[] =          UNICODE_LITERAL_14(N,a,m,e,I,d,e,n,t,i,f,i,e,r);
1147 const XMLCh NameIdentifier::TYPE_NAME[] =           UNICODE_LITERAL_18(N,a,m,e,I,d,e,n,t,i,f,i,e,r,T,y,p,e);
1148 const XMLCh NameIdentifier::NAMEQUALIFIER_ATTRIB_NAME[] =   UNICODE_LITERAL_13(N,a,m,e,Q,u,a,l,i,f,i,e,r);
1149 const XMLCh NameIdentifier::FORMAT_ATTRIB_NAME[] =  UNICODE_LITERAL_6(F,o,r,m,a,t);
1150 const XMLCh Statement::LOCAL_NAME[] =               UNICODE_LITERAL_9(S,t,a,t,e,m,e,n,t);
1151 const XMLCh Subject::LOCAL_NAME[] =                 UNICODE_LITERAL_7(S,u,b,j,e,c,t);
1152 const XMLCh Subject::TYPE_NAME[] =                  UNICODE_LITERAL_11(S,u,b,j,e,c,t,T,y,p,e);
1153 const XMLCh SubjectConfirmation::LOCAL_NAME[] =     UNICODE_LITERAL_19(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n);
1154 const XMLCh SubjectConfirmation::TYPE_NAME[] =      UNICODE_LITERAL_23(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n,T,y,p,e);
1155 const XMLCh SubjectConfirmationData::LOCAL_NAME[] = UNICODE_LITERAL_23(S,u,b,j,e,c,t,C,o,n,f,i,r,m,a,t,i,o,n,D,a,t,a);
1156 const XMLCh SubjectLocality::LOCAL_NAME[] =         UNICODE_LITERAL_15(S,u,b,j,e,c,t,L,o,c,a,l,i,t,y);
1157 const XMLCh SubjectLocality::TYPE_NAME[] =          UNICODE_LITERAL_19(S,u,b,j,e,c,t,L,o,c,a,l,i,t,y,T,y,p,e);
1158 const XMLCh SubjectLocality::IPADDRESS_ATTRIB_NAME[] =      UNICODE_LITERAL_9(I,P,A,d,d,r,e,s,s);
1159 const XMLCh SubjectLocality::DNSADDRESS_ATTRIB_NAME[] =     UNICODE_LITERAL_10(D,N,S,A,d,d,r,e,s,s);
1160
1161 #define XCH(ch) chLatin_##ch
1162 #define XNUM(d) chDigit_##d