diff --git a/database.sql b/database.sql index 6d529e8fb4..0c96eadb0b 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2024.06-dev (Yellow Archangel) --- DB_UPDATE_VERSION 1561 +-- DB_UPDATE_VERSION 1562 -- ------------------------------------------ @@ -24,6 +24,7 @@ CREATE TABLE IF NOT EXISTS `gserver` ( `directory-type` tinyint DEFAULT 0 COMMENT 'Type of directory service (Poco, Mastodon)', `poco` varbinary(383) NOT NULL DEFAULT '' COMMENT '', `openwebauth` varbinary(383) COMMENT 'Path to the OpenWebAuth endpoint', + `authredirect` varbinary(383) COMMENT 'Path to the authRedirect endpoint', `noscrape` varbinary(383) NOT NULL DEFAULT '' COMMENT '', `network` char(4) NOT NULL DEFAULT '' COMMENT '', `protocol` tinyint unsigned COMMENT 'The protocol of the server', diff --git a/doc/database/db_gserver.md b/doc/database/db_gserver.md index 43cf4cb89a..238f053d5d 100644 --- a/doc/database/db_gserver.md +++ b/doc/database/db_gserver.md @@ -24,6 +24,7 @@ Fields | directory-type | Type of directory service (Poco, Mastodon) | tinyint | YES | | 0 | | | poco | | varbinary(383) | NO | | | | | openwebauth | Path to the OpenWebAuth endpoint | varbinary(383) | YES | | NULL | | +| authredirect | Path to the authRedirect endpoint | varbinary(383) | YES | | NULL | | | noscrape | | varbinary(383) | NO | | | | | network | | char(4) | NO | | | | | protocol | The protocol of the server | tinyint unsigned | YES | | NULL | | diff --git a/src/Model/GServer.php b/src/Model/GServer.php index 8eb49ad7dd..c09aed60bf 100644 --- a/src/Model/GServer.php +++ b/src/Model/GServer.php @@ -578,7 +578,7 @@ class GServer // We only follow redirects when the path stays the same or the target url has no path. // Some systems have got redirects on their landing page to a single account page. This check handles it. if (((parse_url($url, PHP_URL_HOST) != parse_url($valid_url, PHP_URL_HOST)) && (parse_url($url, PHP_URL_PATH) == parse_url($valid_url, PHP_URL_PATH))) || - (((parse_url($url, PHP_URL_HOST) != parse_url($valid_url, PHP_URL_HOST)) || (parse_url($url, PHP_URL_PATH) != parse_url($valid_url, PHP_URL_PATH))) && empty(parse_url($valid_url, PHP_URL_PATH)))) { + (((parse_url($url, PHP_URL_HOST) != parse_url($valid_url, PHP_URL_HOST)) || (parse_url($url, PHP_URL_PATH) != parse_url($valid_url, PHP_URL_PATH))) && empty(parse_url($valid_url, PHP_URL_PATH)))) { Logger::debug('Found redirect. Mark old entry as failure', ['old' => $url, 'new' => $valid_url]); self::setFailureByUrl($url); if (!self::getID($valid_url, true) && !Network::isUrlBlocked($valid_url)) { @@ -588,7 +588,7 @@ class GServer } if ((parse_url($url, PHP_URL_HOST) != parse_url($valid_url, PHP_URL_HOST)) && (parse_url($url, PHP_URL_PATH) != parse_url($valid_url, PHP_URL_PATH)) && - (parse_url($url, PHP_URL_PATH) == '')) { + (parse_url($url, PHP_URL_PATH) == '')) { Logger::debug('Found redirect. Mark old entry as failure and redirect to the basepath.', ['old' => $url, 'new' => $valid_url]); $parts = (array)parse_url($valid_url); unset($parts['path']); @@ -606,7 +606,7 @@ class GServer if ((parse_url($url, PHP_URL_HOST) == parse_url($valid_url, PHP_URL_HOST)) && (parse_url($url, PHP_URL_PATH) == parse_url($valid_url, PHP_URL_PATH)) && (parse_url($url, PHP_URL_SCHEME) != parse_url($valid_url, PHP_URL_SCHEME))) { - $url = $valid_url; + $url = $valid_url; } $in_webroot = empty(parse_url($url, PHP_URL_PATH)); @@ -737,6 +737,10 @@ class GServer } } + if (in_array($serverdata['platform'] ?? '', ['hubzilla', 'streams', 'osada', 'mistpark', 'roadhouse', 'zap'])) { + $serverdata = self::getZotData($url, $serverdata); + } + // When we hadn't been able to detect the network type, we use the hint from the parameter if (($serverdata['network'] == Protocol::PHANTOM) && !empty($network)) { $serverdata['network'] = $network; @@ -1623,6 +1627,80 @@ class GServer return $data ?? ''; } + private static function getZotData(string $url, array $serverdata): array + { + $curlResult = DI::httpClient()->get($url, 'application/x-zot+json'); + if (!$curlResult->isSuccess()) { + return $serverdata; + } + $json = $curlResult->getBodyString(); + $data = json_decode($json, true); + if (empty($data)) { + return $serverdata; + } + + if (!empty($data['site'])) { + $serverdata = self::getFromZotData($data['site'], $serverdata); + } else { + $serverdata = self::getFromZotData($data, $serverdata); + } + return $serverdata; + } + + private static function getFromZotData(array $data, array $serverdata): array + { + if (!empty($data['version'])) { + $serverdata['version'] = $data['version']; + } + + if (!empty($data['openWebAuth'])) { + $serverdata['openwebauth'] = $data['openWebAuth']; + } + + if (!empty($data['authRedirect'])) { + $serverdata['authredirect'] = $data['authRedirect']; + } + + if (!empty($data['sitename'])) { + $serverdata['site_name'] = $data['sitename']; + } + + if (!empty($data['about'])) { + $serverdata['info'] = $data['about']; + } + + if (empty($serverdata['info']) && !empty($data['location'])) { + $serverdata['info'] = $data['location']; + } + + if (!empty($data['project']) && in_array($data['project'], ['hubzilla', 'streams', 'osada', 'mistpark', 'roadhouse', 'zap'])) { + $serverdata['platform'] = $data['project']; + } + + if (!empty($data['accounts'])) { + $serverdata['registered-users'] = $data['accounts']; + } + + if (!empty($data['register_policy'])) { + switch ($data['register_policy']) { + case 'open': + $serverdata['register_policy'] = Register::OPEN; + break; + case 'closed': + $serverdata['register_policy'] = Register::CLOSED; + break; + case 'approve': + $serverdata['register_policy'] = Register::APPROVE; + break; + default: + echo $data['register_policy'] . "\n"; + break; + } + } + + return $serverdata; + } + /** * Checks if the server contains a valid host meta file * @@ -2105,7 +2183,7 @@ class GServer ($curlResult->getBodyString() != '') && (strlen($curlResult->getBodyString()) < 30)) { // Remove junk that some GNU Social servers return - $serverdata['version'] = str_replace(chr(239).chr(187).chr(191), '', $curlResult->getBodyString()); + $serverdata['version'] = str_replace(chr(239) . chr(187) . chr(191), '', $curlResult->getBodyString()); $serverdata['version'] = str_replace(["\r", "\n", "\t"], '', $serverdata['version']); $serverdata['version'] = trim($serverdata['version'], '"'); @@ -2192,7 +2270,7 @@ class GServer break; default: Logger::info('Register policy is invalid', ['policy' => $register_policy, 'server' => $url]); - $serverdata['register_policy'] = Register::CLOSED; + $serverdata['register_policy'] = Register::CLOSED; break; } diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index e733732f32..ec17f54eb0 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -56,7 +56,7 @@ use Friendica\Database\DBA; // This file is required several times during the test in DbaDefinition which justifies this condition if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1561); + define('DB_UPDATE_VERSION', 1562); } return [ @@ -80,6 +80,7 @@ return [ "directory-type" => ["type" => "tinyint", "default" => "0", "comment" => "Type of directory service (Poco, Mastodon)"], "poco" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""], "openwebauth" => ["type" => "varbinary(383)", "comment" => "Path to the OpenWebAuth endpoint"], + "authredirect" => ["type" => "varbinary(383)", "comment" => "Path to the authRedirect endpoint"], "noscrape" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""], "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""], "protocol" => ["type" => "tinyint unsigned", "comment" => "The protocol of the server"],