This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
spip-saml/inc/simplesamlphp/lib/SAML2/XML/md/EndpointType.php

188 lines
4.4 KiB
PHP

<?php
/**
* Class representing SAML 2 EndpointType.
*
* @package simpleSAMLphp
* @version $Id$
*/
class SAML2_XML_md_EndpointType {
/**
* The binding for this endpoint.
*
* @var string
*/
public $Binding;
/**
* The URI to this endpoint.
*
* @var string
*/
public $Location;
/**
* The URI where responses can be delivered.
*
* @var string|NULL
*/
public $ResponseLocation = NULL;
/**
* Extra (namespace qualified) attributes.
*
* @var array
*/
private $attributes = array();
/**
* Initialize an EndpointType.
*
* @param DOMElement|NULL $xml The XML element we should load.
*/
public function __construct(DOMElement $xml = NULL) {
if ($xml === NULL) {
return;
}
if (!$xml->hasAttribute('Binding')) {
throw new Exception('Missing Binding on ' . $xml->tagName);
}
$this->Binding = $xml->getAttribute('Binding');
if (!$xml->hasAttribute('Location')) {
throw new Exception('Missing Location on ' . $xml->tagName);
}
$this->Location = $xml->getAttribute('Location');
if ($xml->hasAttribute('ResponseLocation')) {
$this->ResponseLocation = $xml->getAttribute('ResponseLocation');
}
foreach ($xml->attributes as $a) {
if ($a->namespaceURI === NULL) {
continue; /* Not namespace-qualified -- skip. */
}
$fullName = '{' . $a->namespaceURI . '}' . $a->localName;
$this->attributes[$fullName] = array(
'qualifiedName' => $a->nodeName,
'namespaceURI' => $a->namespaceURI,
'value' => $a->value,
);
}
}
/**
* Check if a namespace-qualified attribute exists.
*
* @param string $namespaceURI The namespace URI.
* @param string $localName The local name.
* @return boolean TRUE if the attribute exists, FALSE if not.
*/
public function hasAttributeNS($namespaceURI, $localName) {
assert('is_string($namespaceURI)');
assert('is_string($localName)');
$fullName = '{' . $namespaceURI . '}' . $localName;
return isset($this->attributes[$fullName]);
}
/**
* Get a namespace-qualified attribute.
*
* @param string $namespaceURI The namespace URI.
* @param string $localName The local name.
* @return string The value of the attribute, or an empty string if the attribute does not exist.
*/
public function getAttributeNS($namespaceURI, $localName) {
assert('is_string($namespaceURI)');
assert('is_string($localName)');
$fullName = '{' . $namespaceURI . '}' . $localName;
if (!isset($this->attributes[$fullName])) {
return '';
}
return $this->attributes[$fullName]['value'];
}
/**
* Get a namespace-qualified attribute.
*
* @param string $namespaceURI The namespace URI.
* @param string $qualifiedName The local name.
* @param string $value The attribute value.
*/
public function setAttributeNS($namespaceURI, $qualifiedName, $value) {
assert('is_string($namespaceURI)');
assert('is_string($qualifiedName)');
$name = explode(':', $qualifiedName, 2);
if (count($name) < 2) {
throw new Exception('Not a qualified name.');
}
$localName = $name[1];
$fullName = '{' . $namespaceURI . '}' . $localName;
$this->attributes[$fullName] = array(
'qualifiedName' => $qualifiedName,
'namespaceURI' => $namespaceURI,
'value' => $value,
);
}
/**
* Remove a namespace-qualified attribute.
*
* @param string $namespaceURI The namespace URI.
* @param string $localName The local name.
*/
public function removeAttributeNS($namespaceURI, $localName) {
assert('is_string($namespaceURI)');
assert('is_string($localName)');
$fullName = '{' . $namespaceURI . '}' . $localName;
unset($this->attributes[$fullName]);
}
/**
* Add this endpoint to an XML element.
*
* @param DOMElement $parent The element we should append this endpoint to.
* @param string $name The name of the element we should create.
*/
public function toXML(DOMElement $parent, $name) {
assert('is_string($name)');
assert('is_string($this->Binding)');
assert('is_string($this->Location)');
assert('is_null($this->ResponseLocation) || is_string($this->ResponseLocation)');
$e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, $name);
$parent->appendChild($e);
$e->setAttribute('Binding', $this->Binding);
$e->setAttribute('Location', $this->Location);
if (isset($this->ResponseLocation)) {
$e->setAttribute('ResponseLocation', $this->ResponseLocation);
}
foreach ($this->attributes as $a) {
$e->setAttributeNS($a['namespaceURI'], $a['qualifiedName'], $a['value']);
}
return $e;
}
}