From ce445821164d3aa48ea8932eedf2c60d5876005c Mon Sep 17 00:00:00 2001
From: Jaime Perez Crespo <jaime.perez@uninett.no>
Date: Thu, 23 Apr 2015 15:11:26 +0200
Subject: [PATCH] Move SimpleSAML_Utilities::validateXML() to
 SimpleSAML\Utils\XML::isValid().

---
 lib/SimpleSAML/Utilities.php | 46 ++---------------------------
 lib/SimpleSAML/Utils/XML.php | 56 ++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 43 deletions(-)

diff --git a/lib/SimpleSAML/Utilities.php b/lib/SimpleSAML/Utilities.php
index c12c8aca5..0dc6bdf3b 100644
--- a/lib/SimpleSAML/Utilities.php
+++ b/lib/SimpleSAML/Utilities.php
@@ -311,51 +311,11 @@ class SimpleSAML_Utilities {
 
 
 	/**
-	 * This function attempts to validate an XML string against the specified schema.
-	 *
-	 * It will parse the string into a DOM document and validate this document against the schema.
-	 *
-	 * @param $xml     The XML string or document which should be validated.
-	 * @param $schema  The schema which should be used.
-	 * @return Returns a string with the errors if validation fails. An empty string is
-	 *         returned if validation passes.
-	 * @deprecated
+	 * @deprecated This method will be removed in SSP 2.0. Please use SimpleSAML\Utils\XML::isValid() instead.
 	 */
 	public static function validateXML($xml, $schema) {
-		assert('is_string($xml) || $xml instanceof DOMDocument');
-		assert('is_string($schema)');
-
-		SimpleSAML_XML_Errors::begin();
-
-		if($xml instanceof DOMDocument) {
-			$dom = $xml;
-			$res = TRUE;
-		} else {
-			$dom = new DOMDocument;
-			$res = $dom->loadXML($xml);
-		}
-
-		if($res) {
-
-			$config = SimpleSAML_Configuration::getInstance();
-			$schemaPath = $config->resolvePath('schemas') . '/';
-			$schemaFile = $schemaPath . $schema;
-
-			$res = $dom->schemaValidate($schemaFile);
-			if($res) {
-				SimpleSAML_XML_Errors::end();
-				return '';
-			}
-
-			$errorText = "Schema validation failed on XML string:\n";
-		} else {
-			$errorText = "Failed to parse XML string for schema validation:\n";
-		}
-
-		$errors = SimpleSAML_XML_Errors::end();
-		$errorText .= SimpleSAML_XML_Errors::formatErrors($errors);
-
-		return $errorText;
+		$result = \SimpleSAML\Utils\XML::isValid($xml, $schema);
+		return ($result === true) ? '' : $result;
 	}
 
 
diff --git a/lib/SimpleSAML/Utils/XML.php b/lib/SimpleSAML/Utils/XML.php
index f594752d5..72ddbcf85 100644
--- a/lib/SimpleSAML/Utils/XML.php
+++ b/lib/SimpleSAML/Utils/XML.php
@@ -271,6 +271,7 @@ class XML
      *
      * @return boolean True if both namespace and local name matches, false otherwise.
      * @throws \SimpleSAML_Error_Exception If the namespace shortcut is unknown.
+     *
      * @author Andreas Solberg, UNINETT AS <andreas.solberg@uninett.no>
      * @author Olav Morken, UNINETT AS <olav.morken@uninett.no>
      */
@@ -311,4 +312,59 @@ class XML
         }
         return true;
     }
+
+
+    /**
+     * This function attempts to validate an XML string against the specified schema. It will parse the string into a
+     * DOM document and validate this document against the schema.
+     *
+     * Note that this function returns values that are evaluated as a logical true, both when validation works and when
+     * it doesn't. Please use strict comparisons to check the values returned.
+     *
+     * @param string|\DOMDocument $xml The XML string or document which should be validated.
+     * @param string $schema The filename of the schema that should be used to validate the document.
+     *
+     * @return boolean|string Returns a string with errors found if validation fails. True if validation passes ok.
+     * @throws \InvalidArgumentException If $schema is not a string, or $xml is neither a string nor a \DOMDocument.
+     *
+     * @author Olav Morken, UNINETT AS <olav.morken@uninett.no>
+     */
+    public static function isValid($xml, $schema)
+    {
+        if (!(is_string($schema) && (is_string($xml) || $xml instanceof \DOMDocument))) {
+            throw new \InvalidArgumentException('Invalid input parameters.');
+        }
+
+        \SimpleSAML_XML_Errors::begin();
+
+        if ($xml instanceof \DOMDocument) {
+            $dom = $xml;
+            $res = true;
+        } else {
+            $dom = new \DOMDocument;
+            $res = $dom->loadXML($xml);
+        }
+
+        if ($res) {
+
+            $config = \SimpleSAML_Configuration::getInstance();
+            $schemaPath = $config->resolvePath('schemas').'/';
+            $schemaFile = $schemaPath.$schema;
+
+            $res = $dom->schemaValidate($schemaFile);
+            if ($res) {
+                \SimpleSAML_XML_Errors::end();
+                return true;
+            }
+
+            $errorText = "Schema validation failed on XML string:\n";
+        } else {
+            $errorText = "Failed to parse XML string for schema validation:\n";
+        }
+
+        $errors = \SimpleSAML_XML_Errors::end();
+        $errorText .= \SimpleSAML_XML_Errors::formatErrors($errors);
+
+        return $errorText;
+    }
 }
-- 
GitLab