2021-10-18 13:22:02 +01:00
|
|
|
<?php
|
|
|
|
|
2021-12-26 09:48:16 +00:00
|
|
|
declare(strict_types = 1);
|
|
|
|
|
2021-10-18 13:22:02 +01:00
|
|
|
namespace Component\FreeNetwork\Util\WebfingerResource;
|
|
|
|
|
|
|
|
use App\Core\Event;
|
|
|
|
use App\Core\Log;
|
2022-03-27 16:43:59 +01:00
|
|
|
use App\Core\Router;
|
2021-10-18 13:22:02 +01:00
|
|
|
use App\Entity\Actor;
|
|
|
|
use App\Util\Common;
|
|
|
|
use Component\FreeNetwork\Exception\WebfingerReconstructionException;
|
|
|
|
use Component\FreeNetwork\Util\WebfingerResource;
|
|
|
|
use XML_XRD;
|
|
|
|
use XML_XRD_Element_Link;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* WebFinger resource for Profile objects
|
|
|
|
*
|
|
|
|
* @package GNUsocial
|
|
|
|
*
|
|
|
|
* @author Mikael Nordfeldth
|
|
|
|
* @author Diogo Peralta Cordeiro
|
|
|
|
* @copyright 2013, 2021 Free Software Foundation, Inc.
|
|
|
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
|
|
|
|
*/
|
|
|
|
class WebfingerResourceActor extends WebFingerResource
|
|
|
|
{
|
2021-12-26 09:48:16 +00:00
|
|
|
public const PROFILEPAGE = 'http://webfinger.net/rel/profile-page';
|
2021-10-18 13:22:02 +01:00
|
|
|
|
2021-12-26 09:48:16 +00:00
|
|
|
public function __construct(?Actor $object = null)
|
2021-10-18 13:22:02 +01:00
|
|
|
{
|
|
|
|
// The type argument above verifies that it's our class
|
|
|
|
parent::__construct($object);
|
|
|
|
}
|
|
|
|
|
2021-12-04 19:52:14 +00:00
|
|
|
public function getAliases(): array
|
2021-10-18 13:22:02 +01:00
|
|
|
{
|
|
|
|
$aliases = [];
|
|
|
|
|
|
|
|
try {
|
|
|
|
// Try to create an acct: URI if we're dealing with a profile
|
|
|
|
$aliases[] = $this->reconstructAcct();
|
|
|
|
} catch (WebFingerReconstructionException $e) {
|
|
|
|
Log::debug("WebFinger reconstruction for Profile failed (id={$this->object->getID()})");
|
|
|
|
}
|
|
|
|
|
|
|
|
return array_merge($aliases, parent::getAliases());
|
|
|
|
}
|
|
|
|
|
2021-12-04 19:52:14 +00:00
|
|
|
/**
|
|
|
|
* Reconstruct WebFinger acct: from object
|
|
|
|
*
|
|
|
|
* @throws WebfingerReconstructionException
|
2021-12-26 09:48:16 +00:00
|
|
|
*
|
|
|
|
* @return null|array|false|mixed|string|string[]
|
2021-12-04 19:52:14 +00:00
|
|
|
*/
|
2021-10-18 13:22:02 +01:00
|
|
|
public function reconstructAcct()
|
|
|
|
{
|
|
|
|
$acct = null;
|
|
|
|
|
|
|
|
if (Event::handle('StartWebFingerReconstruction', [$this->object, &$acct])) {
|
|
|
|
// TODO: getUri may not always give us the correct host on remote users?
|
2021-12-26 09:48:16 +00:00
|
|
|
$host = parse_url($this->object->getUri(Router::ABSOLUTE_URL), \PHP_URL_HOST);
|
2021-10-18 13:22:02 +01:00
|
|
|
if (empty($this->object->getNickname()) || empty($host)) {
|
|
|
|
throw new WebFingerReconstructionException(print_r($this->object, true));
|
|
|
|
}
|
|
|
|
$acct = mb_strtolower(sprintf('acct:%s@%s', $this->object->getNickname(), $host));
|
|
|
|
|
|
|
|
Event::handle('EndWebFingerReconstruction', [$this->object, &$acct]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $acct;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function updateXRD(XML_XRD $xrd)
|
|
|
|
{
|
|
|
|
if (Event::handle('StartWebFingerProfileLinks', [$xrd, $this->object])) {
|
|
|
|
|
|
|
|
// Profile page, can give more metadata from Link header or HTML parsing
|
2021-12-26 09:48:16 +00:00
|
|
|
$xrd->links[] = new XML_XRD_Element_Link(
|
|
|
|
self::PROFILEPAGE,
|
|
|
|
$this->object->getUrl(Router::ABSOLUTE_URL),
|
|
|
|
'text/html',
|
|
|
|
);
|
2021-10-18 13:22:02 +01:00
|
|
|
|
|
|
|
// // 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',
|
|
|
|
// ['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',
|
|
|
|
// ['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',
|
|
|
|
// ['nickname' => $this->object->getNickname()]),
|
|
|
|
// 'application/rdf+xml');
|
|
|
|
// }
|
|
|
|
|
|
|
|
Event::handle('EndWebFingerProfileLinks', [$xrd, $this->object]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|