Change license header, remove stale pkg files.
[shibboleth/cpp-opensaml.git] / saml / saml1 / core / impl / AssertionsImpl.cpp
index ac0fde1..e6b7051 100644 (file)
@@ -1,34 +1,42 @@
-/*
- *  Copyright 2001-2009 Internet2
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
  *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * UCAID licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the
+ * License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
  */
 
 /**
  * AssertionsImpl.cpp
  *
- * Implementation classes for SAML 1.x Assertions schema
+ * Implementation classes for SAML 1.x Assertions schema.
  */
 
 #include "internal.h"
 #include "exceptions.h"
 #include "saml1/core/Assertions.h"
+#include "signature/ContentReference.h"
 
 #include <xmltooling/AbstractComplexElement.h>
 #include <xmltooling/AbstractSimpleElement.h>
 #include <xmltooling/impl/AnyElement.h>
 #include <xmltooling/io/AbstractXMLObjectMarshaller.h>
 #include <xmltooling/io/AbstractXMLObjectUnmarshaller.h>
+#include <xmltooling/signature/KeyInfo.h>
+#include <xmltooling/signature/Signature.h>
+#include <xmltooling/util/DateTime.h>
 #include <xmltooling/util/XMLHelper.h>
 
 #include <ctime>
@@ -175,7 +183,7 @@ namespace opensaml {
             }
 
             void init() {
-                m_NotBefore=m_NotOnOrAfter=NULL;
+                m_NotBefore=m_NotOnOrAfter=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(Conditions);
@@ -187,8 +195,8 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
-                MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
+                MARSHALL_DATETIME_ATTRIB(NotBefore,NOTBEFORE,nullptr);
+                MARSHALL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
             }
 
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
@@ -199,8 +207,8 @@ namespace opensaml {
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_DATETIME_ATTRIB(NotBefore,NOTBEFORE,NULL);
-                PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,NULL);
+                PROC_DATETIME_ATTRIB(NotBefore,NOTBEFORE,nullptr);
+                PROC_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER,nullptr);
             }
         };
 
@@ -229,7 +237,7 @@ namespace opensaml {
             }
 
             void init() {
-                m_Format=m_NameQualifier=NULL;
+                m_Format=m_NameQualifier=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(NameIdentifier);
@@ -238,13 +246,13 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Format,FORMAT,NULL);
-                MARSHALL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
+                MARSHALL_STRING_ATTRIB(Format,FORMAT,nullptr);
+                MARSHALL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,nullptr);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Format,FORMAT,NULL);
-                PROC_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,NULL);
+                PROC_STRING_ATTRIB(Format,FORMAT,nullptr);
+                PROC_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER,nullptr);
             }
         };
 
@@ -293,10 +301,10 @@ namespace opensaml {
             }
 
             void init() {
-                m_SubjectConfirmationData=NULL;
-                m_KeyInfo=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_SubjectConfirmationData=nullptr;
+                m_KeyInfo=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_SubjectConfirmationData=m_children.begin();
                 m_pos_KeyInfo=m_pos_SubjectConfirmationData;
                 ++m_pos_KeyInfo;
@@ -343,10 +351,10 @@ namespace opensaml {
             }
 
             void init() {
-                m_NameIdentifier=NULL;
-                m_SubjectConfirmation=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
+                m_NameIdentifier=nullptr;
+                m_SubjectConfirmation=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
                 m_pos_NameIdentifier=m_children.begin();
                 m_pos_SubjectConfirmation=m_pos_NameIdentifier;
                 ++m_pos_SubjectConfirmation;
@@ -385,8 +393,8 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_Subject=NULL;
-                m_children.push_back(NULL);
+                m_Subject=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Subject=m_children.begin();
             }
         protected:
@@ -442,7 +450,7 @@ namespace opensaml {
             }
 
             void init() {
-                m_IPAddress=m_DNSAddress=NULL;
+                m_IPAddress=m_DNSAddress=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(SubjectLocality);
@@ -451,13 +459,13 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
-                MARSHALL_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
+                MARSHALL_STRING_ATTRIB(IPAddress,IPADDRESS,nullptr);
+                MARSHALL_STRING_ATTRIB(DNSAddress,DNSADDRESS,nullptr);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(IPAddress,IPADDRESS,NULL);
-                PROC_STRING_ATTRIB(DNSAddress,DNSADDRESS,NULL);
+                PROC_STRING_ATTRIB(IPAddress,IPADDRESS,nullptr);
+                PROC_STRING_ATTRIB(DNSAddress,DNSADDRESS,nullptr);
             }
         };
 
@@ -488,8 +496,8 @@ namespace opensaml {
             }
 
             void init() {
-                m_AuthorityKind=NULL;
-                m_Location=m_Binding=NULL;
+                m_AuthorityKind=nullptr;
+                m_Location=m_Binding=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(AuthorityBinding);
@@ -499,15 +507,15 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
-                MARSHALL_STRING_ATTRIB(Location,LOCATION,NULL);
-                MARSHALL_STRING_ATTRIB(Binding,BINDING,NULL);
+                MARSHALL_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,nullptr);
+                MARSHALL_STRING_ATTRIB(Location,LOCATION,nullptr);
+                MARSHALL_STRING_ATTRIB(Binding,BINDING,nullptr);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,NULL);
-                PROC_STRING_ATTRIB(Location,LOCATION,NULL);
-                PROC_STRING_ATTRIB(Binding,BINDING,NULL);
+                PROC_QNAME_ATTRIB(AuthorityKind,AUTHORITYKIND,nullptr);
+                PROC_STRING_ATTRIB(Location,LOCATION,nullptr);
+                PROC_STRING_ATTRIB(Binding,BINDING,nullptr);
             }
         };
 
@@ -539,10 +547,10 @@ namespace opensaml {
             }
 
             void init() {
-                m_AuthenticationMethod=NULL;
-                m_AuthenticationInstant=NULL;
-                m_SubjectLocality=NULL;
-                m_children.push_back(NULL);
+                m_AuthenticationMethod=nullptr;
+                m_AuthenticationInstant=nullptr;
+                m_SubjectLocality=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_SubjectLocality=m_pos_Subject;
                 ++m_pos_SubjectLocality;
             }
@@ -561,8 +569,8 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
-                MARSHALL_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
+                MARSHALL_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,nullptr);
+                MARSHALL_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,nullptr);
                 SubjectStatementImpl::marshallAttributes(domElement);
             }
 
@@ -573,8 +581,8 @@ namespace opensaml {
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,NULL);
-                PROC_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,NULL);
+                PROC_STRING_ATTRIB(AuthenticationMethod,AUTHENTICATIONMETHOD,nullptr);
+                PROC_DATETIME_ATTRIB(AuthenticationInstant,AUTHENTICATIONINSTANT,nullptr);
                 SubjectStatementImpl::processAttribute(attribute);
             }
         };
@@ -591,7 +599,7 @@ namespace opensaml {
             }
 
             ActionImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
-                    : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Namespace(NULL) {
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Namespace(nullptr) {
             }
 
             ActionImpl(const ActionImpl& src) : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
@@ -603,11 +611,11 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
+                MARSHALL_STRING_ATTRIB(Namespace,NAMESPACE,nullptr);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Namespace,NAMESPACE,NULL);
+                PROC_STRING_ATTRIB(Namespace,NAMESPACE,nullptr);
             }
         };
 
@@ -685,10 +693,10 @@ namespace opensaml {
             }
 
             void init() {
-                m_Resource=NULL;
-                m_Decision=NULL;
-                m_Evidence=NULL;
-                m_children.push_back(NULL);
+                m_Resource=nullptr;
+                m_Decision=nullptr;
+                m_Evidence=nullptr;
+                m_children.push_back(nullptr);
                 m_pos_Evidence=m_pos_Subject;
                 ++m_pos_Evidence;
             }
@@ -707,8 +715,8 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(Resource,RESOURCE,NULL);
-                MARSHALL_STRING_ATTRIB(Decision,DECISION,NULL);
+                MARSHALL_STRING_ATTRIB(Resource,RESOURCE,nullptr);
+                MARSHALL_STRING_ATTRIB(Decision,DECISION,nullptr);
                 SubjectStatementImpl::marshallAttributes(domElement);
             }
 
@@ -719,8 +727,8 @@ namespace opensaml {
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(Resource,RESOURCE,NULL);
-                PROC_STRING_ATTRIB(Decision,DECISION,NULL);
+                PROC_STRING_ATTRIB(Resource,RESOURCE,nullptr);
+                PROC_STRING_ATTRIB(Decision,DECISION,nullptr);
                 SubjectStatementImpl::processAttribute(attribute);
             }
         };
@@ -750,7 +758,7 @@ namespace opensaml {
             }
 
             void init() {
-                m_AttributeName=m_AttributeNamespace=NULL;
+                m_AttributeName=m_AttributeNamespace=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(AttributeDesignator);
@@ -759,13 +767,13 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
-                MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+                MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,nullptr);
+                MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,nullptr);
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
-                PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+                PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,nullptr);
+                PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,nullptr);
             }
         };
 
@@ -800,7 +808,7 @@ namespace opensaml {
             }
 
             void init() {
-                m_AttributeName=m_AttributeNamespace=NULL;
+                m_AttributeName=m_AttributeNamespace=nullptr;
             }
 
             IMPL_XMLOBJECT_CLONE(Attribute);
@@ -813,8 +821,8 @@ namespace opensaml {
 
         protected:
             void marshallAttributes(DOMElement* domElement) const {
-                MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
-                MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+                MARSHALL_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,nullptr);
+                MARSHALL_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,nullptr);
             }
 
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
@@ -822,8 +830,8 @@ namespace opensaml {
             }
 
             void processAttribute(const DOMAttr* attribute) {
-                PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,NULL);
-                PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,NULL);
+                PROC_STRING_ATTRIB(AttributeName,ATTRIBUTENAME,nullptr);
+                PROC_STRING_ATTRIB(AttributeNamespace,ATTRIBUTENAMESPACE,nullptr);
             }
         };
 
@@ -938,16 +946,16 @@ namespace opensaml {
             public AbstractXMLObjectUnmarshaller
         {
             void init() {
-                m_MinorVersion=NULL;
-                m_AssertionID=NULL;
-                m_Issuer=NULL;
-                m_IssueInstant=NULL;
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_children.push_back(NULL);
-                m_Conditions=NULL;
-                m_Advice=NULL;
-                m_Signature=NULL;
+                m_MinorVersion=nullptr;
+                m_AssertionID=nullptr;
+                m_Issuer=nullptr;
+                m_IssueInstant=nullptr;
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_children.push_back(nullptr);
+                m_Conditions=nullptr;
+                m_Advice=nullptr;
+                m_Signature=nullptr;
                 m_pos_Conditions=m_children.begin();
                 m_pos_Advice=m_pos_Conditions;
                 ++m_pos_Advice;
@@ -1038,11 +1046,16 @@ namespace opensaml {
             IMPL_STRING_ATTRIB(AssertionID);    // have to special-case getXMLID
             const XMLCh* getXMLID() const {
                 pair<bool,int> v = getMinorVersion();
-                return (!v.first || v.second > 0) ? m_AssertionID : NULL;
+                return (!v.first || v.second > 0) ? m_AssertionID : nullptr;
             }
             const XMLCh* getID() const {
                 return getAssertionID();
             }
+            void releaseDOM() const {
+                if (getDOM())
+                    getDOM()->removeAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME);
+                AbstractDOMCachingXMLObject::releaseDOM();
+            }
             IMPL_STRING_ATTRIB(Issuer);
             IMPL_DATETIME_ATTRIB(IssueInstant,0);
             IMPL_TYPED_CHILD(Conditions);
@@ -1054,28 +1067,33 @@ namespace opensaml {
             IMPL_TYPED_CHILDREN(AuthorizationDecisionStatement, m_pos_Signature);
 
         protected:
+            void prepareForMarshalling() const {
+                if (m_Signature)
+                    declareNonVisibleNamespaces();
+            }
+
             void marshallAttributes(DOMElement* domElement) const {
                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
-                domElement->setAttributeNS(NULL,MAJORVERSION,XML_ONE);
+                domElement->setAttributeNS(nullptr,MAJORVERSION,XML_ONE);
                 if (!m_MinorVersion)
                     const_cast<AssertionImpl*>(this)->m_MinorVersion=XMLString::replicate(XML_ONE);
-                MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
+                MARSHALL_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr);
                 if (!m_AssertionID)
                     const_cast<AssertionImpl*>(this)->m_AssertionID=SAMLConfig::getConfig().generateIdentifier();
-                domElement->setAttributeNS(NULL, ASSERTIONID_ATTRIB_NAME, m_AssertionID);
+                domElement->setAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME, m_AssertionID);
                 if (*m_MinorVersion!=chDigit_0) {
-#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE\r
-                    domElement->setIdAttributeNS(NULL, ASSERTIONID_ATTRIB_NAME, true);
-#else\r
-                    domElement->setIdAttributeNS(NULL, ASSERTIONID_ATTRIB_NAME);
+#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE
+                    domElement->setIdAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME, true);
+#else
+                    domElement->setIdAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME);
 #endif
                 }
-                MARSHALL_STRING_ATTRIB(Issuer,ISSUER,NULL);
+                MARSHALL_STRING_ATTRIB(Issuer,ISSUER,nullptr);
                 if (!m_IssueInstant) {
-                    const_cast<AssertionImpl*>(this)->m_IssueInstantEpoch=time(NULL);
+                    const_cast<AssertionImpl*>(this)->m_IssueInstantEpoch=time(nullptr);
                     const_cast<AssertionImpl*>(this)->m_IssueInstant=new DateTime(m_IssueInstantEpoch);
                 }
-                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
+                MARSHALL_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
             }
 
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
@@ -1094,24 +1112,24 @@ namespace opensaml {
                 // Standard processing, but then we check IDness.
                 AbstractXMLObjectUnmarshaller::unmarshallAttributes(domElement);
                 if (m_AssertionID && (!m_MinorVersion || *m_MinorVersion!=chDigit_0)) {
-#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE\r
-                    const_cast<DOMElement*>(domElement)->setIdAttributeNS(NULL, ASSERTIONID_ATTRIB_NAME, true);
-#else\r
-                    const_cast<DOMElement*>(domElement)->setIdAttributeNS(NULL, ASSERTIONID_ATTRIB_NAME);
+#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE
+                    const_cast<DOMElement*>(domElement)->setIdAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME, true);
+#else
+                    const_cast<DOMElement*>(domElement)->setIdAttributeNS(nullptr, ASSERTIONID_ATTRIB_NAME);
 #endif
                 }
             }
 
             void processAttribute(const DOMAttr* attribute) {
                 static const XMLCh MAJORVERSION[] = UNICODE_LITERAL_12(M,a,j,o,r,V,e,r,s,i,o,n);
-                if (XMLHelper::isNodeNamed(attribute,NULL,MAJORVERSION)) {
+                if (XMLHelper::isNodeNamed(attribute,nullptr,MAJORVERSION)) {
                     if (!XMLString::equals(attribute->getValue(),XML_ONE))
                         throw UnmarshallingException("Assertion has invalid major version.");
                 }
-                PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,NULL);
-                PROC_STRING_ATTRIB(AssertionID,ASSERTIONID,NULL);
-                PROC_STRING_ATTRIB(Issuer,ISSUER,NULL);
-                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,NULL);
+                PROC_INTEGER_ATTRIB(MinorVersion,MINORVERSION,nullptr);
+                PROC_STRING_ATTRIB(AssertionID,ASSERTIONID,nullptr);
+                PROC_STRING_ATTRIB(Issuer,ISSUER,nullptr);
+                PROC_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT,nullptr);
             }
         };