a0e107f17f
New plugins: * LRDD LRDD implements client-side RFC6415 and RFC7033 resource descriptor discovery procedures. I.e. LRDD, host-meta and WebFinger stuff. OStatus and OpenID now depend on the LRDD plugin (XML_XRD). * WebFinger This plugin implements the server-side of RFC6415 and RFC7033. Note: WebFinger technically doesn't handle XRD, but we serve both that and JRD (JSON Resource Descriptor), depending on Accept header and one ugly hack to check for old StatusNet installations. WebFinger depends on LRDD. We might make this even prettier by using Net_WebFinger, but it is not currently RFC7033 compliant (no /.well-known/webfinger resource GETs). Disabling the WebFinger plugin would effectively render your site non- federated (which might be desired on a private site). Disabling the LRDD plugin would make your site unable to do modern web URI lookups (making life just a little bit harder).
258 lines
6.6 KiB
PHP
258 lines
6.6 KiB
PHP
<?php
|
|
/**
|
|
* Part of XML_XRD
|
|
*
|
|
* PHP version 5
|
|
*
|
|
* @category XML
|
|
* @package XML_XRD
|
|
* @author Christian Weiske <cweiske@php.net>
|
|
* @license http://www.gnu.org/copyleft/lesser.html LGPL
|
|
* @link http://pear.php.net/package/XML_XRD
|
|
*/
|
|
|
|
require_once 'XML/XRD/PropertyAccess.php';
|
|
require_once 'XML/XRD/Element/Link.php';
|
|
require_once 'XML/XRD/Loader.php';
|
|
require_once 'XML/XRD/Serializer.php';
|
|
|
|
/**
|
|
* Main class used to load XRD documents from string or file.
|
|
*
|
|
* After loading the file, access to links is possible with get() and getAll(),
|
|
* as well as foreach-iterating over the XML_XRD object.
|
|
*
|
|
* Property access is possible with getProperties() and array access (foreach)
|
|
* on the XML_XRD object.
|
|
*
|
|
* Verification that the subject/aliases match the requested URL can be done with
|
|
* describes().
|
|
*
|
|
* @category XML
|
|
* @package XML_XRD
|
|
* @author Christian Weiske <cweiske@php.net>
|
|
* @license http://www.gnu.org/copyleft/lesser.html LGPL
|
|
* @version Release: @package_version@
|
|
* @link http://pear.php.net/package/XML_XRD
|
|
*/
|
|
class XML_XRD extends XML_XRD_PropertyAccess implements IteratorAggregate
|
|
{
|
|
/**
|
|
* XRD file/string loading dispatcher
|
|
*
|
|
* @var XML_XRD_Loader
|
|
*/
|
|
public $loader;
|
|
|
|
/**
|
|
* XRD serializing dispatcher
|
|
*
|
|
* @var XML_XRD_Serializer
|
|
*/
|
|
public $serializer;
|
|
|
|
/**
|
|
* XRD subject
|
|
*
|
|
* @var string
|
|
*/
|
|
public $subject;
|
|
|
|
/**
|
|
* Array of subject alias strings
|
|
*
|
|
* @var array
|
|
*/
|
|
public $aliases = array();
|
|
|
|
/**
|
|
* Array of link objects
|
|
*
|
|
* @var array
|
|
*/
|
|
public $links = array();
|
|
|
|
/**
|
|
* Unix timestamp when the document expires.
|
|
* NULL when no expiry date set.
|
|
*
|
|
* @var integer|null
|
|
*/
|
|
public $expires;
|
|
|
|
/**
|
|
* xml:id of the XRD document
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $id;
|
|
|
|
|
|
|
|
/**
|
|
* Loads the contents of the given file.
|
|
*
|
|
* Note: Only use file type auto-detection for local files.
|
|
* Do not use it on remote files as the file gets requested several times.
|
|
*
|
|
* @param string $file Path to an XRD file
|
|
* @param string $type File type: xml or json, NULL for auto-detection
|
|
*
|
|
* @return void
|
|
*
|
|
* @throws XML_XRD_Loader_Exception When the file is invalid or cannot be
|
|
* loaded
|
|
*/
|
|
public function loadFile($file, $type = null)
|
|
{
|
|
if (!isset($this->loader)) {
|
|
$this->loader = new XML_XRD_Loader($this);
|
|
}
|
|
return $this->loader->loadFile($file, $type);
|
|
}
|
|
|
|
/**
|
|
* Loads the contents of the given string
|
|
*
|
|
* @param string $str XRD string
|
|
* @param string $type File type: xml or json, NULL for auto-detection
|
|
*
|
|
* @return void
|
|
*
|
|
* @throws XML_XRD_Loader_Exception When the string is invalid or cannot be
|
|
* loaded
|
|
*/
|
|
public function loadString($str, $type = null)
|
|
{
|
|
if (!isset($this->loader)) {
|
|
$this->loader = new XML_XRD_Loader($this);
|
|
}
|
|
return $this->loader->loadString($str, $type);
|
|
}
|
|
|
|
/**
|
|
* Checks if the XRD document describes the given URI.
|
|
*
|
|
* This should always be used to make sure the XRD file
|
|
* is the correct one for e.g. the given host, and not a copycat.
|
|
*
|
|
* Checks against the subject and aliases
|
|
*
|
|
* @param string $uri An URI that the document is expected to describe
|
|
*
|
|
* @return boolean True or false
|
|
*/
|
|
public function describes($uri)
|
|
{
|
|
if ($this->subject == $uri) {
|
|
return true;
|
|
}
|
|
foreach ($this->aliases as $alias) {
|
|
if ($alias == $uri) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get the link with highest priority for the given relation and type.
|
|
*
|
|
* @param string $rel Relation name
|
|
* @param string $type MIME Type
|
|
* @param boolean $typeFallback When true and no link with the given type
|
|
* could be found, the best link without a
|
|
* type will be returned
|
|
*
|
|
* @return XML_XRD_Element_Link Link object or NULL if none found
|
|
*/
|
|
public function get($rel, $type = null, $typeFallback = true)
|
|
{
|
|
$links = $this->getAll($rel, $type, $typeFallback);
|
|
if (count($links) == 0) {
|
|
return null;
|
|
}
|
|
|
|
return $links[0];
|
|
}
|
|
|
|
|
|
/**
|
|
* Get all links with the given relation and type, highest priority first.
|
|
*
|
|
* @param string $rel Relation name
|
|
* @param string $type MIME Type
|
|
* @param boolean $typeFallback When true and no link with the given type
|
|
* could be found, the best link without a
|
|
* type will be returned
|
|
*
|
|
* @return array Array of XML_XRD_Element_Link objects
|
|
*/
|
|
public function getAll($rel, $type = null, $typeFallback = true)
|
|
{
|
|
$links = array();
|
|
$exactType = false;
|
|
foreach ($this->links as $link) {
|
|
if ($link->rel == $rel
|
|
&& ($type === null || $link->type == $type
|
|
|| $typeFallback && $link->type === null)
|
|
) {
|
|
$links[] = $link;
|
|
$exactType |= $typeFallback && $type !== null
|
|
&& $link->type == $type;
|
|
}
|
|
}
|
|
if ($exactType) {
|
|
//remove all links without type
|
|
$exactlinks = array();
|
|
foreach ($links as $link) {
|
|
if ($link->type !== null) {
|
|
$exactlinks[] = $link;
|
|
}
|
|
}
|
|
$links = $exactlinks;
|
|
}
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Return the iterator object to loop over the links
|
|
*
|
|
* Part of the IteratorAggregate interface
|
|
*
|
|
* @return Traversable Iterator for the links
|
|
*/
|
|
public function getIterator()
|
|
{
|
|
return new ArrayIterator($this->links);
|
|
}
|
|
|
|
/**
|
|
* Converts this XRD object to XML or JSON.
|
|
*
|
|
* @param string $type Serialization type: xml or json
|
|
*
|
|
* @return string Generated content
|
|
*/
|
|
public function to($type)
|
|
{
|
|
if (!isset($this->serializer)) {
|
|
$this->serializer = new XML_XRD_Serializer($this);
|
|
}
|
|
return $this->serializer->to($type);
|
|
}
|
|
|
|
/**
|
|
* Converts this XRD object to XML.
|
|
*
|
|
* @return string Generated XML
|
|
*
|
|
* @deprecated use to('xml')
|
|
*/
|
|
public function toXML()
|
|
{
|
|
return $this->to('xml');
|
|
}
|
|
}
|
|
?>
|