From 6a61491389174b8797014428e2d92124cf61e8c4 Mon Sep 17 00:00:00 2001
From: Jaime Perez <jaime.perez@uninett.no>
Date: Fri, 20 Jun 2014 16:14:29 +0200
Subject: [PATCH] Fail gracefully while parsing EntitiesDescriptor in the
 metarefresh module. Now only the offending entity is disregarded. Fixes #70.

---
 modules/metarefresh/lib/MetaLoader.php | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/modules/metarefresh/lib/MetaLoader.php b/modules/metarefresh/lib/MetaLoader.php
index 051cf22bc..750bae677 100644
--- a/modules/metarefresh/lib/MetaLoader.php
+++ b/modules/metarefresh/lib/MetaLoader.php
@@ -217,7 +217,31 @@ class sspmod_metarefresh_MetaLoader {
 			throw new Exception('Failed to read XML from ' . $source['src']);
 		}
 		if($doc->documentElement ===  NULL) throw new Exception('Opened file is not an XML document: ' . $source['src']);
-		$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($doc->documentElement);
+
+		if (SimpleSAML_Utilities::isDOMElementOfType($doc->documentElement, 'EntitiesDescriptor', '@md') === TRUE) {
+			foreach (SAML2_Utils::xpQuery($doc->documentElement,
+				'./saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $node) {
+
+				if ($node->localName === 'EntityDescriptor') {
+					try {
+						$entities = array_merge($entities,
+							SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($node));
+					} catch (Exception $e) {
+						$entityID = $node->getAttribute('entityID');
+						if (empty($entityID)) {
+							$entityID = "unknown";
+						}
+						SimpleSAML_Logger::warning('[metarefresh]: Error while parsing entity ('.$entityID.'): '.
+							$e->getMessage());
+					}
+				} else {
+					$entities = array_merge($entities, $this->loadXML($node->ownerDocument->saveXML($node), $source));
+				}
+			}
+		} else {
+			$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($doc->documentElement);
+		}
+
 		return $entities;
 	}
 
-- 
GitLab