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/Assertions.h"
26 #include "saml1/core/Protocols.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>
37 #include <xercesc/util/XMLUniDefs.hpp>
39 using namespace opensaml::saml1p;
40 using namespace opensaml::saml1;
41 using namespace opensaml;
42 using namespace xmlsignature;
43 using namespace xmltooling;
45 using xmlconstants::XMLSIG_NS;
46 using xmlconstants::XML_ONE;
47 using samlconstants::SAML1P_NS;
48 using samlconstants::SAML1_NS;
49 using samlconstants::SAML1P_PREFIX;
51 #if defined (_MSC_VER)
52 #pragma warning( push )
53 #pragma warning( disable : 4250 4251 )
59 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,AssertionArtifact);
60 DECL_XMLOBJECTIMPL_SIMPLE(SAML_DLLLOCAL,StatusMessage);
62 class SAML_DLLLOCAL RespondWithImpl : public virtual RespondWith,
63 public AbstractSimpleElement,
64 public AbstractDOMCachingXMLObject,
65 public AbstractXMLObjectMarshaller,
66 public AbstractXMLObjectUnmarshaller
70 virtual ~RespondWithImpl() {
74 RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
75 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
78 RespondWithImpl(const RespondWithImpl& src)
79 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(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);
100 class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
101 public AbstractComplexElement,
102 public AbstractDOMCachingXMLObject,
103 public AbstractXMLObjectMarshaller,
104 public AbstractXMLObjectUnmarshaller
108 m_children.push_back(NULL);
109 m_pos_Subject=m_children.begin();
116 virtual ~SubjectQueryImpl() {}
118 SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
119 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
123 SubjectQueryImpl(const SubjectQueryImpl& src)
124 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
126 if (src.getSubject())
127 setSubject(src.getSubject()->cloneSubject());
130 IMPL_TYPED_CHILD(Subject);
133 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
134 PROC_TYPED_CHILD(Subject,SAML1_NS,true);
135 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
139 class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
142 m_AuthenticationMethod=NULL;
145 virtual ~AuthenticationQueryImpl() {
146 XMLString::release(&m_AuthenticationMethod);
149 AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
150 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
154 AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
156 setAuthenticationMethod(src.getAuthenticationMethod());
159 IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
160 SubjectQuery* cloneSubjectQuery() const {
161 return cloneAuthenticationQuery();
163 Query* cloneQuery() const {
164 return cloneAuthenticationQuery();
166 IMPL_STRING_ATTRIB(AuthenticationMethod);
169 void marshallAttributes(DOMElement* domElement) const {
170 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
171 SubjectQueryImpl::marshallAttributes(domElement);
174 void processAttribute(const DOMAttr* attribute) {
175 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
176 SubjectQueryImpl::processAttribute(attribute);
180 class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
186 virtual ~AttributeQueryImpl() {
187 XMLString::release(&m_Resource);
190 AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
191 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
195 AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
197 setResource(src.getResource());
198 VectorOf(AttributeDesignator) v=getAttributeDesignators();
199 for (vector<AttributeDesignator*>::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) {
201 v.push_back((*i)->cloneAttributeDesignator());
206 IMPL_XMLOBJECT_CLONE(AttributeQuery);
207 SubjectQuery* cloneSubjectQuery() const {
208 return cloneAttributeQuery();
210 Query* cloneQuery() const {
211 return cloneAttributeQuery();
213 IMPL_STRING_ATTRIB(Resource);
214 IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
217 void marshallAttributes(DOMElement* domElement) const {
218 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
219 SubjectQueryImpl::marshallAttributes(domElement);
222 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
223 PROC_TYPED_CHILDREN(AttributeDesignator,SAML1_NS,true);
224 SubjectQueryImpl::processChildElement(childXMLObject,root);
227 void processAttribute(const DOMAttr* attribute) {
228 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
229 SubjectQueryImpl::processAttribute(attribute);
233 class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
238 m_children.push_back(NULL);
239 m_pos_Evidence=m_pos_Subject;
243 virtual ~AuthorizationDecisionQueryImpl() {
244 XMLString::release(&m_Resource);
247 AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
248 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
252 AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
254 setResource(src.getResource());
255 if (src.getEvidence())
256 setEvidence(src.getEvidence()->cloneEvidence());
257 VectorOf(Action) v=getActions();
258 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
260 v.push_back((*i)->cloneAction());
265 IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
266 SubjectQuery* cloneSubjectQuery() const {
267 return cloneAuthorizationDecisionQuery();
269 Query* cloneQuery() const {
270 return cloneAuthorizationDecisionQuery();
272 IMPL_STRING_ATTRIB(Resource);
273 IMPL_TYPED_CHILD(Evidence);
274 IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
277 void marshallAttributes(DOMElement* domElement) const {
278 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
279 SubjectQueryImpl::marshallAttributes(domElement);
282 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
283 PROC_TYPED_CHILD(Evidence,SAML1_NS,false);
284 PROC_TYPED_CHILDREN(Action,SAML1_NS,false);
285 SubjectQueryImpl::processChildElement(childXMLObject,root);
288 void processAttribute(const DOMAttr* attribute) {
289 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
290 SubjectQueryImpl::processAttribute(attribute);
294 class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
295 public AbstractComplexElement,
296 public AbstractDOMCachingXMLObject,
297 public AbstractXMLObjectMarshaller,
298 public AbstractXMLObjectUnmarshaller
304 m_children.push_back(NULL);
306 m_pos_Signature=m_children.begin();
309 RequestAbstractTypeImpl() {
313 virtual ~RequestAbstractTypeImpl() {
314 XMLString::release(&m_MinorVersion);
315 XMLString::release(&m_RequestID);
316 delete m_IssueInstant;
319 RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
320 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
324 RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src)
325 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
327 setMinorVersion(src.m_MinorVersion);
328 setRequestID(src.getRequestID());
329 setIssueInstant(src.getIssueInstant());
330 if (src.getSignature())
331 setSignature(src.getSignature()->cloneSignature());
332 VectorOf(RespondWith) v=getRespondWiths();
333 for (vector<RespondWith*>::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) {
335 v.push_back((*i)->cloneRespondWith());
340 //IMPL_TYPED_CHILD(Signature);
341 // Need customized setter.
343 Signature* m_Signature;
344 list<XMLObject*>::iterator m_pos_Signature;
346 Signature* getSignature() const {
350 void setSignature(Signature* sig) {
351 prepareForAssignment(m_Signature,sig);
352 *m_pos_Signature=m_Signature=sig;
353 // Sync content reference back up.
355 m_Signature->setContentReference(new opensaml::ContentReference(*this));
358 IMPL_INTEGER_ATTRIB(MinorVersion);
359 IMPL_STRING_ATTRIB(RequestID); // have to special-case getXMLID
360 const XMLCh* getXMLID() const {
361 pair<bool,int> v = getMinorVersion();
362 return (!v.first || v.second > 0) ? m_RequestID : NULL;
364 const XMLCh* getID() const {
365 return getRequestID();
367 IMPL_DATETIME_ATTRIB(IssueInstant,0);
368 IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
371 void marshallAttributes(DOMElement* domElement) const {
372 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
373 domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE);
375 const_cast<RequestAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XML_ONE);
376 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
378 const_cast<RequestAbstractTypeImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
379 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
380 if (!m_IssueInstant) {
381 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
382 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
384 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
387 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
388 PROC_TYPED_CHILDREN(RespondWith,SAML1P_NS,false);
389 PROC_TYPED_CHILD(Signature,XMLSIG_NS,false);
390 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
393 void processAttribute(const DOMAttr* attribute) {
394 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
395 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
396 if (!XMLString::equals(attribute->getValue(),XML_ONE))
397 throw UnmarshallingException("Request has invalid major version.");
399 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
400 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
401 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
405 class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl
408 m_children.push_back(NULL);
410 m_pos_Query=m_pos_Signature;
414 virtual ~RequestImpl() {}
416 RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
417 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
421 RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
424 setQuery(src.getQuery()->cloneQuery());
425 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
426 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
428 v.push_back((*i)->cloneAssertionIDReference());
431 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
432 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
434 v2.push_back((*i)->cloneAssertionArtifact());
439 IMPL_XMLOBJECT_CLONE(Request);
440 RequestAbstractType* cloneRequestAbstractType() const {
441 return cloneRequest();
443 IMPL_TYPED_CHILD(Query);
445 SubjectQuery* getSubjectQuery() const {
446 return dynamic_cast<SubjectQuery*>(getQuery());
448 AuthenticationQuery* getAuthenticationQuery() const {
449 return dynamic_cast<AuthenticationQuery*>(getQuery());
451 AttributeQuery* getAttributeQuery() const {
452 return dynamic_cast<AttributeQuery*>(getQuery());
454 AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
455 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
458 void setSubjectQuery(SubjectQuery* q) {
461 void setAuthenticationQuery(AuthenticationQuery* q) {
464 void setAttributeQuery(AttributeQuery* q) {
467 void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
471 IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
472 IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
475 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
476 PROC_TYPED_CHILD(Query,SAML1P_NS,true);
477 PROC_TYPED_CHILDREN(AssertionIDReference,SAML1_NS,false);
478 PROC_TYPED_CHILDREN(AssertionArtifact,SAML1P_NS,false);
479 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
483 class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
484 public AbstractComplexElement,
485 public AbstractDOMCachingXMLObject,
486 public AbstractXMLObjectMarshaller,
487 public AbstractXMLObjectUnmarshaller
491 m_children.push_back(NULL);
493 m_pos_StatusCode=m_children.begin();
496 virtual ~StatusCodeImpl() {
500 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
501 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
505 StatusCodeImpl(const StatusCodeImpl& src)
506 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
508 setValue(src.getValue());
509 if (src.getStatusCode())
510 setStatusCode(src.getStatusCode()->cloneStatusCode());
513 IMPL_XMLOBJECT_CLONE(StatusCode);
514 IMPL_XMLOBJECT_ATTRIB(Value,QName);
515 IMPL_TYPED_CHILD(StatusCode);
518 void marshallAttributes(DOMElement* domElement) const {
519 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
522 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
523 PROC_TYPED_CHILD(StatusCode,SAML1P_NS,true);
524 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
527 void processAttribute(const DOMAttr* attribute) {
528 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
532 class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
533 public AbstractComplexElement,
534 public AbstractDOMCachingXMLObject,
535 public AbstractXMLObjectMarshaller,
536 public AbstractXMLObjectUnmarshaller
539 virtual ~StatusDetailImpl() {}
541 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
542 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
545 StatusDetailImpl(const StatusDetailImpl& src)
546 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
547 VectorOf(XMLObject) v=getDetails();
548 for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
550 v.push_back((*i)->clone());
555 IMPL_XMLOBJECT_CLONE(StatusDetail);
556 IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
559 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
560 getDetails().push_back(childXMLObject);
564 class SAML_DLLLOCAL StatusImpl : public virtual Status,
565 public AbstractComplexElement,
566 public AbstractDOMCachingXMLObject,
567 public AbstractXMLObjectMarshaller,
568 public AbstractXMLObjectUnmarshaller
571 m_children.push_back(NULL);
572 m_children.push_back(NULL);
573 m_children.push_back(NULL);
575 m_pos_StatusCode=m_children.begin();
576 m_StatusMessage=NULL;
577 m_pos_StatusMessage=m_pos_StatusCode;
578 ++m_pos_StatusMessage;
580 m_pos_StatusDetail=m_pos_StatusMessage;
581 ++m_pos_StatusDetail;
584 virtual ~StatusImpl() {}
586 StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
587 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
591 StatusImpl(const StatusImpl& src)
592 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
594 if (src.getStatusCode())
595 setStatusCode(src.getStatusCode()->cloneStatusCode());
596 if (src.getStatusMessage())
597 setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
598 if (src.getStatusDetail())
599 setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
602 IMPL_XMLOBJECT_CLONE(Status);
603 IMPL_TYPED_CHILD(StatusCode);
604 IMPL_TYPED_CHILD(StatusMessage);
605 IMPL_TYPED_CHILD(StatusDetail);
608 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
609 PROC_TYPED_CHILD(StatusCode,SAML1P_NS,false);
610 PROC_TYPED_CHILD(StatusMessage,SAML1P_NS,false);
611 PROC_TYPED_CHILD(StatusDetail,SAML1P_NS,false);
612 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
616 class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType,
617 public AbstractComplexElement,
618 public AbstractDOMCachingXMLObject,
619 public AbstractXMLObjectMarshaller,
620 public AbstractXMLObjectUnmarshaller
628 m_children.push_back(NULL);
630 m_pos_Signature=m_children.begin();
633 ResponseAbstractTypeImpl() {
637 virtual ~ResponseAbstractTypeImpl() {
638 XMLString::release(&m_MinorVersion);
639 XMLString::release(&m_ResponseID);
640 XMLString::release(&m_InResponseTo);
641 XMLString::release(&m_Recipient);
642 delete m_IssueInstant;
645 ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
646 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
650 ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src)
651 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
653 setMinorVersion(src.m_MinorVersion);
654 setResponseID(src.getResponseID());
655 setInResponseTo(src.getInResponseTo());
656 setIssueInstant(src.getIssueInstant());
657 setRecipient(src.getRecipient());
658 if (src.getSignature())
659 setSignature(src.getSignature()->cloneSignature());
662 //IMPL_TYPED_CHILD(Signature);
663 // Need customized setter.
665 Signature* m_Signature;
666 list<XMLObject*>::iterator m_pos_Signature;
668 Signature* getSignature() const {
672 void setSignature(Signature* sig) {
673 prepareForAssignment(m_Signature,sig);
674 *m_pos_Signature=m_Signature=sig;
675 // Sync content reference back up.
677 m_Signature->setContentReference(new opensaml::ContentReference(*this));
680 IMPL_INTEGER_ATTRIB(MinorVersion);
681 IMPL_STRING_ATTRIB(ResponseID); // have to special-case getXMLID
682 const XMLCh* getXMLID() const {
683 pair<bool,int> v = getMinorVersion();
684 return (!v.first || v.second > 0) ? m_ResponseID : NULL;
686 const XMLCh* getID() const {
687 return getResponseID();
689 IMPL_STRING_ATTRIB(InResponseTo);
690 IMPL_DATETIME_ATTRIB(IssueInstant,0);
691 IMPL_STRING_ATTRIB(Recipient);
694 void marshallAttributes(DOMElement* domElement) const {
695 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
696 domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE);
698 const_cast<ResponseAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XML_ONE);
699 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
701 const_cast<ResponseAbstractTypeImpl*>(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier();
702 MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
703 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
704 if (!m_IssueInstant) {
705 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
706 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
708 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
709 MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
712 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
713 PROC_TYPED_CHILD(Signature,XMLSIG_NS,false);
714 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
717 void processAttribute(const DOMAttr* attribute) {
718 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
719 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
720 if (!XMLString::equals(attribute->getValue(),XML_ONE))
721 throw UnmarshallingException("Response has invalid major version.");
723 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
724 PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
725 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
726 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
727 PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
731 class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl
734 m_children.push_back(NULL);
736 m_pos_Status=m_pos_Signature;
740 virtual ~ResponseImpl() {}
742 ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
743 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
747 ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(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 ResponseAbstractType* cloneResponseAbstractType() 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,SAML1P_NS,false);
769 PROC_TYPED_CHILDREN(Assertion,SAML1_NS,true);
770 ResponseAbstractTypeImpl::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 RequestAbstractType::LOCAL_NAME[] = {chNull};
797 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);
798 const XMLCh RequestAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
799 const XMLCh RequestAbstractType::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
800 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
801 const XMLCh ResponseAbstractType::LOCAL_NAME[] = {chNull};
802 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);
803 const XMLCh ResponseAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
804 const XMLCh ResponseAbstractType::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D);
805 const XMLCh ResponseAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
806 const XMLCh ResponseAbstractType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
807 const XMLCh ResponseAbstractType::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t);
808 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);
809 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
810 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);
811 const XMLCh AttributeQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
812 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);
813 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);
814 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);
815 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);
816 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);
817 const XMLCh AuthorizationDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
818 const XMLCh Query::LOCAL_NAME[] = UNICODE_LITERAL_5(Q,u,e,r,y);
819 const XMLCh Request::LOCAL_NAME[] = UNICODE_LITERAL_7(R,e,q,u,e,s,t);
820 const XMLCh Request::TYPE_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,T,y,p,e);
821 const XMLCh RespondWith::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,s,p,o,n,d,W,i,t,h);
822 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
823 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
824 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
825 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
826 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
827 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
828 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
829 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
830 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
831 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
832 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
834 #define XCH(ch) chLatin_##ch
835 #define XNUM(d) chDigit_##d
837 const XMLCh _SUCCESS[] = UNICODE_LITERAL_7(S,u,c,c,e,s,s);
838 const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r);
839 const XMLCh _RESPONDER[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r);
840 const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
842 QName StatusCode::SUCCESS(SAML1P_NS,_SUCCESS,SAML1P_PREFIX);
843 QName StatusCode::REQUESTER(SAML1P_NS,_REQUESTER,SAML1P_PREFIX);
844 QName StatusCode::RESPONDER(SAML1P_NS,_RESPONDER,SAML1P_PREFIX);
845 QName StatusCode::VERSIONMISMATCH(SAML1P_NS,_VERSIONMISMATCH,SAML1P_PREFIX);