gnu-social/plugins/WebFinger/lib/webfingerresource/profile.php

105 lines
4.4 KiB
PHP

<?php
/**
* WebFinger resource for Profile objects
*
* @package GNUsocial
* @author Mikael Nordfeldth
* @copyright 2013 Free Software Foundation, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class WebFingerResource_Profile extends WebFingerResource
{
const PROFILEPAGE = 'http://webfinger.net/rel/profile-page';
public function __construct(Profile $object)
{
// The type argument above verifies that it's our class
parent::__construct($object);
}
public function getAliases()
{
$aliases = array();
// only persons ("accounts" or "agents" actually) have acct: URIs
if ($this->object->isPerson()) {
try {
// Try to create an acct: URI if we're dealing with a profile
$aliases[] = $this->reconstructAcct();
} catch (WebFingerReconstructionException $e) {
common_debug("WebFinger reconstruction for Profile failed (id={$this->object->getID()})");
}
}
return array_merge($aliases, parent::getAliases());
}
public function reconstructAcct()
{
$acct = null;
if (Event::handle('StartWebFingerReconstruction', array($this->object, &$acct))) {
// TODO: getUri may not always give us the correct host on remote users?
$host = parse_url($this->object->getUri(), PHP_URL_HOST);
if (empty($this->object->getNickname()) || empty($host)) {
throw new WebFingerReconstructionException($this->object);
}
$acct = mb_strtolower(sprintf('acct:%s@%s', $this->object->getNickname(), $host));
Event::handle('EndWebFingerReconstruction', array($this->object, &$acct));
}
return $acct;
}
public function updateXRD(XML_XRD $xrd)
{
if (Event::handle('StartWebFingerProfileLinks', array($xrd, $this->object))) {
if (common_config('site', 'fancy')) {
$apiRoot = common_path('api/', true);
} else {
$apiRoot = common_path('index.php/api/', true);
}
// Profile page, can give more metadata from Link header or HTML parsing
$xrd->links[] = new XML_XRD_Element_Link(self::PROFILEPAGE,
$this->object->getUrl(), 'text/html');
// XFN
$xrd->links[] = new XML_XRD_Element_Link('http://gmpg.org/xfn/11',
$this->object->getUrl(), 'text/html');
if ($this->object->isPerson()) {
// FOAF for user
$xrd->links[] = new XML_XRD_Element_Link('describedby',
common_local_url('foaf',
array('nickname' => $this->object->getNickname())),
'application/rdf+xml');
// nickname discovery for apps etc.
$link = new XML_XRD_Element_Link('http://apinamespace.org/atom',
common_local_url('ApiAtomService',
array('id' => $this->object->getNickname())),
'application/atomsvc+xml');
// XML_XRD must implement changing properties first $link['http://apinamespace.org/atom/username'] = $this->object->getNickname();
$xrd->links[] = clone $link;
$link = new XML_XRD_Element_Link('http://apinamespace.org/twitter', $apiRoot);
// XML_XRD must implement changing properties first $link['http://apinamespace.org/twitter/username'] = $this->object->getNickname();
$xrd->links[] = clone $link;
} elseif ($this->object->isGroup()) {
// FOAF for group
$xrd->links[] = new XML_XRD_Element_Link('describedby',
common_local_url('foafgroup',
array('nickname' => $this->object->getNickname())),
'application/rdf+xml');
}
Event::handle('EndWebFingerProfileLinks', array($xrd, $this->object));
}
}
}