diff --git a/modules/metarefresh/lib/MetaLoader.php b/modules/metarefresh/lib/MetaLoader.php index 815da5359c5318ccc585e1922b7f41408aae1283..2d99ea73f75a48ad0863d795a81ab56efd4b8089 100644 --- a/modules/metarefresh/lib/MetaLoader.php +++ b/modules/metarefresh/lib/MetaLoader.php @@ -206,25 +206,27 @@ class sspmod_metarefresh_MetaLoader { /** - * 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. + * Parse XML metadata and return entities */ - private function recursiveLoadXML(DOMElement $root) { + private function loadXML($data, $source) { $entities = array(); - if (SimpleSAML_Utilities::isDOMElementOfType($root, 'EntitiesDescriptor', '@md') === TRUE) { - foreach (SAML2_Utils::xpQuery($root, - './saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $element) - { - if ($element->localName === 'EntityDescriptor') { + $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']); + + 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($element)); + SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($node)); } catch (Exception $e) { - $entityID = $element->getAttribute('entityID'); + $entityID = $node->getAttribute('entityID'); if (empty($entityID)) { $entityID = "unknown"; } @@ -232,32 +234,17 @@ class sspmod_metarefresh_MetaLoader { $e->getMessage()); } } else { - $entities = array_merge($entities, $this->recursiveLoadXML($element)); + $entities = array_merge($entities, $this->loadXML($node->ownerDocument->saveXML($node), $source)); } } } else { - $entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($root); + $entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsElement($doc->documentElement); } 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 */