diff --git a/src/Model/GServer.php b/src/Model/GServer.php index 26c36d6a9..90b023f6f 100644 --- a/src/Model/GServer.php +++ b/src/Model/GServer.php @@ -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; } diff --git a/src/Module/Admin/Federation.php b/src/Module/Admin/Federation.php index 0e315c37c..119196189 100644 --- a/src/Module/Admin/Federation.php +++ b/src/Module/Admin/Federation.php @@ -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']);