From 8bf632d7b63971d792215d5180c2b12f7c0d1d76 Mon Sep 17 00:00:00 2001
From: Olav Morken <olav.morken@uninett.no>
Date: Thu, 6 Aug 2009 12:42:37 +0000
Subject: [PATCH] SAML2: Fix declaration of 'xs' namespace.

$document->importNode(...) "helpfully" optimizes away the namespace
declaration for the 'xs' namespace. Fix this by avoiding to use that
function.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@1636 44740490-163a-0410-bde0-09ae8108e29a
---
 lib/SAML2/Assertion.php          | 12 +++++++++---
 lib/SAML2/EncryptedAssertion.php | 12 +++++++++---
 lib/SAML2/Response.php           |  4 +---
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/lib/SAML2/Assertion.php b/lib/SAML2/Assertion.php
index 4cc24573c..be4b8ea35 100644
--- a/lib/SAML2/Assertion.php
+++ b/lib/SAML2/Assertion.php
@@ -879,14 +879,20 @@ class SAML2_Assertion implements SAML2_SignedElement {
 	/**
 	 * Convert this assertion to an XML element.
 	 *
+	 * @param DOMNode|NULL $parentElement  The DOM node the assertion should be created in.
 	 * @return DOMElement  This assertion.
 	 */
-	public function toXML() {
+	public function toXML(DOMNode $parentElement = NULL) {
 
-		$document = new DOMDocument();
+		if ($parentElement === NULL) {
+			$document = new DOMDocument();
+			$parentElement = $document;
+		} else {
+			$document = $parentElement->ownerDocument;
+		}
 
 		$root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'Assertion');
-		$document->appendChild($root);
+		$parentElement->appendChild($root);
 
 		/* Ugly hack to add another namespace declaration to the root element. */
 		$root->setAttributeNS(SAML2_Const::NS_SAMLP, 'samlp:tmp', 'tmp');
diff --git a/lib/SAML2/EncryptedAssertion.php b/lib/SAML2/EncryptedAssertion.php
index 5c22dfe37..af87ec8fb 100644
--- a/lib/SAML2/EncryptedAssertion.php
+++ b/lib/SAML2/EncryptedAssertion.php
@@ -143,14 +143,20 @@ class SAML2_EncryptedAssertion {
 	/**
 	 * Convert this encrypted assertion to an XML element.
 	 *
+	 * @param DOMNode|NULL $parentElement  The DOM node the assertion should be created in.
 	 * @return DOMElement  This encrypted assertion.
 	 */
-	public function toXML() {
+	public function toXML(DOMNode $parentElement = NULL) {
 
-		$document = new DOMDocument();
+		if ($parentElement === NULL) {
+			$document = new DOMDocument();
+			$parentElement = $document;
+		} else {
+			$document = $parentElement->ownerDocument;
+		}
 
 		$root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'EncryptedAssertion');
-		$document->appendChild($root);
+		$parentElement->appendChild($root);
 
 		$root->appendChild($document->importNode($this->encryptedData, TRUE));
 
diff --git a/lib/SAML2/Response.php b/lib/SAML2/Response.php
index d45c73f35..adae1fed0 100644
--- a/lib/SAML2/Response.php
+++ b/lib/SAML2/Response.php
@@ -73,9 +73,7 @@ class SAML2_Response extends SAML2_StatusResponse {
 		$root = parent::toUnsignedXML();
 
 		foreach ($this->assertions as $assertion) {
-			$node = $assertion->toXML();
-			$node = $root->ownerDocument->importNode($node, TRUE);
-			$root->appendChild($node);
+			$node = $assertion->toXML($root);
 		}
 
 		return $root;
-- 
GitLab