From e4b95abd66ec685079a700cd3716510635a4ec2d Mon Sep 17 00:00:00 2001
From: Olav Morken <olav.morken@uninett.no>
Date: Thu, 3 Nov 2011 12:41:48 +0000
Subject: [PATCH] SAML2_Utils: Change extractLocalizedStrings to take the
 namespaceURI and localname instead of an XPath query.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@2972 44740490-163a-0410-bde0-09ae8108e29a
---
 lib/SAML2/Utils.php                            | 16 +++++++++++-----
 lib/SAML2/XML/md/AttributeConsumingService.php |  4 ++--
 lib/SAML2/XML/md/Organization.php              |  6 +++---
 lib/SAML2/XML/mdrpi/PublicationInfo.php        |  3 +--
 4 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/lib/SAML2/Utils.php b/lib/SAML2/Utils.php
index 0e37acc71..ea5dd2cc8 100644
--- a/lib/SAML2/Utils.php
+++ b/lib/SAML2/Utils.php
@@ -434,15 +434,21 @@ class SAML2_Utils {
 	/**
 	 * Extract localized strings from a set of nodes.
 	 *
-	 * @param DOMElement $parent  The element we should rund the XPath query on.
-	 * @param string $query  The XPath query we should use to retrieve the nodes.
+	 * @param DOMElement $parent  The element that contains the localized strings.
+	 * @param string $namespaceURI  The namespace URI the localized strings should have.
+	 * @param string $localName  The localName of the localized strings.
 	 * @return array  Localized strings.
 	 */
-	public static function extractLocalizedStrings(DOMElement $parent, $query) {
-		assert('is_string($query)');
+	public static function extractLocalizedStrings(DOMElement $parent, $namespaceURI, $localName) {
+		assert('is_string($namespaceURI)');
+		assert('is_string($localName)');
 
 		$ret = array();
-		foreach (self::xpQuery($parent, $query) as $node) {
+		for ($node = $parent->firstChild; $node !== NULL; $node = $node->nextSibling) {
+			if ($node->namespaceURI !== $namespaceURI || $node->localName !== $localName) {
+				continue;
+			}
+
 			if ($node->hasAttribute('xml:lang')) {
 				$language = $node->getAttribute('xml:lang');
 			} else {
diff --git a/lib/SAML2/XML/md/AttributeConsumingService.php b/lib/SAML2/XML/md/AttributeConsumingService.php
index 3e0b6a3de..427fd2853 100644
--- a/lib/SAML2/XML/md/AttributeConsumingService.php
+++ b/lib/SAML2/XML/md/AttributeConsumingService.php
@@ -73,12 +73,12 @@ class SAML2_XML_md_AttributeConsumingService {
 
 		$this->isDefault = SAML2_Utils::parseBoolean($xml, 'isDefault', NULL);
 
-		$this->ServiceName = SAML2_Utils::extractLocalizedStrings($xml, './saml_metadata:ServiceName');
+		$this->ServiceName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'ServiceName');
 		if (empty($this->ServiceName)) {
 			throw new Exception('Missing ServiceName in AttributeConsumingService.');
 		}
 
-		$this->ServiceDescription = SAML2_Utils::extractLocalizedStrings($xml, './saml_metadata:ServiceDescription');
+		$this->ServiceDescription = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'ServiceDescription');
 
 		foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:RequestedAttribute') as $ra) {
 			$this->RequestedAttribute[] = new SAML2_XML_md_RequestedAttribute($ra);
diff --git a/lib/SAML2/XML/md/Organization.php b/lib/SAML2/XML/md/Organization.php
index 3869b042a..5ceaeed5b 100644
--- a/lib/SAML2/XML/md/Organization.php
+++ b/lib/SAML2/XML/md/Organization.php
@@ -56,17 +56,17 @@ class SAML2_XML_md_Organization {
 		$this->Extensions = SAML2_XML_md_Extensions::getList($xml);
 
 
-		$this->OrganizationName = SAML2_Utils::extractLocalizedStrings($xml, './saml_metadata:OrganizationName');
+		$this->OrganizationName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationName');
 		if (empty($this->OrganizationName)) {
 			$this->OrganizationName = array('invalid' => '');
 		}
 
-		$this->OrganizationDisplayName = SAML2_Utils::extractLocalizedStrings($xml, './saml_metadata:OrganizationDisplayName');
+		$this->OrganizationDisplayName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationDisplayName');
 		if (empty($this->OrganizationDisplayName)) {
 			$this->OrganizationDisplayName = array('invalid' => '');
 		}
 
-		$this->OrganizationURL = SAML2_Utils::extractLocalizedStrings($xml, './saml_metadata:OrganizationURL');
+		$this->OrganizationURL = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationURL');
 		if (empty($this->OrganizationURL)) {
 			$this->OrganizationURL = array('invalid' => '');
 		}
diff --git a/lib/SAML2/XML/mdrpi/PublicationInfo.php b/lib/SAML2/XML/mdrpi/PublicationInfo.php
index 3e1caeea8..bf6bff8d3 100644
--- a/lib/SAML2/XML/mdrpi/PublicationInfo.php
+++ b/lib/SAML2/XML/mdrpi/PublicationInfo.php
@@ -64,8 +64,7 @@ class SAML2_XML_mdrpi_PublicationInfo {
 			$this->publicationId = $xml->getAttribute('publicationId');
 		}
 
-		$query = './*[local-name()="UsagePolicy" and namespace-uri()="' . SAML2_XML_mdrpi_Common::NS_MDRPI . '"]';
-		$this->UsagePolicy = SAML2_Utils::extractLocalizedStrings($xml, $query);
+		$this->UsagePolicy = SAML2_Utils::extractLocalizedStrings($xml, SAML2_XML_mdrpi_Common::NS_MDRPI, 'UsagePolicy');
 	}
 
 
-- 
GitLab