2 * Copyright 2001-2007 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/Assertions.h"
26 #include "saml1/core/Protocols.h"
28 #include <xmltooling/AbstractComplexElement.h>
29 #include <xmltooling/AbstractSimpleElement.h>
30 #include <xmltooling/impl/AnyElement.h>
31 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
32 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
33 #include <xmltooling/util/XMLHelper.h>
36 #include <xercesc/util/XMLUniDefs.hpp>
38 using namespace opensaml::saml1p;
39 using namespace opensaml::saml1;
40 using namespace opensaml;
41 using namespace xmlsignature;
42 using namespace xmltooling;
44 using xmlconstants::XMLSIG_NS;
45 using xmlconstants::XML_ONE;
46 using samlconstants::SAML1P_NS;
47 using samlconstants::SAML1_NS;
48 using samlconstants::SAML1P_PREFIX;
50 #if defined (_MSC_VER)
51 #pragma warning( push )
52 #pragma warning( disable : 4250 4251 )
58 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact);
59 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
61 class SAML_DLLLOCAL RespondWithImpl : public virtual RespondWith,
62 public AbstractSimpleElement,
63 public AbstractDOMCachingXMLObject,
64 public AbstractXMLObjectMarshaller,
65 public AbstractXMLObjectUnmarshaller
69 virtual ~RespondWithImpl() {
73 RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
74 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
77 RespondWithImpl(const RespondWithImpl& src)
78 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(NULL) {
79 setQName(src.getQName());
82 QName* getQName() const {
86 void setQName(const QName* qname) {
87 m_qname=prepareForAssignment(m_qname,qname);
89 auto_ptr_XMLCh temp(m_qname->toString().c_str());
90 setTextContent(temp.get());
96 IMPL_XMLOBJECT_CLONE(RespondWith);
99 class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
100 public AbstractComplexElement,
101 public AbstractDOMCachingXMLObject,
102 public AbstractXMLObjectMarshaller,
103 public AbstractXMLObjectUnmarshaller
107 m_children.push_back(NULL);
108 m_pos_Subject=m_children.begin();
115 virtual ~SubjectQueryImpl() {}
117 SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
118 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
122 SubjectQueryImpl(const SubjectQueryImpl& src)
123 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
125 if (src.getSubject())
126 setSubject(src.getSubject()->cloneSubject());
129 IMPL_TYPED_CHILD(Subject);
132 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
133 PROC_TYPED_CHILD(Subject,SAML1_NS,true);
134 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
138 class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
141 m_AuthenticationMethod=NULL;
144 virtual ~AuthenticationQueryImpl() {
145 XMLString::release(&m_AuthenticationMethod);
148 AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
149 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
153 AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
155 setAuthenticationMethod(src.getAuthenticationMethod());
158 IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
159 SubjectQuery* cloneSubjectQuery() const {
160 return cloneAuthenticationQuery();
162 Query* cloneQuery() const {
163 return cloneAuthenticationQuery();
165 IMPL_STRING_ATTRIB(AuthenticationMethod);
168 void marshallAttributes(DOMElement* domElement) const {
169 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
170 SubjectQueryImpl::marshallAttributes(domElement);
173 void processAttribute(const DOMAttr* attribute) {
174 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
175 SubjectQueryImpl::processAttribute(attribute);
179 class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
185 virtual ~AttributeQueryImpl() {
186 XMLString::release(&m_Resource);
189 AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
190 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
194 AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
196 setResource(src.getResource());
197 VectorOf(AttributeDesignator) v=getAttributeDesignators();
198 for (vector<AttributeDesignator*>::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) {
200 v.push_back((*i)->cloneAttributeDesignator());
205 IMPL_XMLOBJECT_CLONE(AttributeQuery);
206 SubjectQuery* cloneSubjectQuery() const {
207 return cloneAttributeQuery();
209 Query* cloneQuery() const {
210 return cloneAttributeQuery();
212 IMPL_STRING_ATTRIB(Resource);
213 IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
216 void marshallAttributes(DOMElement* domElement) const {
217 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
218 SubjectQueryImpl::marshallAttributes(domElement);
221 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
222 PROC_TYPED_CHILDREN(AttributeDesignator,SAML1_NS,true);
223 SubjectQueryImpl::processChildElement(childXMLObject,root);
226 void processAttribute(const DOMAttr* attribute) {
227 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
228 SubjectQueryImpl::processAttribute(attribute);
232 class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
237 m_children.push_back(NULL);
238 m_pos_Evidence=m_pos_Subject;
242 virtual ~AuthorizationDecisionQueryImpl() {
243 XMLString::release(&m_Resource);
246 AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
247 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
251 AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
253 setResource(src.getResource());
254 if (src.getEvidence())
255 setEvidence(src.getEvidence()->cloneEvidence());
256 VectorOf(Action) v=getActions();
257 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
259 v.push_back((*i)->cloneAction());
264 IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
265 SubjectQuery* cloneSubjectQuery() const {
266 return cloneAuthorizationDecisionQuery();
268 Query* cloneQuery() const {
269 return cloneAuthorizationDecisionQuery();
271 IMPL_STRING_ATTRIB(Resource);
272 IMPL_TYPED_CHILD(Evidence);
273 IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
276 void marshallAttributes(DOMElement* domElement) const {
277 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
278 SubjectQueryImpl::marshallAttributes(domElement);
281 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
282 PROC_TYPED_CHILD(Evidence,SAML1_NS,false);
283 PROC_TYPED_CHILDREN(Action,SAML1_NS,false);
284 SubjectQueryImpl::processChildElement(childXMLObject,root);
287 void processAttribute(const DOMAttr* attribute) {
288 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
289 SubjectQueryImpl::processAttribute(attribute);
293 class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
294 public AbstractComplexElement,
295 public AbstractDOMCachingXMLObject,
296 public AbstractXMLObjectMarshaller,
297 public AbstractXMLObjectUnmarshaller
303 m_children.push_back(NULL);
305 m_pos_Signature=m_children.begin();
308 RequestAbstractTypeImpl() {
312 virtual ~RequestAbstractTypeImpl() {
313 XMLString::release(&m_MinorVersion);
314 XMLString::release(&m_RequestID);
315 delete m_IssueInstant;
318 RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
319 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
323 RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
324 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
326 setMinorVersion(src.m_MinorVersion);
327 setRequestID(src.getRequestID());
328 setIssueInstant(src.getIssueInstant());
329 if (src.getSignature())
330 setSignature(src.getSignature()->cloneSignature());
331 VectorOf(RespondWith) v=getRespondWiths();
332 for (vector<RespondWith*>::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) {
334 v.push_back((*i)->cloneRespondWith());
339 //IMPL_TYPED_CHILD(Signature);
340 // Need customized setter.
342 Signature* m_Signature;
343 list<XMLObject*>::iterator m_pos_Signature;
345 Signature* getSignature() const {
349 void setSignature(Signature* sig) {
350 prepareForAssignment(m_Signature,sig);
351 *m_pos_Signature=m_Signature=sig;
352 // Sync content reference back up.
354 m_Signature->setContentReference(new opensaml::ContentReference(*this));
357 IMPL_INTEGER_ATTRIB(MinorVersion);
358 IMPL_STRING_ATTRIB(RequestID); // have to special-case getXMLID
359 const XMLCh* getXMLID() const {
360 pair<bool,int> v = getMinorVersion();
361 return (!v.first || v.second > 0) ? m_RequestID : NULL;
363 const XMLCh* getID() const {
364 return getRequestID();
366 IMPL_DATETIME_ATTRIB(IssueInstant,0);
367 IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
370 void marshallAttributes(DOMElement* domElement) const {
371 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
372 domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE);
374 const_cast<RequestAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XML_ONE);
375 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
377 const_cast<RequestAbstractTypeImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
378 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
379 if (!m_IssueInstant) {
380 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
381 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
383 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
386 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
387 PROC_TYPED_CHILDREN(RespondWith,SAML1P_NS,false);
388 PROC_TYPED_CHILD(Signature,XMLSIG_NS,false);
389 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
392 void processAttribute(const DOMAttr* attribute) {
393 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
394 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
395 if (!XMLString::equals(attribute->getValue(),XML_ONE))
396 throw UnmarshallingException("Request has invalid major version.");
398 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
399 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
400 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
404 class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl
407 m_children.push_back(NULL);
409 m_pos_Query=m_pos_Signature;
413 virtual ~RequestImpl() {}
415 RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
416 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
420 RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
423 setQuery(src.getQuery()->cloneQuery());
424 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
425 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
427 v.push_back((*i)->cloneAssertionIDReference());
430 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
431 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
433 v2.push_back((*i)->cloneAssertionArtifact());
438 IMPL_XMLOBJECT_CLONE(Request);
439 RequestAbstractType* cloneRequestAbstractType() const {
440 return cloneRequest();
442 IMPL_TYPED_CHILD(Query);
444 SubjectQuery* getSubjectQuery() const {
445 return dynamic_cast<SubjectQuery*>(getQuery());
447 AuthenticationQuery* getAuthenticationQuery() const {
448 return dynamic_cast<AuthenticationQuery*>(getQuery());
450 AttributeQuery* getAttributeQuery() const {
451 return dynamic_cast<AttributeQuery*>(getQuery());
453 AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
454 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
457 void setSubjectQuery(SubjectQuery* q) {
460 void setAuthenticationQuery(AuthenticationQuery* q) {
463 void setAttributeQuery(AttributeQuery* q) {
466 void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
470 IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
471 IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
474 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
475 PROC_TYPED_CHILD(Query,SAML1P_NS,true);
476 PROC_TYPED_CHILDREN(AssertionIDReference,SAML1_NS,false);
477 PROC_TYPED_CHILDREN(AssertionArtifact,SAML1P_NS,false);
478 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
482 class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
483 public AbstractComplexElement,
484 public AbstractDOMCachingXMLObject,
485 public AbstractXMLObjectMarshaller,
486 public AbstractXMLObjectUnmarshaller
490 m_children.push_back(NULL);
492 m_pos_StatusCode=m_children.begin();
495 virtual ~StatusCodeImpl() {
499 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
500 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
504 StatusCodeImpl(const StatusCodeImpl& src)
505 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
507 setValue(src.getValue());
508 if (src.getStatusCode())
509 setStatusCode(src.getStatusCode()->cloneStatusCode());
512 IMPL_XMLOBJECT_CLONE(StatusCode);
513 IMPL_XMLOBJECT_ATTRIB(Value,QName);
514 IMPL_TYPED_CHILD(StatusCode);
517 void marshallAttributes(DOMElement* domElement) const {
518 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
521 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
522 PROC_TYPED_CHILD(StatusCode,SAML1P_NS,true);
523 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
526 void processAttribute(const DOMAttr* attribute) {
527 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
531 class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
532 public AbstractComplexElement,
533 public AbstractDOMCachingXMLObject,
534 public AbstractXMLObjectMarshaller,
535 public AbstractXMLObjectUnmarshaller
538 virtual ~StatusDetailImpl() {}
540 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
541 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
544 StatusDetailImpl(const StatusDetailImpl& src)
545 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
546 VectorOf(XMLObject) v=getUnknownXMLObjects();
547 for (vector<XMLObject*>::const_iterator i=src.m_UnknownXMLObjects.begin(); i!=src.m_UnknownXMLObjects.end(); ++i)
548 v.push_back((*i)->clone());
551 IMPL_XMLOBJECT_CLONE(StatusDetail);
552 IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
555 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
556 getUnknownXMLObjects().push_back(childXMLObject);
560 class SAML_DLLLOCAL StatusImpl : public virtual Status,
561 public AbstractComplexElement,
562 public AbstractDOMCachingXMLObject,
563 public AbstractXMLObjectMarshaller,
564 public AbstractXMLObjectUnmarshaller
567 m_children.push_back(NULL);
568 m_children.push_back(NULL);
569 m_children.push_back(NULL);
571 m_pos_StatusCode=m_children.begin();
572 m_StatusMessage=NULL;
573 m_pos_StatusMessage=m_pos_StatusCode;
574 ++m_pos_StatusMessage;
576 m_pos_StatusDetail=m_pos_StatusMessage;
577 ++m_pos_StatusDetail;
580 virtual ~StatusImpl() {}
582 StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
583 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
587 StatusImpl(const StatusImpl& src)
588 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
590 if (src.getStatusCode())
591 setStatusCode(src.getStatusCode()->cloneStatusCode());
592 if (src.getStatusMessage())
593 setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
594 if (src.getStatusDetail())
595 setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
598 IMPL_XMLOBJECT_CLONE(Status);
599 IMPL_TYPED_CHILD(StatusCode);
600 IMPL_TYPED_CHILD(StatusMessage);
601 IMPL_TYPED_CHILD(StatusDetail);
604 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
605 PROC_TYPED_CHILD(StatusCode,SAML1P_NS,false);
606 PROC_TYPED_CHILD(StatusMessage,SAML1P_NS,false);
607 PROC_TYPED_CHILD(StatusDetail,SAML1P_NS,false);
608 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
612 class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType,
613 public AbstractComplexElement,
614 public AbstractDOMCachingXMLObject,
615 public AbstractXMLObjectMarshaller,
616 public AbstractXMLObjectUnmarshaller
624 m_children.push_back(NULL);
626 m_pos_Signature=m_children.begin();
629 ResponseAbstractTypeImpl() {
633 virtual ~ResponseAbstractTypeImpl() {
634 XMLString::release(&m_MinorVersion);
635 XMLString::release(&m_ResponseID);
636 XMLString::release(&m_InResponseTo);
637 XMLString::release(&m_Recipient);
638 delete m_IssueInstant;
641 ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
642 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
646 ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src)
647 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
649 setMinorVersion(src.m_MinorVersion);
650 setResponseID(src.getResponseID());
651 setInResponseTo(src.getInResponseTo());
652 setIssueInstant(src.getIssueInstant());
653 setRecipient(src.getRecipient());
654 if (src.getSignature())
655 setSignature(src.getSignature()->cloneSignature());
658 //IMPL_TYPED_CHILD(Signature);
659 // Need customized setter.
661 Signature* m_Signature;
662 list<XMLObject*>::iterator m_pos_Signature;
664 Signature* getSignature() const {
668 void setSignature(Signature* sig) {
669 prepareForAssignment(m_Signature,sig);
670 *m_pos_Signature=m_Signature=sig;
671 // Sync content reference back up.
673 m_Signature->setContentReference(new opensaml::ContentReference(*this));
676 IMPL_INTEGER_ATTRIB(MinorVersion);
677 IMPL_STRING_ATTRIB(ResponseID); // have to special-case getXMLID
678 const XMLCh* getXMLID() const {
679 pair<bool,int> v = getMinorVersion();
680 return (!v.first || v.second > 0) ? m_ResponseID : NULL;
682 const XMLCh* getID() const {
683 return getResponseID();
685 IMPL_STRING_ATTRIB(InResponseTo);
686 IMPL_DATETIME_ATTRIB(IssueInstant,0);
687 IMPL_STRING_ATTRIB(Recipient);
690 void marshallAttributes(DOMElement* domElement) const {
691 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
692 domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE);
694 const_cast<ResponseAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XML_ONE);
695 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
697 const_cast<ResponseAbstractTypeImpl*>(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier();
698 MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
699 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
700 if (!m_IssueInstant) {
701 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
702 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
704 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
705 MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
708 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
709 PROC_TYPED_CHILD(Signature,XMLSIG_NS,false);
710 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
713 void processAttribute(const DOMAttr* attribute) {
714 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
715 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
716 if (!XMLString::equals(attribute->getValue(),XML_ONE))
717 throw UnmarshallingException("Response has invalid major version.");
719 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
720 PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
721 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
722 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
723 PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
727 class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl
730 m_children.push_back(NULL);
732 m_pos_Status=m_pos_Signature;
736 virtual ~ResponseImpl() {}
738 ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
739 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
743 ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) {
746 setStatus(src.getStatus()->cloneStatus());
747 VectorOf(Assertion) v=getAssertions();
748 for (vector<Assertion*>::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) {
750 v.push_back((*i)->cloneAssertion());
755 IMPL_XMLOBJECT_CLONE(Response);
756 ResponseAbstractType* cloneResponseAbstractType() const {
757 return cloneResponse();
759 IMPL_TYPED_CHILD(Status);
760 IMPL_TYPED_CHILDREN(Assertion, m_children.end());
763 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
764 PROC_TYPED_CHILD(Status,SAML1P_NS,false);
765 PROC_TYPED_CHILDREN(Assertion,SAML1_NS,true);
766 ResponseAbstractTypeImpl::processChildElement(childXMLObject,root);
773 #if defined (_MSC_VER)
774 #pragma warning( pop )
777 // Builder Implementations
779 IMPL_XMLOBJECTBUILDER(AssertionArtifact);
780 IMPL_XMLOBJECTBUILDER(AttributeQuery);
781 IMPL_XMLOBJECTBUILDER(AuthenticationQuery);
782 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery);
783 IMPL_XMLOBJECTBUILDER(Request);
784 IMPL_XMLOBJECTBUILDER(RespondWith);
785 IMPL_XMLOBJECTBUILDER(Response);
786 IMPL_XMLOBJECTBUILDER(Status);
787 IMPL_XMLOBJECTBUILDER(StatusCode);
788 IMPL_XMLOBJECTBUILDER(StatusDetail);
789 IMPL_XMLOBJECTBUILDER(StatusMessage);
792 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
793 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);
794 const XMLCh RequestAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
795 const XMLCh RequestAbstractType::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
796 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
797 const XMLCh ResponseAbstractType::LOCAL_NAME[] = {chNull};
798 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);
799 const XMLCh ResponseAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
800 const XMLCh ResponseAbstractType::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D);
801 const XMLCh ResponseAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
802 const XMLCh ResponseAbstractType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
803 const XMLCh ResponseAbstractType::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(SAML1P_NS,_SUCCESS,SAML1P_PREFIX);
839 QName StatusCode::REQUESTER(SAML1P_NS,_REQUESTER,SAML1P_PREFIX);
840 QName StatusCode::RESPONDER(SAML1P_NS,_RESPONDER,SAML1P_PREFIX);
841 QName StatusCode::VERSIONMISMATCH(SAML1P_NS,_VERSIONMISMATCH,SAML1P_PREFIX);