// 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)) {
}
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']);
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));
}
}
+ 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;
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
*
($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'], '"');
break;
default:
Logger::info('Register policy is invalid', ['policy' => $register_policy, 'server' => $url]);
- $serverdata['register_policy'] = Register::CLOSED;
+ $serverdata['register_policy'] = Register::CLOSED;
break;
}
// 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 [
"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"],