federator/php/federator/api/wellknown/webfinger.php
2025-04-30 22:49:20 +02:00

73 lines
1.9 KiB
PHP

<?php
/**
* SPDX-FileCopyrightText: 2024 Sascha Nitsch (grumpydeveloper) https://contentnation.net/@grumpydevelop
* SPDX-License-Identifier: GPL-3.0-or-later
*
* @author Sascha Nitsch (grumpydeveloper)
**/
namespace Federator\Api\WellKnown;
class WebFinger
{
/**
* parent instance
*
* @var \Federator\Api\WellKnown $wellKnown
*/
private $wellKnown;
/**
* main instance
*
* @var \Federator\Main $main
*/
private $main;
/**
* constructor
*
* @param \Federator\Api\WellKnown $wellKnown parent instance
* @param \Federator\Main $main main instance
* @return void
*/
public function __construct($wellKnown, $main)
{
$this->wellKnown = $wellKnown;
$this->main = $main;
}
/**
* handle webfinger request
*
* @return bool true on success
*/
public function exec()
{
$_resource = $this->main->extractFromURI('resource');
$matches = [];
$config = $this->main->getConfig();
$domain = $config['generic']['externaldomain'];
if (preg_match("/^acct:([^@]+)@(.*)$/", $_resource, $matches) != 1 || $matches[2] !== $domain) {
throw new \Federator\Exceptions\InvalidArgument();
}
$domain = $matches[2];
$user = \Federator\DIO\User::getUserByName(
$this->main->getDatabase(),
$matches[1],
$this->main->getConnector(),
$this->main->getCache()
);
if ($user->id == 0) {
echo "not found";
throw new \Federator\Exceptions\FileNotFound();
}
$data = [
'username' => $user->id,
'domain' => $domain,
];
$response = $this->main->renderTemplate('webfinger_acct.json', $data);
$this->wellKnown->setResponse($response);
return true;
}
}