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::saml1p;
41 using namespace opensaml::saml1;
42 using namespace opensaml;
43 using namespace xmlsignature;
44 using namespace xmltooling;
47 #if defined (_MSC_VER)
48 #pragma warning( push )
49 #pragma warning( disable : 4250 4251 )
55 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact);
56 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
58 class SAML_DLLLOCAL RespondWithImpl : public virtual RespondWith,
59 protected AbstractSimpleElement,
60 public AbstractChildlessElement,
61 public AbstractDOMCachingXMLObject,
62 public AbstractValidatingXMLObject,
63 public AbstractXMLObjectMarshaller,
64 public AbstractXMLObjectUnmarshaller
68 virtual ~RespondWithImpl() {
72 RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
73 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
76 RespondWithImpl(const RespondWithImpl& src)
77 : AbstractXMLObject(src),
78 AbstractSimpleElement(src),
79 AbstractDOMCachingXMLObject(src),
80 AbstractValidatingXMLObject(src), m_qname(NULL) {
81 setQName(src.getQName());
84 QName* getQName() const {
88 void setQName(const QName* qname) {
89 m_qname=prepareForAssignment(m_qname,qname);
91 auto_ptr_XMLCh temp(m_qname->toString().c_str());
92 setTextContent(temp.get());
98 IMPL_XMLOBJECT_CLONE(RespondWith);
99 IMPL_XMLOBJECT_CONTENT;
102 class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
103 public AbstractComplexElement,
104 public AbstractDOMCachingXMLObject,
105 public AbstractValidatingXMLObject,
106 public AbstractXMLObjectMarshaller,
107 public AbstractXMLObjectUnmarshaller
111 m_children.push_back(NULL);
112 m_pos_Subject=m_children.begin();
119 virtual ~SubjectQueryImpl() {}
121 SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
122 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
126 SubjectQueryImpl(const SubjectQueryImpl& src)
127 : AbstractXMLObject(src),
128 AbstractDOMCachingXMLObject(src),
129 AbstractValidatingXMLObject(src) {
131 if (src.getSubject())
132 setSubject(src.getSubject()->cloneSubject());
135 IMPL_TYPED_CHILD(Subject);
138 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
139 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
140 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
144 class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
147 m_AuthenticationMethod=NULL;
150 virtual ~AuthenticationQueryImpl() {
151 XMLString::release(&m_AuthenticationMethod);
154 AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
155 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
159 AuthenticationQueryImpl(const AuthenticationQueryImpl& src)
160 : AbstractXMLObject(src), SubjectQueryImpl(src) {
162 setAuthenticationMethod(src.getAuthenticationMethod());
165 IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
166 SubjectQuery* cloneSubjectQuery() const {
167 return cloneAuthenticationQuery();
169 Query* cloneQuery() const {
170 return cloneAuthenticationQuery();
172 IMPL_STRING_ATTRIB(AuthenticationMethod);
175 void marshallAttributes(DOMElement* domElement) const {
176 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
177 SubjectQueryImpl::marshallAttributes(domElement);
180 void processAttribute(const DOMAttr* attribute) {
181 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
182 SubjectQueryImpl::processAttribute(attribute);
186 class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
192 virtual ~AttributeQueryImpl() {
193 XMLString::release(&m_Resource);
196 AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
197 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
201 AttributeQueryImpl(const AttributeQueryImpl& src)
202 : AbstractXMLObject(src), SubjectQueryImpl(src) {
204 setResource(src.getResource());
205 VectorOf(AttributeDesignator) v=getAttributeDesignators();
206 for (vector<AttributeDesignator*>::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) {
208 v.push_back((*i)->cloneAttributeDesignator());
213 IMPL_XMLOBJECT_CLONE(AttributeQuery);
214 SubjectQuery* cloneSubjectQuery() const {
215 return cloneAttributeQuery();
217 Query* cloneQuery() const {
218 return cloneAttributeQuery();
220 IMPL_STRING_ATTRIB(Resource);
221 IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
224 void marshallAttributes(DOMElement* domElement) const {
225 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
226 SubjectQueryImpl::marshallAttributes(domElement);
229 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
230 PROC_TYPED_CHILDREN(AttributeDesignator,SAMLConstants::SAML1_NS,true);
231 SubjectQueryImpl::processChildElement(childXMLObject,root);
234 void processAttribute(const DOMAttr* attribute) {
235 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
236 SubjectQueryImpl::processAttribute(attribute);
240 class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
245 m_children.push_back(NULL);
246 m_pos_Evidence=m_pos_Subject;
250 virtual ~AuthorizationDecisionQueryImpl() {
251 XMLString::release(&m_Resource);
254 AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
255 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
259 AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src)
260 : AbstractXMLObject(src), SubjectQueryImpl(src) {
262 setResource(src.getResource());
263 if (src.getEvidence())
264 setEvidence(src.getEvidence()->cloneEvidence());
265 VectorOf(Action) v=getActions();
266 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
268 v.push_back((*i)->cloneAction());
273 IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
274 SubjectQuery* cloneSubjectQuery() const {
275 return cloneAuthorizationDecisionQuery();
277 Query* cloneQuery() const {
278 return cloneAuthorizationDecisionQuery();
280 IMPL_STRING_ATTRIB(Resource);
281 IMPL_TYPED_CHILD(Evidence);
282 IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
285 void marshallAttributes(DOMElement* domElement) const {
286 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
287 SubjectQueryImpl::marshallAttributes(domElement);
290 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
291 PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false);
292 PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false);
293 SubjectQueryImpl::processChildElement(childXMLObject,root);
296 void processAttribute(const DOMAttr* attribute) {
297 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
298 SubjectQueryImpl::processAttribute(attribute);
302 class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
303 public AbstractComplexElement,
304 public AbstractDOMCachingXMLObject,
305 public AbstractValidatingXMLObject,
306 public AbstractXMLObjectMarshaller,
307 public AbstractXMLObjectUnmarshaller
313 m_children.push_back(NULL);
315 m_pos_Signature=m_children.begin();
318 RequestAbstractTypeImpl() {
322 virtual ~RequestAbstractTypeImpl() {
323 XMLString::release(&m_MinorVersion);
324 XMLString::release(&m_RequestID);
325 delete m_IssueInstant;
328 RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
329 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
333 RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
334 : AbstractXMLObject(src),
335 AbstractDOMCachingXMLObject(src),
336 AbstractValidatingXMLObject(src) {
338 setMinorVersion(src.m_MinorVersion);
339 setRequestID(src.getRequestID());
340 setIssueInstant(src.getIssueInstant());
341 if (src.getSignature())
342 setSignature(src.getSignature()->cloneSignature());
343 VectorOf(RespondWith) v=getRespondWiths();
344 for (vector<RespondWith*>::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) {
346 v.push_back((*i)->cloneRespondWith());
351 const XMLCh* getId() const {
352 return getRequestID();
355 //IMPL_TYPED_CHILD(Signature);
356 // Need customized setter.
358 Signature* m_Signature;
359 list<XMLObject*>::iterator m_pos_Signature;
361 Signature* getSignature() const {
365 void setSignature(Signature* sig) {
366 prepareForAssignment(m_Signature,sig);
367 *m_pos_Signature=m_Signature=sig;
368 // Sync content reference back up.
370 m_Signature->setContentReference(new opensaml::ContentReference(*this));
373 IMPL_INTEGER_ATTRIB(MinorVersion);
374 IMPL_STRING_ATTRIB(RequestID);
375 IMPL_DATETIME_ATTRIB(IssueInstant,0);
376 IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
379 void marshallAttributes(DOMElement* domElement) const {
380 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
381 domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE);
383 const_cast<RequestAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE);
384 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
386 const_cast<RequestAbstractTypeImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
387 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
388 if (!m_IssueInstant) {
389 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
390 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
392 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
395 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
396 PROC_TYPED_CHILDREN(RespondWith,SAMLConstants::SAML1P_NS,false);
397 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
398 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
401 void processAttribute(const DOMAttr* attribute) {
402 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
403 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
404 if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE))
405 throw UnmarshallingException("Request has invalid major version.");
407 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
408 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
409 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
413 class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl
416 m_children.push_back(NULL);
418 m_pos_Query=m_pos_Signature;
422 virtual ~RequestImpl() {}
424 RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
425 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
429 RequestImpl(const RequestImpl& src)
430 : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
433 setQuery(src.getQuery()->cloneQuery());
434 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
435 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
437 v.push_back((*i)->cloneAssertionIDReference());
440 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
441 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
443 v2.push_back((*i)->cloneAssertionArtifact());
448 IMPL_XMLOBJECT_CLONE(Request);
449 RequestAbstractType* cloneRequestAbstractType() const {
450 return cloneRequest();
452 IMPL_TYPED_CHILD(Query);
454 SubjectQuery* getSubjectQuery() const {
455 return dynamic_cast<SubjectQuery*>(getQuery());
457 AuthenticationQuery* getAuthenticationQuery() const {
458 return dynamic_cast<AuthenticationQuery*>(getQuery());
460 AttributeQuery* getAttributeQuery() const {
461 return dynamic_cast<AttributeQuery*>(getQuery());
463 AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
464 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
467 void setSubjectQuery(SubjectQuery* q) {
470 void setAuthenticationQuery(AuthenticationQuery* q) {
473 void setAttributeQuery(AttributeQuery* q) {
476 void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
480 IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
481 IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
484 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
485 PROC_TYPED_CHILD(Query,SAMLConstants::SAML1P_NS,true);
486 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
487 PROC_TYPED_CHILDREN(AssertionArtifact,SAMLConstants::SAML1P_NS,false);
488 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
492 class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
493 public AbstractComplexElement,
494 public AbstractDOMCachingXMLObject,
495 public AbstractValidatingXMLObject,
496 public AbstractXMLObjectMarshaller,
497 public AbstractXMLObjectUnmarshaller
501 m_children.push_back(NULL);
503 m_pos_StatusCode=m_children.begin();
506 virtual ~StatusCodeImpl() {
510 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
511 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
515 StatusCodeImpl(const StatusCodeImpl& src)
516 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
518 setValue(src.getValue());
519 if (src.getStatusCode())
520 setStatusCode(src.getStatusCode()->cloneStatusCode());
523 IMPL_XMLOBJECT_CLONE(StatusCode);
524 IMPL_XMLOBJECT_ATTRIB(Value,QName);
525 IMPL_TYPED_CHILD(StatusCode);
528 void marshallAttributes(DOMElement* domElement) const {
529 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
532 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
533 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,true);
534 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
537 void processAttribute(const DOMAttr* attribute) {
538 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
542 class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
543 public AbstractComplexElement,
544 public AbstractDOMCachingXMLObject,
545 public AbstractValidatingXMLObject,
546 public AbstractXMLObjectMarshaller,
547 public AbstractXMLObjectUnmarshaller
550 virtual ~StatusDetailImpl() {}
552 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
553 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
556 StatusDetailImpl(const StatusDetailImpl& src)
557 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
558 VectorOf(XMLObject) v=getDetails();
559 for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
561 v.push_back((*i)->clone());
566 IMPL_XMLOBJECT_CLONE(StatusDetail);
567 IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
570 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
571 getDetails().push_back(childXMLObject);
575 class SAML_DLLLOCAL StatusImpl : public virtual Status,
576 public AbstractComplexElement,
577 public AbstractDOMCachingXMLObject,
578 public AbstractValidatingXMLObject,
579 public AbstractXMLObjectMarshaller,
580 public AbstractXMLObjectUnmarshaller
583 m_children.push_back(NULL);
584 m_children.push_back(NULL);
585 m_children.push_back(NULL);
587 m_pos_StatusCode=m_children.begin();
588 m_StatusMessage=NULL;
589 m_pos_StatusMessage=m_pos_StatusCode;
590 ++m_pos_StatusMessage;
592 m_pos_StatusDetail=m_pos_StatusMessage;
593 ++m_pos_StatusDetail;
596 virtual ~StatusImpl() {}
598 StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
599 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
603 StatusImpl(const StatusImpl& src)
604 : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), AbstractValidatingXMLObject(src) {
606 if (src.getStatusCode())
607 setStatusCode(src.getStatusCode()->cloneStatusCode());
608 if (src.getStatusMessage())
609 setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
610 if (src.getStatusDetail())
611 setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
614 IMPL_XMLOBJECT_CLONE(Status);
615 IMPL_TYPED_CHILD(StatusCode);
616 IMPL_TYPED_CHILD(StatusMessage);
617 IMPL_TYPED_CHILD(StatusDetail);
620 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
621 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,false);
622 PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML1P_NS,false);
623 PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML1P_NS,false);
624 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
628 class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType,
629 public AbstractComplexElement,
630 public AbstractDOMCachingXMLObject,
631 public AbstractValidatingXMLObject,
632 public AbstractXMLObjectMarshaller,
633 public AbstractXMLObjectUnmarshaller
641 m_children.push_back(NULL);
643 m_pos_Signature=m_children.begin();
646 ResponseAbstractTypeImpl() {
650 virtual ~ResponseAbstractTypeImpl() {
651 XMLString::release(&m_MinorVersion);
652 XMLString::release(&m_ResponseID);
653 XMLString::release(&m_InResponseTo);
654 XMLString::release(&m_Recipient);
655 delete m_IssueInstant;
658 ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
659 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
663 ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src)
664 : AbstractXMLObject(src),
665 AbstractDOMCachingXMLObject(src),
666 AbstractValidatingXMLObject(src) {
668 setMinorVersion(src.m_MinorVersion);
669 setResponseID(src.getResponseID());
670 setInResponseTo(src.getInResponseTo());
671 setIssueInstant(src.getIssueInstant());
672 setRecipient(src.getRecipient());
673 if (src.getSignature())
674 setSignature(src.getSignature()->cloneSignature());
677 const XMLCh* getId() const {
678 return getResponseID();
681 //IMPL_TYPED_CHILD(Signature);
682 // Need customized setter.
684 Signature* m_Signature;
685 list<XMLObject*>::iterator m_pos_Signature;
687 Signature* getSignature() const {
691 void setSignature(Signature* sig) {
692 prepareForAssignment(m_Signature,sig);
693 *m_pos_Signature=m_Signature=sig;
694 // Sync content reference back up.
696 m_Signature->setContentReference(new opensaml::ContentReference(*this));
699 IMPL_INTEGER_ATTRIB(MinorVersion);
700 IMPL_STRING_ATTRIB(ResponseID);
701 IMPL_STRING_ATTRIB(InResponseTo);
702 IMPL_DATETIME_ATTRIB(IssueInstant,0);
703 IMPL_STRING_ATTRIB(Recipient);
706 void marshallAttributes(DOMElement* domElement) const {
707 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
708 domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE);
710 const_cast<ResponseAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE);
711 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
713 const_cast<ResponseAbstractTypeImpl*>(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier();
714 MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
715 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
716 if (!m_IssueInstant) {
717 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
718 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
720 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
721 MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
724 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
725 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
726 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
729 void processAttribute(const DOMAttr* attribute) {
730 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
731 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
732 if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE))
733 throw UnmarshallingException("Response has invalid major version.");
735 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
736 PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
737 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
738 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
739 PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
743 class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl
746 m_children.push_back(NULL);
748 m_pos_Status=m_pos_Signature;
752 virtual ~ResponseImpl() {}
754 ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
755 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
759 ResponseImpl(const ResponseImpl& src)
760 : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) {
763 setStatus(src.getStatus()->cloneStatus());
764 VectorOf(Assertion) v=getAssertions();
765 for (vector<Assertion*>::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) {
767 v.push_back((*i)->cloneAssertion());
772 IMPL_XMLOBJECT_CLONE(Response);
773 ResponseAbstractType* cloneResponseAbstractType() const {
774 return cloneResponse();
776 IMPL_TYPED_CHILD(Status);
777 IMPL_TYPED_CHILDREN(Assertion, m_children.end());
780 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
781 PROC_TYPED_CHILD(Status,SAMLConstants::SAML1P_NS,false);
782 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
783 ResponseAbstractTypeImpl::processChildElement(childXMLObject,root);
790 #if defined (_MSC_VER)
791 #pragma warning( pop )
794 // Builder Implementations
796 IMPL_XMLOBJECTBUILDER(AssertionArtifact);
797 IMPL_XMLOBJECTBUILDER(AttributeQuery);
798 IMPL_XMLOBJECTBUILDER(AuthenticationQuery);
799 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery);
800 IMPL_XMLOBJECTBUILDER(Request);
801 IMPL_XMLOBJECTBUILDER(RespondWith);
802 IMPL_XMLOBJECTBUILDER(Response);
803 IMPL_XMLOBJECTBUILDER(Status);
804 IMPL_XMLOBJECTBUILDER(StatusCode);
805 IMPL_XMLOBJECTBUILDER(StatusDetail);
806 IMPL_XMLOBJECTBUILDER(StatusMessage);
809 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
810 const XMLCh RequestAbstractType::TYPE_NAME[] = UNICODE_LITERAL_19(R,e,q,u,e,s,t,A,b,s,t,r,a,c,t,T,y,p,e);
811 const XMLCh RequestAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
812 const XMLCh RequestAbstractType::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
813 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
814 const XMLCh ResponseAbstractType::LOCAL_NAME[] = {chNull};
815 const XMLCh ResponseAbstractType::TYPE_NAME[] = UNICODE_LITERAL_20(R,e,s,p,o,n,s,e,A,b,s,t,r,a,c,t,T,y,p,e);
816 const XMLCh ResponseAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
817 const XMLCh ResponseAbstractType::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D);
818 const XMLCh ResponseAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
819 const XMLCh ResponseAbstractType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
820 const XMLCh ResponseAbstractType::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t);
821 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);
822 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
823 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);
824 const XMLCh AttributeQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
825 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);
826 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);
827 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);
828 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);
829 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);
830 const XMLCh AuthorizationDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
831 const XMLCh Query::LOCAL_NAME[] = UNICODE_LITERAL_5(Q,u,e,r,y);
832 const XMLCh Request::LOCAL_NAME[] = UNICODE_LITERAL_7(R,e,q,u,e,s,t);
833 const XMLCh Request::TYPE_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,T,y,p,e);
834 const XMLCh RespondWith::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,s,p,o,n,d,W,i,t,h);
835 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
836 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
837 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
838 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
839 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
840 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
841 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
842 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
843 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
844 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
845 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
847 #define XCH(ch) chLatin_##ch
848 #define XNUM(d) chDigit_##d
850 const XMLCh _SUCCESS[] = UNICODE_LITERAL_7(S,u,c,c,e,s,s);
851 const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r);
852 const XMLCh _RESPONDER[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r);
853 const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
855 QName StatusCode::SUCCESS(SAMLConstants::SAML1P_NS,_SUCCESS,SAMLConstants::SAML1P_PREFIX);
856 QName StatusCode::REQUESTER(SAMLConstants::SAML1P_NS,_REQUESTER,SAMLConstants::SAML1P_PREFIX);
857 QName StatusCode::RESPONDER(SAMLConstants::SAML1P_NS,_RESPONDER,SAMLConstants::SAML1P_PREFIX);
858 QName StatusCode::VERSIONMISMATCH(SAMLConstants::SAML1P_NS,_VERSIONMISMATCH,SAMLConstants::SAML1P_PREFIX);