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>
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;
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 AbstractXMLObjectMarshaller,
62 public AbstractXMLObjectUnmarshaller
66 virtual ~RespondWithImpl() {
70 RespondWithImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
71 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_qname(NULL) {
74 RespondWithImpl(const RespondWithImpl& src)
75 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_qname(NULL) {
76 setQName(src.getQName());
79 QName* getQName() const {
83 void setQName(const QName* qname) {
84 m_qname=prepareForAssignment(m_qname,qname);
86 auto_ptr_XMLCh temp(m_qname->toString().c_str());
87 setTextContent(temp.get());
93 IMPL_XMLOBJECT_CLONE(RespondWith);
94 IMPL_XMLOBJECT_CONTENT;
97 class SAML_DLLLOCAL SubjectQueryImpl : public virtual SubjectQuery,
98 public AbstractComplexElement,
99 public AbstractDOMCachingXMLObject,
100 public AbstractXMLObjectMarshaller,
101 public AbstractXMLObjectUnmarshaller
105 m_children.push_back(NULL);
106 m_pos_Subject=m_children.begin();
113 virtual ~SubjectQueryImpl() {}
115 SubjectQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
116 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
120 SubjectQueryImpl(const SubjectQueryImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
122 if (src.getSubject())
123 setSubject(src.getSubject()->cloneSubject());
126 IMPL_TYPED_CHILD(Subject);
129 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
130 PROC_TYPED_CHILD(Subject,SAMLConstants::SAML1_NS,true);
131 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
135 class SAML_DLLLOCAL AuthenticationQueryImpl : public virtual AuthenticationQuery, public SubjectQueryImpl
138 m_AuthenticationMethod=NULL;
141 virtual ~AuthenticationQueryImpl() {
142 XMLString::release(&m_AuthenticationMethod);
145 AuthenticationQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
146 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
150 AuthenticationQueryImpl(const AuthenticationQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
152 setAuthenticationMethod(src.getAuthenticationMethod());
155 IMPL_XMLOBJECT_CLONE(AuthenticationQuery);
156 SubjectQuery* cloneSubjectQuery() const {
157 return cloneAuthenticationQuery();
159 Query* cloneQuery() const {
160 return cloneAuthenticationQuery();
162 IMPL_STRING_ATTRIB(AuthenticationMethod);
165 void marshallAttributes(DOMElement* domElement) const {
166 MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
167 SubjectQueryImpl::marshallAttributes(domElement);
170 void processAttribute(const DOMAttr* attribute) {
171 PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
172 SubjectQueryImpl::processAttribute(attribute);
176 class SAML_DLLLOCAL AttributeQueryImpl : public virtual AttributeQuery, public SubjectQueryImpl
182 virtual ~AttributeQueryImpl() {
183 XMLString::release(&m_Resource);
186 AttributeQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
187 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
191 AttributeQueryImpl(const AttributeQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
193 setResource(src.getResource());
194 VectorOf(AttributeDesignator) v=getAttributeDesignators();
195 for (vector<AttributeDesignator*>::const_iterator i=src.m_AttributeDesignators.begin(); i!=src.m_AttributeDesignators.end(); i++) {
197 v.push_back((*i)->cloneAttributeDesignator());
202 IMPL_XMLOBJECT_CLONE(AttributeQuery);
203 SubjectQuery* cloneSubjectQuery() const {
204 return cloneAttributeQuery();
206 Query* cloneQuery() const {
207 return cloneAttributeQuery();
209 IMPL_STRING_ATTRIB(Resource);
210 IMPL_TYPED_CHILDREN(AttributeDesignator,m_children.end());
213 void marshallAttributes(DOMElement* domElement) const {
214 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
215 SubjectQueryImpl::marshallAttributes(domElement);
218 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
219 PROC_TYPED_CHILDREN(AttributeDesignator,SAMLConstants::SAML1_NS,true);
220 SubjectQueryImpl::processChildElement(childXMLObject,root);
223 void processAttribute(const DOMAttr* attribute) {
224 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
225 SubjectQueryImpl::processAttribute(attribute);
229 class SAML_DLLLOCAL AuthorizationDecisionQueryImpl : public virtual AuthorizationDecisionQuery, public SubjectQueryImpl
234 m_children.push_back(NULL);
235 m_pos_Evidence=m_pos_Subject;
239 virtual ~AuthorizationDecisionQueryImpl() {
240 XMLString::release(&m_Resource);
243 AuthorizationDecisionQueryImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
244 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
248 AuthorizationDecisionQueryImpl(const AuthorizationDecisionQueryImpl& src) : AbstractXMLObject(src), SubjectQueryImpl(src) {
250 setResource(src.getResource());
251 if (src.getEvidence())
252 setEvidence(src.getEvidence()->cloneEvidence());
253 VectorOf(Action) v=getActions();
254 for (vector<Action*>::const_iterator i=src.m_Actions.begin(); i!=src.m_Actions.end(); i++) {
256 v.push_back((*i)->cloneAction());
261 IMPL_XMLOBJECT_CLONE(AuthorizationDecisionQuery);
262 SubjectQuery* cloneSubjectQuery() const {
263 return cloneAuthorizationDecisionQuery();
265 Query* cloneQuery() const {
266 return cloneAuthorizationDecisionQuery();
268 IMPL_STRING_ATTRIB(Resource);
269 IMPL_TYPED_CHILD(Evidence);
270 IMPL_TYPED_CHILDREN(Action, m_pos_Evidence);
273 void marshallAttributes(DOMElement* domElement) const {
274 MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
275 SubjectQueryImpl::marshallAttributes(domElement);
278 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
279 PROC_TYPED_CHILD(Evidence,SAMLConstants::SAML1_NS,false);
280 PROC_TYPED_CHILDREN(Action,SAMLConstants::SAML1_NS,false);
281 SubjectQueryImpl::processChildElement(childXMLObject,root);
284 void processAttribute(const DOMAttr* attribute) {
285 PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
286 SubjectQueryImpl::processAttribute(attribute);
290 class SAML_DLLLOCAL RequestAbstractTypeImpl : public virtual RequestAbstractType,
291 public AbstractComplexElement,
292 public AbstractDOMCachingXMLObject,
293 public AbstractXMLObjectMarshaller,
294 public AbstractXMLObjectUnmarshaller
300 m_children.push_back(NULL);
302 m_pos_Signature=m_children.begin();
305 RequestAbstractTypeImpl() {
309 virtual ~RequestAbstractTypeImpl() {
310 XMLString::release(&m_MinorVersion);
311 XMLString::release(&m_RequestID);
312 delete m_IssueInstant;
315 RequestAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
316 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
320 RequestAbstractTypeImpl(const RequestAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
322 setMinorVersion(src.m_MinorVersion);
323 setRequestID(src.getRequestID());
324 setIssueInstant(src.getIssueInstant());
325 if (src.getSignature())
326 setSignature(src.getSignature()->cloneSignature());
327 VectorOf(RespondWith) v=getRespondWiths();
328 for (vector<RespondWith*>::const_iterator i=src.m_RespondWiths.begin(); i!=src.m_RespondWiths.end(); i++) {
330 v.push_back((*i)->cloneRespondWith());
335 //IMPL_TYPED_CHILD(Signature);
336 // Need customized setter.
338 Signature* m_Signature;
339 list<XMLObject*>::iterator m_pos_Signature;
341 Signature* getSignature() const {
345 void setSignature(Signature* sig) {
346 prepareForAssignment(m_Signature,sig);
347 *m_pos_Signature=m_Signature=sig;
348 // Sync content reference back up.
350 m_Signature->setContentReference(new opensaml::ContentReference(*this));
353 IMPL_INTEGER_ATTRIB(MinorVersion);
354 IMPL_ID_ATTRIB(RequestID);
355 IMPL_DATETIME_ATTRIB(IssueInstant,0);
356 IMPL_TYPED_CHILDREN(RespondWith,m_pos_Signature);
359 void marshallAttributes(DOMElement* domElement) const {
360 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
361 domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE);
363 const_cast<RequestAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE);
364 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
366 const_cast<RequestAbstractTypeImpl*>(this)->m_RequestID=SAMLConfig::getConfig().generateIdentifier();
367 MARSHALL_ID_ATTRIB(RequestID,REQUESTID,NULL);
368 if (!m_IssueInstant) {
369 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
370 const_cast<RequestAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
372 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
375 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
376 PROC_TYPED_CHILDREN(RespondWith,SAMLConstants::SAML1P_NS,false);
377 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
378 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
381 void processAttribute(const DOMAttr* attribute) {
382 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
383 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
384 if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE))
385 throw UnmarshallingException("Request has invalid major version.");
387 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
388 PROC_ID_ATTRIB(RequestID,REQUESTID,NULL);
389 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
393 class SAML_DLLLOCAL RequestImpl : public virtual Request, public RequestAbstractTypeImpl
396 m_children.push_back(NULL);
398 m_pos_Query=m_pos_Signature;
402 virtual ~RequestImpl() {}
404 RequestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
405 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
409 RequestImpl(const RequestImpl& src) : AbstractXMLObject(src), RequestAbstractTypeImpl(src) {
412 setQuery(src.getQuery()->cloneQuery());
413 VectorOf(AssertionIDReference) v=getAssertionIDReferences();
414 for (vector<AssertionIDReference*>::const_iterator i=src.m_AssertionIDReferences.begin(); i!=src.m_AssertionIDReferences.end(); i++) {
416 v.push_back((*i)->cloneAssertionIDReference());
419 VectorOf(AssertionArtifact) v2=getAssertionArtifacts();
420 for (vector<AssertionArtifact*>::const_iterator i=src.m_AssertionArtifacts.begin(); i!=src.m_AssertionArtifacts.end(); i++) {
422 v2.push_back((*i)->cloneAssertionArtifact());
427 IMPL_XMLOBJECT_CLONE(Request);
428 RequestAbstractType* cloneRequestAbstractType() const {
429 return cloneRequest();
431 IMPL_TYPED_CHILD(Query);
433 SubjectQuery* getSubjectQuery() const {
434 return dynamic_cast<SubjectQuery*>(getQuery());
436 AuthenticationQuery* getAuthenticationQuery() const {
437 return dynamic_cast<AuthenticationQuery*>(getQuery());
439 AttributeQuery* getAttributeQuery() const {
440 return dynamic_cast<AttributeQuery*>(getQuery());
442 AuthorizationDecisionQuery* getAuthorizationDecisionQuery() const {
443 return dynamic_cast<AuthorizationDecisionQuery*>(getQuery());
446 void setSubjectQuery(SubjectQuery* q) {
449 void setAuthenticationQuery(AuthenticationQuery* q) {
452 void setAttributeQuery(AttributeQuery* q) {
455 void setAuthorizationDecisionQuery(AuthorizationDecisionQuery* q) {
459 IMPL_TYPED_CHILDREN(AssertionIDReference, m_children.end());
460 IMPL_TYPED_CHILDREN(AssertionArtifact, m_children.end());
463 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
464 PROC_TYPED_CHILD(Query,SAMLConstants::SAML1P_NS,true);
465 PROC_TYPED_CHILDREN(AssertionIDReference,SAMLConstants::SAML1_NS,false);
466 PROC_TYPED_CHILDREN(AssertionArtifact,SAMLConstants::SAML1P_NS,false);
467 RequestAbstractTypeImpl::processChildElement(childXMLObject,root);
471 class SAML_DLLLOCAL StatusCodeImpl : public virtual StatusCode,
472 public AbstractComplexElement,
473 public AbstractDOMCachingXMLObject,
474 public AbstractXMLObjectMarshaller,
475 public AbstractXMLObjectUnmarshaller
479 m_children.push_back(NULL);
481 m_pos_StatusCode=m_children.begin();
484 virtual ~StatusCodeImpl() {
488 StatusCodeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
489 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
493 StatusCodeImpl(const StatusCodeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
495 setValue(src.getValue());
496 if (src.getStatusCode())
497 setStatusCode(src.getStatusCode()->cloneStatusCode());
500 IMPL_XMLOBJECT_CLONE(StatusCode);
501 IMPL_XMLOBJECT_ATTRIB(Value,QName);
502 IMPL_TYPED_CHILD(StatusCode);
505 void marshallAttributes(DOMElement* domElement) const {
506 MARSHALL_QNAME_ATTRIB(Value,VALUE,NULL);
509 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
510 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,true);
511 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
514 void processAttribute(const DOMAttr* attribute) {
515 PROC_QNAME_ATTRIB(Value,VALUE,NULL);
519 class SAML_DLLLOCAL StatusDetailImpl : public virtual StatusDetail,
520 public AbstractComplexElement,
521 public AbstractDOMCachingXMLObject,
522 public AbstractXMLObjectMarshaller,
523 public AbstractXMLObjectUnmarshaller
526 virtual ~StatusDetailImpl() {}
528 StatusDetailImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
529 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
532 StatusDetailImpl(const StatusDetailImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
533 VectorOf(XMLObject) v=getDetails();
534 for (vector<XMLObject*>::const_iterator i=src.m_Details.begin(); i!=src.m_Details.end(); i++) {
536 v.push_back((*i)->clone());
541 IMPL_XMLOBJECT_CLONE(StatusDetail);
542 IMPL_XMLOBJECT_CHILDREN(Detail,m_children.end());
545 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
546 getDetails().push_back(childXMLObject);
550 class SAML_DLLLOCAL StatusImpl : public virtual Status,
551 public AbstractComplexElement,
552 public AbstractDOMCachingXMLObject,
553 public AbstractXMLObjectMarshaller,
554 public AbstractXMLObjectUnmarshaller
557 m_children.push_back(NULL);
558 m_children.push_back(NULL);
559 m_children.push_back(NULL);
561 m_pos_StatusCode=m_children.begin();
562 m_StatusMessage=NULL;
563 m_pos_StatusMessage=m_pos_StatusCode;
564 ++m_pos_StatusMessage;
566 m_pos_StatusDetail=m_pos_StatusMessage;
567 ++m_pos_StatusDetail;
570 virtual ~StatusImpl() {}
572 StatusImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
573 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
577 StatusImpl(const StatusImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
579 if (src.getStatusCode())
580 setStatusCode(src.getStatusCode()->cloneStatusCode());
581 if (src.getStatusMessage())
582 setStatusMessage(src.getStatusMessage()->cloneStatusMessage());
583 if (src.getStatusDetail())
584 setStatusDetail(src.getStatusDetail()->cloneStatusDetail());
587 IMPL_XMLOBJECT_CLONE(Status);
588 IMPL_TYPED_CHILD(StatusCode);
589 IMPL_TYPED_CHILD(StatusMessage);
590 IMPL_TYPED_CHILD(StatusDetail);
593 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
594 PROC_TYPED_CHILD(StatusCode,SAMLConstants::SAML1P_NS,false);
595 PROC_TYPED_CHILD(StatusMessage,SAMLConstants::SAML1P_NS,false);
596 PROC_TYPED_CHILD(StatusDetail,SAMLConstants::SAML1P_NS,false);
597 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
601 class SAML_DLLLOCAL ResponseAbstractTypeImpl : public virtual ResponseAbstractType,
602 public AbstractComplexElement,
603 public AbstractDOMCachingXMLObject,
604 public AbstractXMLObjectMarshaller,
605 public AbstractXMLObjectUnmarshaller
613 m_children.push_back(NULL);
615 m_pos_Signature=m_children.begin();
618 ResponseAbstractTypeImpl() {
622 virtual ~ResponseAbstractTypeImpl() {
623 XMLString::release(&m_MinorVersion);
624 XMLString::release(&m_ResponseID);
625 XMLString::release(&m_InResponseTo);
626 XMLString::release(&m_Recipient);
627 delete m_IssueInstant;
630 ResponseAbstractTypeImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
631 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
635 ResponseAbstractTypeImpl(const ResponseAbstractTypeImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src) {
637 setMinorVersion(src.m_MinorVersion);
638 setResponseID(src.getResponseID());
639 setInResponseTo(src.getInResponseTo());
640 setIssueInstant(src.getIssueInstant());
641 setRecipient(src.getRecipient());
642 if (src.getSignature())
643 setSignature(src.getSignature()->cloneSignature());
646 //IMPL_TYPED_CHILD(Signature);
647 // Need customized setter.
649 Signature* m_Signature;
650 list<XMLObject*>::iterator m_pos_Signature;
652 Signature* getSignature() const {
656 void setSignature(Signature* sig) {
657 prepareForAssignment(m_Signature,sig);
658 *m_pos_Signature=m_Signature=sig;
659 // Sync content reference back up.
661 m_Signature->setContentReference(new opensaml::ContentReference(*this));
664 IMPL_INTEGER_ATTRIB(MinorVersion);
665 IMPL_ID_ATTRIB(ResponseID);
666 IMPL_STRING_ATTRIB(InResponseTo);
667 IMPL_DATETIME_ATTRIB(IssueInstant,0);
668 IMPL_STRING_ATTRIB(Recipient);
671 void marshallAttributes(DOMElement* domElement) const {
672 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
673 domElement->setAttributeNS(NULL,MAJORVERSION,XMLConstants::XML_ONE);
675 const_cast<ResponseAbstractTypeImpl*>(this)->m_MinorVersion=XMLString::replicate(XMLConstants::XML_ONE);
676 MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
678 const_cast<ResponseAbstractTypeImpl*>(this)->m_ResponseID=SAMLConfig::getConfig().generateIdentifier();
679 MARSHALL_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
680 MARSHALL_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
681 if (!m_IssueInstant) {
682 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstantEpoch=time(NULL);
683 const_cast<ResponseAbstractTypeImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
685 MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
686 MARSHALL_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
689 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
690 PROC_TYPED_CHILD(Signature,XMLConstants::XMLSIG_NS,false);
691 AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
694 void processAttribute(const DOMAttr* attribute) {
695 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
696 if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
697 if (!XMLString::equals(attribute->getValue(),XMLConstants::XML_ONE))
698 throw UnmarshallingException("Response has invalid major version.");
700 PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
701 PROC_ID_ATTRIB(ResponseID,RESPONSEID,NULL);
702 PROC_STRING_ATTRIB(InResponseTo,INRESPONSETO,NULL);
703 PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
704 PROC_STRING_ATTRIB(Recipient,RECIPIENT,NULL);
708 class SAML_DLLLOCAL ResponseImpl : public virtual Response, public ResponseAbstractTypeImpl
711 m_children.push_back(NULL);
713 m_pos_Status=m_pos_Signature;
717 virtual ~ResponseImpl() {}
719 ResponseImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)
720 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
724 ResponseImpl(const ResponseImpl& src) : AbstractXMLObject(src), ResponseAbstractTypeImpl(src) {
727 setStatus(src.getStatus()->cloneStatus());
728 VectorOf(Assertion) v=getAssertions();
729 for (vector<Assertion*>::const_iterator i=src.m_Assertions.begin(); i!=src.m_Assertions.end(); i++) {
731 v.push_back((*i)->cloneAssertion());
736 IMPL_XMLOBJECT_CLONE(Response);
737 ResponseAbstractType* cloneResponseAbstractType() const {
738 return cloneResponse();
740 IMPL_TYPED_CHILD(Status);
741 IMPL_TYPED_CHILDREN(Assertion, m_children.end());
744 void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
745 PROC_TYPED_CHILD(Status,SAMLConstants::SAML1P_NS,false);
746 PROC_TYPED_CHILDREN(Assertion,SAMLConstants::SAML1_NS,true);
747 ResponseAbstractTypeImpl::processChildElement(childXMLObject,root);
754 #if defined (_MSC_VER)
755 #pragma warning( pop )
758 // Builder Implementations
760 IMPL_XMLOBJECTBUILDER(AssertionArtifact);
761 IMPL_XMLOBJECTBUILDER(AttributeQuery);
762 IMPL_XMLOBJECTBUILDER(AuthenticationQuery);
763 IMPL_XMLOBJECTBUILDER(AuthorizationDecisionQuery);
764 IMPL_XMLOBJECTBUILDER(Request);
765 IMPL_XMLOBJECTBUILDER(RespondWith);
766 IMPL_XMLOBJECTBUILDER(Response);
767 IMPL_XMLOBJECTBUILDER(Status);
768 IMPL_XMLOBJECTBUILDER(StatusCode);
769 IMPL_XMLOBJECTBUILDER(StatusDetail);
770 IMPL_XMLOBJECTBUILDER(StatusMessage);
773 const XMLCh RequestAbstractType::LOCAL_NAME[] = {chNull};
774 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);
775 const XMLCh RequestAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
776 const XMLCh RequestAbstractType::REQUESTID_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,I,D);
777 const XMLCh RequestAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
778 const XMLCh ResponseAbstractType::LOCAL_NAME[] = {chNull};
779 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);
780 const XMLCh ResponseAbstractType::MINORVERSION_ATTRIB_NAME[] = UNICODE_LITERAL_12(M,i,n,o,r,V,e,r,s,i,o,n);
781 const XMLCh ResponseAbstractType::RESPONSEID_ATTRIB_NAME[] = UNICODE_LITERAL_10(R,e,s,p,o,n,s,e,I,D);
782 const XMLCh ResponseAbstractType::ISSUEINSTANT_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,s,s,u,e,I,n,s,t,a,n,t);
783 const XMLCh ResponseAbstractType::INRESPONSETO_ATTRIB_NAME[] = UNICODE_LITERAL_12(I,n,R,e,s,p,o,n,s,e,T,o);
784 const XMLCh ResponseAbstractType::RECIPIENT_ATTRIB_NAME[] = UNICODE_LITERAL_9(R,e,c,i,p,i,e,n,t);
785 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);
786 const XMLCh AttributeQuery::LOCAL_NAME[] = UNICODE_LITERAL_14(A,t,t,r,i,b,u,t,e,Q,u,e,r,y);
787 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);
788 const XMLCh AttributeQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
789 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);
790 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);
791 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);
792 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);
793 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);
794 const XMLCh AuthorizationDecisionQuery::RESOURCE_ATTRIB_NAME[] = UNICODE_LITERAL_8(R,e,s,o,u,r,c,e);
795 const XMLCh Query::LOCAL_NAME[] = UNICODE_LITERAL_5(Q,u,e,r,y);
796 const XMLCh Request::LOCAL_NAME[] = UNICODE_LITERAL_7(R,e,q,u,e,s,t);
797 const XMLCh Request::TYPE_NAME[] = UNICODE_LITERAL_11(R,e,q,u,e,s,t,T,y,p,e);
798 const XMLCh RespondWith::LOCAL_NAME[] = UNICODE_LITERAL_11(R,e,s,p,o,n,d,W,i,t,h);
799 const XMLCh Response::LOCAL_NAME[] = UNICODE_LITERAL_8(R,e,s,p,o,n,s,e);
800 const XMLCh Response::TYPE_NAME[] = UNICODE_LITERAL_12(R,e,s,p,o,n,s,e,T,y,p,e);
801 const XMLCh Status::LOCAL_NAME[] = UNICODE_LITERAL_6(S,t,a,t,u,s);
802 const XMLCh Status::TYPE_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,T,y,p,e);
803 const XMLCh StatusCode::LOCAL_NAME[] = UNICODE_LITERAL_10(S,t,a,t,u,s,C,o,d,e);
804 const XMLCh StatusCode::TYPE_NAME[] = UNICODE_LITERAL_14(S,t,a,t,u,s,C,o,d,e,T,y,p,e);
805 const XMLCh StatusCode::VALUE_ATTRIB_NAME[] = UNICODE_LITERAL_5(V,a,l,u,e);
806 const XMLCh StatusDetail::LOCAL_NAME[] = UNICODE_LITERAL_12(S,t,a,t,u,s,D,e,t,a,i,l);
807 const XMLCh StatusDetail::TYPE_NAME[] = UNICODE_LITERAL_16(S,t,a,t,u,s,D,e,t,a,i,l,T,y,p,e);
808 const XMLCh StatusMessage::LOCAL_NAME[] = UNICODE_LITERAL_13(S,t,a,t,u,s,M,e,s,s,a,g,e);
809 const XMLCh SubjectQuery::LOCAL_NAME[] = UNICODE_LITERAL_12(S,u,b,j,e,c,t,Q,u,e,r,y);
811 #define XCH(ch) chLatin_##ch
812 #define XNUM(d) chDigit_##d
814 const XMLCh _SUCCESS[] = UNICODE_LITERAL_7(S,u,c,c,e,s,s);
815 const XMLCh _REQUESTER[] = UNICODE_LITERAL_9(R,e,q,u,e,s,t,e,r);
816 const XMLCh _RESPONDER[] = UNICODE_LITERAL_9(R,e,s,p,o,n,d,e,r);
817 const XMLCh _VERSIONMISMATCH[] = UNICODE_LITERAL_15(V,e,r,s,i,o,n,M,i,s,m,a,t,c,h);
819 QName StatusCode::SUCCESS(SAMLConstants::SAML1P_NS,_SUCCESS,SAMLConstants::SAML1P_PREFIX);
820 QName StatusCode::REQUESTER(SAMLConstants::SAML1P_NS,_REQUESTER,SAMLConstants::SAML1P_PREFIX);
821 QName StatusCode::RESPONDER(SAMLConstants::SAML1P_NS,_RESPONDER,SAMLConstants::SAML1P_PREFIX);
822 QName StatusCode::VERSIONMISMATCH(SAMLConstants::SAML1P_NS,_VERSIONMISMATCH,SAMLConstants::SAML1P_PREFIX);