Merge pull request #11210 from annando/detect-pumpio

Detect pump.io servers
This commit is contained in:
Hypolite Petovan 2022-02-05 10:20:30 -05:00 committed by GitHub
commit 321ad48649
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -67,6 +67,7 @@ class GServer
const DETECT_MASTODON_API = 16; const DETECT_MASTODON_API = 16;
const DETECT_STATUS_PHP = 17; // Nextcloud const DETECT_STATUS_PHP = 17; // Nextcloud
const DETECT_V1_CONFIG = 18; const DETECT_V1_CONFIG = 18;
const DETECT_PUMPIO = 19;
// Standardized endpoints // Standardized endpoints
const DETECT_STATISTICS_JSON = 100; const DETECT_STATISTICS_JSON = 100;
@ -468,6 +469,10 @@ class GServer
$serverdata = self::detectGNUSocial($url, $serverdata); $serverdata = self::detectGNUSocial($url, $serverdata);
} }
if (empty($serverdata['network'])) {
$serverdata = self::detectPumpIO($url, $serverdata);
}
$serverdata = array_merge($nodeinfo, $serverdata); $serverdata = array_merge($nodeinfo, $serverdata);
} else { } else {
$serverdata = $nodeinfo; $serverdata = $nodeinfo;
@ -1366,7 +1371,57 @@ class GServer
} }
return $val; return $val;
} }
/**
* Detect if the URL belongs to a pump.io server
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectPumpIO(string $url, array $serverdata)
{
$curlResult = DI::httpClient()->get($url . '/.well-known/host-meta.json');
if (!$curlResult->isSuccess()) {
return $serverdata;
}
$data = json_decode($curlResult->getBody(), true);
if (empty($data['links'])) {
return $serverdata;
}
// We are looking for some endpoints that are typical for pump.io
$trust = 0;
foreach ($data['links'] as $link) {
if (empty($link['rel'])) {
continue;
}
if (in_array($link['rel'], ['registration_endpoint', 'dialback', 'http://apinamespace.org/activitypub/whoami'])) {
++$trust;
}
}
if ($trust == 3) {
$serverdata['detection-method'] = self::DETECT_PUMPIO;
$serverdata['platform'] = 'pumpio';
$serverdata['version'] = '';
$serverdata['network'] = Protocol::PUMPIO;
$servers = $curlResult->getHeader('Server');
foreach ($servers as $server) {
if (preg_match("#pump.io/(.*)\s#U", $server, $matches)) {
$serverdata['version'] = $matches[1];
}
}
}
return $serverdata;
}
/** /**
* Detect if the URL belongs to a GNU Social server * Detect if the URL belongs to a GNU Social server