Skip to content
Snippets Groups Projects
Commit ffce79e8 authored by Jaime Perez's avatar Jaime Perez
Browse files

Fix a bug introduced in 6a614913 that made it impossible for nested...

Fix a bug introduced in 6a614913 that made it impossible for nested EntitiesDescriptor elements to be parsed due to name spaces lost in the process.
parent ad3eff6d
No related branches found
No related tags found
No related merge requests found
...@@ -206,27 +206,25 @@ class sspmod_metarefresh_MetaLoader { ...@@ -206,27 +206,25 @@ class sspmod_metarefresh_MetaLoader {
/** /**
* Parse XML metadata and return entities * Recursively load all EntityDescriptor elements inside an EntitiesDescriptor or nested EntitiesDescriptor
* elements. This function fails gracefully when one entity cannot be parsed, and tries to continue processing.
*
* @param DOMElement $root The root DOMElement to start loading from.
*
* @return array The array of entities loaded from the root element.
*/ */
private function loadXML($data, $source) { private function recursiveLoadXML(DOMElement $root) {
$entities = array(); $entities = array();
$doc = new DOMDocument(); if (SimpleSAML_Utilities::isDOMElementOfType($root, 'EntitiesDescriptor', '@md') === TRUE) {
$res = $doc->loadXML($data); foreach (SAML2_Utils::xpQuery($root,
if($res !== TRUE) { './saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $element)
throw new Exception('Failed to read XML from ' . $source['src']); {
} if ($element->localName === 'EntityDescriptor') {
if($doc->documentElement === NULL) throw new Exception('Opened file is not an XML document: ' . $source['src']);
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 { try {
$entities = array_merge($entities, $entities = array_merge($entities,
SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($node)); SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($element));
} catch (Exception $e) { } catch (Exception $e) {
$entityID = $node->getAttribute('entityID'); $entityID = $element->getAttribute('entityID');
if (empty($entityID)) { if (empty($entityID)) {
$entityID = "unknown"; $entityID = "unknown";
} }
...@@ -234,17 +232,32 @@ class sspmod_metarefresh_MetaLoader { ...@@ -234,17 +232,32 @@ class sspmod_metarefresh_MetaLoader {
$e->getMessage()); $e->getMessage());
} }
} else { } else {
$entities = array_merge($entities, $this->loadXML($node->ownerDocument->saveXML($node), $source)); $entities = array_merge($entities, $this->recursiveLoadXML($element));
} }
} }
} else { } else {
$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($doc->documentElement); $entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($root);
} }
return $entities; return $entities;
} }
/**
* Parse XML metadata and return entities
*/
private function loadXML($data, $source) {
$doc = new DOMDocument();
$res = $doc->loadXML($data);
if($res !== TRUE) {
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']);
return $this->recursiveLoadXML($doc->documentElement);
}
/** /**
* This function writes the state array back to disk * This function writes the state array back to disk
*/ */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment