Merge pull request #11214 from annando/platform-cleaning

Follow-up for PR #11213 - Improved server probing
This commit is contained in:
Philipp 2022-02-06 17:20:32 +01:00 committed by GitHub
commit 00c23ad5d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 40 deletions

View File

@ -496,17 +496,17 @@ class GServer
$serverdata['url'] = $url;
$serverdata['nurl'] = Strings::normaliseLink($url);
// We take the highest number that we do find
$registeredUsers = $serverdata['registered-users'] ?? 0;
// On an active server there has to be at least a single user
if (($serverdata['network'] != Protocol::PHANTOM) && ($registeredUsers == 0)) {
$registeredUsers = 1;
if (in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED])) {
$serverdata = self::detectNetworkViaContacts($url, $serverdata);
}
if ($serverdata['network'] == Protocol::PHANTOM) {
$serverdata['registered-users'] = max($registeredUsers, 1);
$serverdata = self::detectNetworkViaContacts($url, $serverdata);
$serverdata['registered-users'] = $serverdata['registered-users'] ?? 0;
// On an active server there has to be at least a single user
if (!in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED]) && ($serverdata['registered-users'] == 0)) {
$serverdata['registered-users'] = 1;
} elseif (in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED])) {
$serverdata['registered-users'] = 0;
}
$serverdata['next_contact'] = self::getNextUpdateDate(true);
@ -520,11 +520,6 @@ class GServer
$ret = DBA::insert('gserver', $serverdata);
$id = DBA::lastInsertId();
} else {
// Don't override the network with 'unknown' when there had been a valid entry before
if (($serverdata['network'] == Protocol::PHANTOM) && !empty($gserver['network'])) {
unset($serverdata['network']);
}
$ret = DBA::update('gserver', $serverdata, ['nurl' => $serverdata['nurl']]);
$gserver = DBA::selectFirst('gserver', ['id'], ['nurl' => $serverdata['nurl']]);
if (DBA::isResult($gserver)) {
@ -532,11 +527,12 @@ class GServer
}
}
if (!empty($serverdata['network']) && !empty($id) && ($serverdata['network'] != Protocol::PHANTOM)) {
// Count the number of known contacts from this server
if (!empty($id) && !in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED])) {
$apcontacts = DBA::count('apcontact', ['gsid' => $id]);
$contacts = DBA::count('contact', ['uid' => 0, 'gsid' => $id]);
$max_users = max($apcontacts, $contacts, $registeredUsers, 1);
if ($max_users > $registeredUsers) {
$contacts = DBA::count('contact', ['uid' => 0, 'gsid' => $id, 'failed' => false]);
$max_users = max($apcontacts, $contacts);
if ($max_users > $serverdata['registered-users']) {
Logger::info('Update registered users', ['id' => $id, 'url' => $serverdata['nurl'], 'registered-users' => $max_users]);
DBA::update('gserver', ['registered-users' => $max_users], ['id' => $id]);
}
@ -1054,16 +1050,18 @@ class GServer
return $serverdata;
}
$time = time();
foreach ($contacts as $contact) {
$probed = Contact::getByURL($contact);
if (!empty($probed) && in_array($probed['network'], Protocol::FEDERATED)) {
$probed = Contact::getByURL($contact, true);
if (!empty($probed) && !$probed['failed'] && in_array($probed['network'], Protocol::FEDERATED)) {
$serverdata['network'] = $probed['network'];
break;
} elseif ((time() - $time) > 10) {
// To reduce the stress on remote systems we probe a maximum of 10 seconds
break;
}
}
$serverdata['registered-users'] = max($serverdata['registered-users'], count($contacts), 1);
return $serverdata;
}
@ -1568,7 +1566,7 @@ class GServer
// Using only body information we cannot safely detect a lot of systems.
// So we define a list of platforms that we can detect safely.
$valid_platforms = ['friendica', 'friendika', 'hubzilla', 'misskey', 'peertube', 'wordpress', 'write.as'];
$valid_platforms = ['friendica', 'friendika', 'diaspora', 'mastodon', 'hubzilla', 'misskey', 'peertube', 'wordpress', 'write.as'];
$doc = new DOMDocument();
@$doc->loadHTML($curlResult->getBody());
@ -1598,10 +1596,6 @@ class GServer
}
}
if (!in_array(strtolower($attr['content']), $valid_platforms)) {
continue;
}
if ($attr['name'] == 'description') {
$serverdata['info'] = $attr['content'];
}
@ -1623,11 +1617,8 @@ class GServer
$serverdata['version'] = $version_part[1];
// We still do need a reliable test if some AP plugin is activated
if (DBA::exists('apcontact', ['baseurl' => $url])) {
$serverdata['network'] = Protocol::ACTIVITYPUB;
} else {
$serverdata['network'] = Protocol::FEED;
}
// By now we just check in a later process for some known contacts
$serverdata['network'] = Protocol::FEED;
if ($serverdata['detection-method'] == self::DETECT_MANUAL) {
$serverdata['detection-method'] = self::DETECT_BODY;
@ -1661,10 +1652,6 @@ class GServer
}
}
if (!in_array(strtolower($attr['content']), $valid_platforms)) {
continue;
}
if ($attr['property'] == 'og:site_name') {
$serverdata['site_name'] = $attr['content'];
}
@ -1691,7 +1678,11 @@ class GServer
}
}
if (!empty($serverdata['network']) && ($serverdata['detection-method'] == self::DETECT_MANUAL)) {
if (!empty($serverdata['platform']) && in_array($serverdata['detection-method'], [self::DETECT_MANUAL, self::DETECT_BODY]) && !in_array($serverdata['platform'], $valid_platforms)) {
$serverdata['network'] = Protocol::PHANTOM;
$serverdata['version'] = '';
$serverdata['detection-method'] = self::DETECT_MANUAL;
} elseif (!empty($serverdata['network']) && ($serverdata['detection-method'] == self::DETECT_MANUAL)) {
$serverdata['detection-method'] = self::DETECT_BODY;
}

View File

@ -21,6 +21,7 @@
namespace Friendica\Module\Admin;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
use Friendica\Database\DBA;
use Friendica\DI;
@ -72,15 +73,15 @@ class Federation extends BaseAdmin
$gservers = DBA::p("SELECT COUNT(*) AS `total`, SUM(`registered-users`) AS `users`, `platform`,
ANY_VALUE(`network`) AS `network`, MAX(`version`) AS `version`
FROM `gserver` WHERE NOT `failed` AND `detection-method` != ? GROUP BY `platform`", GServer::DETECT_MANUAL);
FROM `gserver` WHERE NOT `failed` AND `detection-method` != ? AND NOT `network` IN (?, ?) GROUP BY `platform`", GServer::DETECT_MANUAL, Protocol::PHANTOM, Protocol::FEED);
while ($gserver = DBA::fetch($gservers)) {
$total += $gserver['total'];
$users += $gserver['users'];
$versionCounts = [];
$versions = DBA::p("SELECT COUNT(*) AS `total`, `version` FROM `gserver`
WHERE NOT `failed` AND `platform` = ? AND `detection-method` != ?
GROUP BY `version` ORDER BY `version`", $gserver['platform'], GServer::DETECT_MANUAL);
WHERE NOT `failed` AND `platform` = ? AND `detection-method` != ? AND NOT `network` IN (?, ?)
GROUP BY `version` ORDER BY `version`", $gserver['platform'], GServer::DETECT_MANUAL, Protocol::PHANTOM, Protocol::FEED);
while ($version = DBA::fetch($versions)) {
$version['version'] = str_replace(["\n", "\r", "\t"], " ", $version['version']);