123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <?php
- declare(strict_types = 1);
- namespace Component\FreeNetwork\Util\WebfingerResource;
- use App\Core\Event;
- use App\Core\Log;
- use App\Core\Router\Router;
- 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
- {
- public const PROFILEPAGE = 'http://webfinger.net/rel/profile-page';
- public function __construct(?Actor $object = null)
- {
- // The type argument above verifies that it's our class
- parent::__construct($object);
- }
- public function getAliases(): array
- {
- $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());
- }
- /**
- * Reconstruct WebFinger acct: from object
- *
- * @throws WebfingerReconstructionException
- *
- * @return null|array|false|mixed|string|string[]
- */
- 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?
- $host = parse_url($this->object->getUri(Router::ABSOLUTE_URL), \PHP_URL_HOST);
- 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
- $xrd->links[] = new XML_XRD_Element_Link(
- self::PROFILEPAGE,
- $this->object->getUrl(Router::ABSOLUTE_URL),
- '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',
- // ['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]);
- }
- }
- }
|