runff 1.0 commit
This commit is contained in:
77
lib/SimpleSAML/XML/Parser.php
Executable file
77
lib/SimpleSAML/XML/Parser.php
Executable file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file will help doing XPath queries in SAML 2 XML documents.
|
||||
*
|
||||
* @author Andreas Åkre Solberg, UNINETT AS. <andreas.solberg@uninett.no>
|
||||
* @package SimpleSAMLphp
|
||||
*/
|
||||
|
||||
namespace SimpleSAML\XML;
|
||||
|
||||
class Parser
|
||||
{
|
||||
public $simplexml = null;
|
||||
|
||||
public function __construct($xml)
|
||||
{
|
||||
;
|
||||
$this->simplexml = new \SimpleXMLElement($xml);
|
||||
$this->simplexml->registerXPathNamespace('saml2', 'urn:oasis:names:tc:SAML:2.0:assertion');
|
||||
$this->simplexml->registerXPathNamespace('saml2meta', 'urn:oasis:names:tc:SAML:2.0:metadata');
|
||||
$this->simplexml->registerXPathNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
|
||||
}
|
||||
|
||||
public static function fromSimpleXMLElement(\SimpleXMLElement $element)
|
||||
{
|
||||
|
||||
// Traverse all existing namespaces in element
|
||||
$namespaces = $element->getNamespaces();
|
||||
foreach ($namespaces as $prefix => $ns) {
|
||||
$element[(($prefix === '') ? 'xmlns' : 'xmlns:' . $prefix)] = $ns;
|
||||
}
|
||||
|
||||
/* Create a new parser with the xml document where the namespace definitions
|
||||
* are added.
|
||||
*/
|
||||
$parser = new Parser($element->asXML());
|
||||
return $parser;
|
||||
}
|
||||
|
||||
public function getValueDefault($xpath, $defvalue)
|
||||
{
|
||||
try {
|
||||
return $this->getValue($xpath, true);
|
||||
} catch (\Exception $e) {
|
||||
return $defvalue;
|
||||
}
|
||||
}
|
||||
|
||||
public function getValue($xpath, $required = false)
|
||||
{
|
||||
$result = $this->simplexml->xpath($xpath);
|
||||
if (!is_array($result) || empty($result)) {
|
||||
if ($required) {
|
||||
throw new \Exception('Could not get value from XML document using the following XPath expression: ' . $xpath);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return (string) $result[0];
|
||||
}
|
||||
|
||||
public function getValueAlternatives(array $xpath, $required = false)
|
||||
{
|
||||
foreach ($xpath as $x) {
|
||||
$seek = $this->getValue($x);
|
||||
if ($seek) {
|
||||
return $seek;
|
||||
}
|
||||
}
|
||||
if ($required) {
|
||||
throw new \Exception('Could not get value from XML document using multiple alternative XPath expressions.');
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user