From 06bc985072e696b9391ef3ce2af9855fabe25351 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 15 Jun 2024 22:32:23 +0000 Subject: [PATCH] Add nodeinfo 2.1 and 2.2 --- src/Module/NodeInfo120.php | 2 +- src/Module/NodeInfo121.php | 87 +++++++++++++++++++++++++++++ src/Module/NodeInfo122.php | 91 +++++++++++++++++++++++++++++++ src/Module/NodeInfo210.php | 2 +- src/Module/WellKnown/NodeInfo.php | 21 +++++-- static/routes.config.php | 3 + 6 files changed, 199 insertions(+), 7 deletions(-) create mode 100644 src/Module/NodeInfo121.php create mode 100644 src/Module/NodeInfo122.php diff --git a/src/Module/NodeInfo120.php b/src/Module/NodeInfo120.php index efd6943f7d..237d0d6bc5 100644 --- a/src/Module/NodeInfo120.php +++ b/src/Module/NodeInfo120.php @@ -56,8 +56,8 @@ class NodeInfo120 extends BaseModule ], 'protocols' => ['dfrn', 'activitypub'], 'services' => Nodeinfo::getServices(), - 'usage' => Nodeinfo::getUsage(), 'openRegistrations' => Register::getPolicy() !== Register::CLOSED, + 'usage' => Nodeinfo::getUsage(), 'metadata' => [ 'nodeName' => $this->config->get('config', 'sitename'), ], diff --git a/src/Module/NodeInfo121.php b/src/Module/NodeInfo121.php new file mode 100644 index 0000000000..731699e38e --- /dev/null +++ b/src/Module/NodeInfo121.php @@ -0,0 +1,87 @@ +. + * + */ + +namespace Friendica\Module; + +use Friendica\App; +use Friendica\BaseModule; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; +use Friendica\Model\Nodeinfo; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; + +/** + * Version 2.1 of Nodeinfo, a standardized way of exposing metadata about a server running one of the distributed social networks. + * @see https://github.com/jhass/nodeinfo/blob/master/PROTOCOL.md + */ +class NodeInfo121 extends BaseModule +{ + /** @var IManageConfigValues */ + protected $config; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IManageConfigValues $config, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->config = $config; + } + + protected function rawContent(array $request = []) + { + $nodeinfo = [ + 'version' => '2.1', + 'software' => [ + 'name' => 'friendica', + 'version' => App::VERSION . '-' . DB_UPDATE_VERSION, + 'repository' => 'https://github.com/friendica/friendica', + 'homepage' => 'https://friendi.ca', + ], + 'protocols' => ['dfrn', 'activitypub'], + 'services' => Nodeinfo::getServices(), + 'openRegistrations' => Register::getPolicy() !== Register::CLOSED, + 'usage' => Nodeinfo::getUsage(), + 'metadata' => [], + ]; + + if (!empty($this->config->get('system', 'diaspora_enabled'))) { + $nodeinfo['protocols'][] = 'diaspora'; + } + + if (empty($this->config->get('system', 'ostatus_disabled'))) { + $nodeinfo['protocols'][] = 'ostatus'; + } + + $nodeinfo['services']['inbound'][] = 'atom1.0'; + $nodeinfo['services']['inbound'][] = 'rss2.0'; + $nodeinfo['services']['outbound'][] = 'atom1.0'; + + if (function_exists('imap_open') && !$this->config->get('system', 'imap_disabled')) { + $nodeinfo['services']['inbound'][] = 'imap'; + } + + $nodeinfo['metadata']['explicitContent'] = $this->config->get('system', 'explicit_content', false) == true; + + $this->response->setType(ICanCreateResponses::TYPE_JSON, 'application/json; charset=utf-8'); + $this->response->addContent(json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } +} diff --git a/src/Module/NodeInfo122.php b/src/Module/NodeInfo122.php new file mode 100644 index 0000000000..8ec45af01e --- /dev/null +++ b/src/Module/NodeInfo122.php @@ -0,0 +1,91 @@ +. + * + */ + +namespace Friendica\Module; + +use Friendica\App; +use Friendica\BaseModule; +use Friendica\Capabilities\ICanCreateResponses; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; +use Friendica\Model\Nodeinfo; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; + +/** + * Version 2.2 of Nodeinfo, a standardized way of exposing metadata about a server running one of the distributed social networks. + * @see https://github.com/jhass/nodeinfo/blob/master/PROTOCOL.md + */ +class NodeInfo122 extends BaseModule +{ + /** @var IManageConfigValues */ + protected $config; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IManageConfigValues $config, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->config = $config; + } + + protected function rawContent(array $request = []) + { + $nodeinfo = [ + 'version' => '2.2', + 'instance' => [ + 'name' => $this->config->get('config', 'sitename'), + 'description' => $this->config->get('config', 'info'), + ], + 'software' => [ + 'name' => 'friendica', + 'version' => App::VERSION . '-' . DB_UPDATE_VERSION, + 'repository' => 'https://github.com/friendica/friendica', + 'homepage' => 'https://friendi.ca', + ], + 'protocols' => ['dfrn', 'activitypub'], + 'services' => Nodeinfo::getServices(), + 'openRegistrations' => Register::getPolicy() !== Register::CLOSED, + 'usage' => Nodeinfo::getUsage(), + 'metadata' => [], + ]; + + if (!empty($this->config->get('system', 'diaspora_enabled'))) { + $nodeinfo['protocols'][] = 'diaspora'; + } + + if (empty($this->config->get('system', 'ostatus_disabled'))) { + $nodeinfo['protocols'][] = 'ostatus'; + } + + $nodeinfo['services']['inbound'][] = 'atom1.0'; + $nodeinfo['services']['inbound'][] = 'rss2.0'; + $nodeinfo['services']['outbound'][] = 'atom1.0'; + + if (function_exists('imap_open') && !$this->config->get('system', 'imap_disabled')) { + $nodeinfo['services']['inbound'][] = 'imap'; + } + + $nodeinfo['metadata']['explicitContent'] = $this->config->get('system', 'explicit_content', false) == true; + + $this->response->setType(ICanCreateResponses::TYPE_JSON, 'application/json; charset=utf-8'); + $this->response->addContent(json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } +} diff --git a/src/Module/NodeInfo210.php b/src/Module/NodeInfo210.php index ff22adf398..fdfe4ed5cf 100644 --- a/src/Module/NodeInfo210.php +++ b/src/Module/NodeInfo210.php @@ -32,7 +32,7 @@ use Psr\Log\LoggerInterface; /** * Version 1.0 of Nodeinfo 2, a sStandardized way of exposing metadata about a server running one of the distributed social networks. - * @see https://github.com/jhass/nodeinfo/blob/master/PROTOCOL.md + * @see https://github.com/jaywink/nodeinfo2/blob/master/PROTOCOL.md */ class NodeInfo210 extends BaseModule { diff --git a/src/Module/WellKnown/NodeInfo.php b/src/Module/WellKnown/NodeInfo.php index 816aa9c20e..129c8c77b4 100644 --- a/src/Module/WellKnown/NodeInfo.php +++ b/src/Module/WellKnown/NodeInfo.php @@ -22,7 +22,6 @@ namespace Friendica\Module\WellKnown; use Friendica\BaseModule; -use Friendica\Core\System; use Friendica\DI; /** @@ -35,10 +34,22 @@ class NodeInfo extends BaseModule { $nodeinfo = [ 'links' => [ - ['rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0', - 'href' => DI::baseUrl() . '/nodeinfo/1.0'], - ['rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0', - 'href' => DI::baseUrl() . '/nodeinfo/2.0'], + [ + 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0', + 'href' => DI::baseUrl() . '/nodeinfo/1.0' + ], + [ + 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0', + 'href' => DI::baseUrl() . '/nodeinfo/2.0' + ], + [ + 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.1', + 'href' => DI::baseUrl() . '/nodeinfo/2.1' + ], + [ + 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.2', + 'href' => DI::baseUrl() . '/nodeinfo/2.2' + ], ] ]; diff --git a/static/routes.config.php b/static/routes.config.php index dfd414c444..181ba4d77b 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -525,6 +525,9 @@ return [ '/newmember' => [Module\Welcome::class, [R::GET]], '/nodeinfo/1.0' => [Module\NodeInfo110::class, [R::GET]], '/nodeinfo/2.0' => [Module\NodeInfo120::class, [R::GET]], + '/nodeinfo/2.0.json' => [Module\NodeInfo120::class, [R::GET]], + '/nodeinfo/2.1' => [Module\NodeInfo121::class, [R::GET]], + '/nodeinfo/2.2' => [Module\NodeInfo122::class, [R::GET]], '/nocircle' => [Module\Circle::class, [R::GET]], '/noscrape' => [