2 * Copyright 2001-2006 Internet2
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * Implementation classes for SAML 1.x Protocols schema
24 #include "exceptions.h"
25 #include "saml1/core/Protocols.h"
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>
38 #include <xercesc/util/XMLUniDefs.hpp>
40 using namespace opensaml::saml1;
41 using namespace opensaml;
42 using namespace xmlsignature;
43 using namespace xmltooling;
46 #if defined (_MSC_VER)
47 #pragma warning( push )
48 #pragma warning( disable : 4250 4251 )
54 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact);
55 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
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
67 virtual ~RespondWithImpl() {
71 RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
72 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
75 RespondWithImpl(const RespondWithImpl& src)
76 : AbstractXMLObject(src),
77 AbstractSimpleElement(src),
78 AbstractDOMCachingXMLObject(src),
79 AbstractValidatingXMLObject(src), m_qname(NULL) {
80 setQName(src.getQName());
83 QName* getQName() const {
87 void setQName(const QName* qname) {
88 m_qname=prepareForAssignment(m_qname,qname);
90 auto_ptr_XMLCh temp(m_qname->toString().c_str());
91 setTextContent(temp.get());
97 IMPL_XMLOBJECT_CLONE(RespondWith);
98 IMPL_XMLOBJECT_CONTENT();
101 class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
102 public AbstractComplexElement,
103 public AbstractDOMCachingXMLObject,
104 public AbstractValidatingXMLObject,
105 public AbstractXMLObjectMarshaller,
106 public AbstractXMLObjectUnmarshaller
110 m_children.push_back(NULL);
111 m_pos_Subject=m_children.begin();
118 virtual ~SubjectQueryImpl() {}
120 SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
121 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
125 SubjectQueryImpl(const SubjectQueryImpl& src)
126 : AbstractXMLObject(src),
127 AbstractDOMCachingXMLObject(src),
128 AbstractValidatingXMLObject(src) {
130 if (src.getSubject())
131 setSubject(src.getSubject()->cloneSubject());
134 IMPL_TYPED_CHILD(Subject);
137 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
138 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
139 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
143 class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
146 m_AuthenticationMethod=NULL;
149 virtual ~AuthenticationQueryImpl() {
150 XMLString::release(&m_AuthenticationMethod);
153 AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
154 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
158 AuthenticationQueryImpl(const AuthenticationQueryImpl& src)
159 : AbstractXMLObject(src), SubjectQueryImpl(src) {
161 setAuthenticationMethod(src.getAuthenticationMethod());
164 IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
165 SubjectQuery* cloneSubjectQuery() const {
166 return cloneAuthenticationQuery();
168 Query* cloneQuery() const {
169 return cloneAuthenticationQuery();
171 IMPL_STRING_ATTRIB(AuthenticationMethod);
174 void marshallAttributes(DOMElement* domElement) const {
175 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
176 SubjectQueryImpl::marshallAttributes(domElement);
179 void processAttribute(const DOMAttr* attribute) {
180 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
181 SubjectQueryImpl::processAttribute(attribute);
185 class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
191 virtual ~AttributeQueryImpl() {
192 XMLString::release(&m_Resource);
195 AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
196 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
200 AttributeQueryImpl(const AttributeQueryImpl& src)
201 : AbstractXMLObject(src), SubjectQueryImpl(src) {
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++) {
207 v.push_back((*i)->cloneAttributeDesignator());
212 IMPL_XMLOBJECT_CLONE(AttributeQuery);
213 SubjectQuery* cloneSubjectQuery() const {
214 return cloneAttributeQuery();
216 Query* cloneQuery() const {
217 return cloneAttributeQuery();
219 IMPL_STRING_ATTRIB(Resource);
220 IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
223 void marshallAttributes(DOMElement* domElement) const {
224 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
225 SubjectQueryImpl::marshallAttributes(domElement);
228 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
229 PROC_TYPED_CHILDREN(AttributeDesignator,SAMLConstants::SAML1_NS,true);
230 SubjectQueryImpl::processChildElement(childXMLObject,root);
233 void processAttribute(const DOMAttr* attribute) {
234 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
235 SubjectQueryImpl::processAttribute(attribute);
239 class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
244 m_children.push_back(NULL);
245 m_pos_Evidence=m_pos_Subject;
249 virtual ~AuthorizationDecisionQueryImpl() {
250 XMLString::release(&m_Resource);
253 AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
254 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
258 AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src)
259 : AbstractXMLObject(src), SubjectQueryImpl(src) {
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++) {
267 v.push_back((*i)->cloneAction());
272 IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
273 SubjectQuery* cloneSubjectQuery() const {
274 return cloneAuthorizationDecisionQuery();
276 Query* cloneQuery() const {
277 return cloneAuthorizationDecisionQuery();
279 IMPL_STRING_ATTRIB(Resource);
280 IMPL_TYPED_CHILD(Evidence);
281 IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
284 void marshallAttributes(DOMElement* domElement) const {
285 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
286 SubjectQueryImpl::marshallAttributes(domElement);
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);
295 void processAttribute(const DOMAttr* attribute) {
296 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
297 SubjectQueryImpl::processAttribute(attribute);
301 class SAML_DLLLOCAL AbstractRequestImpl : public virtual AbstractRequest,
302 public AbstractComplexElement,
303 public AbstractDOMCachingXMLObject,
304 public AbstractValidatingXMLObject,
305 public AbstractXMLObjectMarshaller,
306 public AbstractXMLObjectUnmarshaller
312 m_children.push_back(NULL);
314 m_pos_Signature=m_children.begin();
317 AbstractRequestImpl() {}
319 virtual ~AbstractRequestImpl() {
320 XMLString::release(&m_RequestID);
321 delete m_IssueInstant;
324 AbstractRequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
325 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
329 AbstractRequestImpl(const AbstractRequestImpl& src)
330 : AbstractXMLObject(src),
331 AbstractDOMCachingXMLObject(src),
332 AbstractValidatingXMLObject(src) {
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++) {
342 v.push_back((*i)->cloneRespondWith());
347 const XMLCh* getId() const {
348 return getRequestID();
351 //IMPL_TYPED_CHILD(Signature);
352 // Need customized setter.
354 Signature* m_Signature;
355 list<XMLObject*>::iterator m_pos_Signature;
357 Signature* getSignature() const {
361 void setSignature(Signature* sig) {
362 prepareForAssignment(m_Signature,sig);
363 *m_pos_Signature=m_Signature=sig;
364 // Sync content reference back up.
366 m_Signature->setContentReference(new opensaml::ContentReference(*this));
369 IMPL_INTEGER_ATTRIB(MinorVersion);
370 IMPL_STRING_ATTRIB(RequestID);
371 IMPL_DATETIME_ATTRIB(IssueInstant);
372 IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
375 void marshallAttributes(DOMElement* domElement) const {
376 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
377 static const XMLCh ONE[] = { chDigit_1, chNull };
378 domElement->setAttributeNS(NULL,MAJORVERSION,ONE);
379 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
381 const_cast<AbstractRequestImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
382 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
384 const_cast<AbstractRequestImpl*>(this)->m_IssueInstant=new DateTime(time(NULL));
385 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
388 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
389 PROC_TYPED_CHILDREN(RespondWith,SAMLConstants::SAML1P_NS,false);
390 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
391 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
394 void processAttribute(const DOMAttr* attribute) {
395 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
396 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
397 if (XMLString::parseInt(attribute->getValue()) != 1)
398 throw UnmarshallingException("Request has invalid major version.");
400 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
401 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
402 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
406 class SAML_DLLLOCAL RequestImpl : public virtual Request, public AbstractRequestImpl
409 m_children.push_back(NULL);
411 m_pos_Query=m_pos_Signature;
415 virtual ~RequestImpl() {}
417 RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
418 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
422 RequestImpl(const RequestImpl& src)
423 : AbstractXMLObject(src), AbstractRequestImpl(src) {
426 setQuery(src.getQuery()->cloneQuery());
427 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
428 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
430 v.push_back((*i)->cloneAssertionIDReference());
433 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
434 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
436 v2.push_back((*i)->cloneAssertionArtifact());
441 IMPL_XMLOBJECT_CLONE(Request);
442 AbstractRequest* cloneAbstractRequest() const {
443 return cloneRequest();
445 IMPL_TYPED_CHILD(Query);
447 SubjectQuery* getSubjectQuery() const {
448 return dynamic_cast<SubjectQuery*>(getQuery());
450 AuthenticationQuery* getAuthenticationQuery() const {
451 return dynamic_cast<AuthenticationQuery*>(getQuery());
453 AttributeQuery* getAttributeQuery() const {
454 return dynamic_cast<AttributeQuery*>(getQuery());
456 AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
457 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
460 void setSubjectQuery(SubjectQuery* q) {
463 void setAuthenticationQuery(AuthenticationQuery* q) {
466 void setAttributeQuery(AttributeQuery* q) {
469 void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
473 IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
474 IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
477 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
478 PROC_TYPED_CHILD(Query,SAMLConstants::SAML1P_NS,true);
479 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
480 PROC_TYPED_CHILDREN(AssertionArtifact,SAMLConstants::SAML1P_NS,false);
481 AbstractRequestImpl::processChildElement(childXMLObject,root);
485 class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
486 public AbstractComplexElement,
487 public AbstractDOMCachingXMLObject,
488 public AbstractValidatingXMLObject,
489 public AbstractXMLObjectMarshaller,
490 public AbstractXMLObjectUnmarshaller
494 m_children.push_back(NULL);
496 m_pos_StatusCode=m_children.begin();
499 virtual ~StatusCodeImpl() {
503 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
504 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
508 StatusCodeImpl(const StatusCodeImpl& src)
509 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
511 setValue(src.getValue());
512 if (src.getStatusCode())
513 setStatusCode(src.getStatusCode()->cloneStatusCode());
516 IMPL_XMLOBJECT_CLONE(StatusCode);
517 IMPL_XMLOBJECT_ATTRIB(Value,QName);
518 IMPL_TYPED_CHILD(StatusCode);
521 void marshallAttributes(DOMElement* domElement) const {
522 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
525 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
526 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,true);
527 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
530 void processAttribute(const DOMAttr* attribute) {
531 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
535 class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
536 public AbstractComplexElement,
537 public AbstractDOMCachingXMLObject,
538 public AbstractValidatingXMLObject,
539 public AbstractXMLObjectMarshaller,
540 public AbstractXMLObjectUnmarshaller
543 virtual ~StatusDetailImpl() {}
545 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
546 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
549 StatusDetailImpl(const StatusDetailImpl& src)
550 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
551 VectorOf(XMLObject) v=getDetails();
552 for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
554 v.push_back((*i)->clone());
559 IMPL_XMLOBJECT_CLONE(StatusDetail);
560 IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
563 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
564 getDetails().push_back(childXMLObject);
568 class SAML_DLLLOCAL StatusImpl : public virtual Status,
569 public AbstractComplexElement,
570 public AbstractDOMCachingXMLObject,
571 public AbstractValidatingXMLObject,
572 public AbstractXMLObjectMarshaller,
573 public AbstractXMLObjectUnmarshaller
576 m_children.push_back(NULL);
577 m_children.push_back(NULL);
578 m_children.push_back(NULL);
580 m_pos_StatusCode=m_children.begin();
581 m_StatusMessage=NULL;
582 m_pos_StatusMessage=m_pos_StatusCode;
583 m_pos_StatusMessage++;
585 m_pos_StatusDetail=m_pos_StatusMessage;
586 m_pos_StatusDetail++;
589 virtual ~StatusImpl() {}
591 StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
592 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
596 StatusImpl(const StatusImpl& src)
597 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
599 if (src.getStatusCode())
600 setStatusCode(src.getStatusCode()->cloneStatusCode());
601 if (src.getStatusMessage())
602 setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
603 if (src.getStatusDetail())
604 setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
607 IMPL_XMLOBJECT_CLONE(Status);
608 IMPL_TYPED_CHILD(StatusCode);
609 IMPL_TYPED_CHILD(StatusMessage);
610 IMPL_TYPED_CHILD(StatusDetail);
613 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
614 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,false);
615 PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML1P_NS,false);
616 PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML1P_NS,false);
617 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
621 class SAML_DLLLOCAL AbstractResponseImpl : public virtual AbstractResponse,
622 public AbstractComplexElement,
623 public AbstractDOMCachingXMLObject,
624 public AbstractValidatingXMLObject,
625 public AbstractXMLObjectMarshaller,
626 public AbstractXMLObjectUnmarshaller
634 m_children.push_back(NULL);
636 m_pos_Signature=m_children.begin();
639 AbstractResponseImpl() {}
641 virtual ~AbstractResponseImpl() {
642 XMLString::release(&m_ResponseID);
643 XMLString::release(&m_InResponseTo);
644 XMLString::release(&m_Recipient);
645 delete m_IssueInstant;
648 AbstractResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
649 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
653 AbstractResponseImpl(const AbstractResponseImpl& src)
654 : AbstractXMLObject(src),
655 AbstractDOMCachingXMLObject(src),
656 AbstractValidatingXMLObject(src) {
658 setMinorVersion(src.getMinorVersion());
659 setResponseID(src.getResponseID());
660 setInResponseTo(src.getInResponseTo());
661 setIssueInstant(src.getIssueInstant());
662 setRecipient(src.getRecipient());
663 if (src.getSignature())
664 setSignature(src.getSignature()->cloneSignature());
667 const XMLCh* getId() const {
668 return getResponseID();
671 //IMPL_TYPED_CHILD(Signature);
672 // Need customized setter.
674 Signature* m_Signature;
675 list<XMLObject*>::iterator m_pos_Signature;
677 Signature* getSignature() const {
681 void setSignature(Signature* sig) {
682 prepareForAssignment(m_Signature,sig);
683 *m_pos_Signature=m_Signature=sig;
684 // Sync content reference back up.
686 m_Signature->setContentReference(new opensaml::ContentReference(*this));
689 IMPL_INTEGER_ATTRIB(MinorVersion);
690 IMPL_STRING_ATTRIB(ResponseID);
691 IMPL_STRING_ATTRIB(InResponseTo);
692 IMPL_DATETIME_ATTRIB(IssueInstant);
693 IMPL_STRING_ATTRIB(Recipient);
696 void marshallAttributes(DOMElement* domElement) const {
697 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
698 static const XMLCh ONE[] = { chDigit_1, chNull };
699 domElement->setAttributeNS(NULL,MAJORVERSION,ONE);
700 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
702 const_cast<AbstractResponseImpl*>(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier();
703 MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
704 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
706 const_cast<AbstractResponseImpl*>(this)->m_IssueInstant=new DateTime(time(NULL));
707 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
708 MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
711 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
712 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
713 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
716 void processAttribute(const DOMAttr* attribute) {
717 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
718 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
719 if (XMLString::parseInt(attribute->getValue()) != 1)
720 throw UnmarshallingException("Response has invalid major version.");
722 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
723 PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
724 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
725 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
726 PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
730 class SAML_DLLLOCAL ResponseImpl : public virtual Response, public AbstractResponseImpl
733 m_children.push_back(NULL);
735 m_pos_Status=m_pos_Signature;
739 virtual ~ResponseImpl() {}
741 ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
742 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
746 ResponseImpl(const ResponseImpl& src)
747 : AbstractXMLObject(src), AbstractResponseImpl(src) {
750 setStatus(src.getStatus()->cloneStatus());
751 VectorOf(Assertion) v=getAssertions();
752 for (vector<Assertion*>::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) {
754 v.push_back((*i)->cloneAssertion());
759 IMPL_XMLOBJECT_CLONE(Response);
760 AbstractResponse* cloneAbstractResponse() const {
761 return cloneResponse();
763 IMPL_TYPED_CHILD(Status);
764 IMPL_TYPED_CHILDREN(Assertion, m_children.end());
767 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
768 PROC_TYPED_CHILD(Status,SAMLConstants::SAML1P_NS,false);
769 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
770 AbstractResponseImpl::processChildElement(childXMLObject,root);
777 #if defined (_MSC_VER)
778 #pragma warning( pop )
781 // Builder Implementations
783 IMPL_XMLOBJECTBUILDER(AssertionArtifact);
784 IMPL_XMLOBJECTBUILDER(AttributeQuery);
785 IMPL_XMLOBJECTBUILDER(AuthenticationQuery);
786 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery);
787 IMPL_XMLOBJECTBUILDER(Request);
788 IMPL_XMLOBJECTBUILDER(RespondWith);
789 IMPL_XMLOBJECTBUILDER(Response);
790 IMPL_XMLOBJECTBUILDER(Status);
791 IMPL_XMLOBJECTBUILDER(StatusCode);
792 IMPL_XMLOBJECTBUILDER(StatusDetail);
793 IMPL_XMLOBJECTBUILDER(StatusMessage);
796 const XMLCh AbstractRequest::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
797 const XMLCh AbstractRequest::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
798 const XMLCh AbstractRequest::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
799 const XMLCh AbstractResponse::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
800 const XMLCh AbstractResponse::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D);
801 const XMLCh AbstractResponse::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
802 const XMLCh AbstractResponse::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
803 const XMLCh AbstractResponse::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t);
804 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);
805 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
806 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);
807 const XMLCh AttributeQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
808 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);
809 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);
810 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);
811 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);
812 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);
813 const XMLCh AuthorizationDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
814 const XMLCh Query::LOCAL_NAME[] = UNICODE_LITERAL_5(Q,u,e,r,y);
815 const XMLCh Request::LOCAL_NAME[] = UNICODE_LITERAL_7(R,e,q,u,e,s,t);
816 const XMLCh Request::TYPE_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,T,y,p,e);
817 const XMLCh RespondWith::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,s,p,o,n,d,W,i,t,h);
818 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
819 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
820 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
821 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
822 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
823 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
824 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
825 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
826 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
827 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
828 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
830 #define XCH(ch) chLatin_##ch
831 #define XNUM(d) chDigit_##d
833 const XMLCh _SUCCESS[] = UNICODE_LITERAL_7(S,u,c,c,e,s,s);
834 const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r);
835 const XMLCh _RESPONDER[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r);
836 const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
838 QName StatusCode::SUCCESS(SAMLConstants::SAML1P_NS,_SUCCESS,SAMLConstants::SAML1P_PREFIX);
839 QName StatusCode::REQUESTER(SAMLConstants::SAML1P_NS,_REQUESTER,SAMLConstants::SAML1P_PREFIX);
840 QName StatusCode::RESPONDER(SAMLConstants::SAML1P_NS,_RESPONDER,SAMLConstants::SAML1P_PREFIX);
841 QName StatusCode::VERSIONMISMATCH(SAMLConstants::SAML1P_NS,_VERSIONMISMATCH,SAMLConstants::SAML1P_PREFIX);