diff --git a/src/Model/Contact.php b/src/Model/Contact.php index e6c00b1e3c..550f89f31a 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -314,6 +314,29 @@ class Contact return Strings::compareLink(self::getBasepath($url, true), DI::baseUrl()); } + /** + * Check if the given contact ID is on the same server + * + * @param string $url The contact link + * + * @return boolean Is it the same server? + */ + public static function isLocalById(int $cid) + { + $contact = DBA::selectFirst('contact', ['url', 'baseurl'], ['id' => $cid]); + if (!DBA::isResult($contact)) { + return false; + } + + if (empty($contact['baseurl'])) { + $baseurl = self::getBasepath($contact['url'], true); + } else { + $baseurl = $contact['baseurl']; + } + + return Strings::compareLink($baseurl, DI::baseUrl()); + } + /** * Returns the public contact id of the given user id * @@ -2126,6 +2149,12 @@ class Contact if ($force) { self::updateContact($id, $uid, $ret['url'], ['last-update' => $updated, 'success_update' => $updated]); } + + // Update the public contact + if ($uid != 0) { + self::updateFromProbeByURL($ret['url']); + } + return true; } diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 497fd3c517..e25e245931 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -401,6 +401,11 @@ class Probe $data['network'] = Protocol::PHANTOM; } + // Ensure that local connections always are DFRN + if (($network == '') && ($data['network'] != Protocol::PHANTOM) && (self::ownHost($data['baseurl'] ?? '') || self::ownHost($data['url']))) { + $data['network'] = Protocol::DFRN; + } + if (!isset($data['hide']) && in_array($data['network'], Protocol::FEDERATED)) { $data['hide'] = self::getHideStatus($data['url']); } diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index c96a4e704c..ca8d6478d7 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -857,13 +857,13 @@ class Processor */ private static function switchContact($cid) { - $contact = DBA::selectFirst('contact', ['network'], ['id' => $cid, 'network' => Protocol::NATIVE_SUPPORT]); - if (!DBA::isResult($contact) || in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) { + $contact = DBA::selectFirst('contact', ['network', 'url'], ['id' => $cid]); + if (!DBA::isResult($contact) || in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN]) || Contact::isLocal($contact['url'])) { return; } - Logger::log('Change existing contact ' . $cid . ' from ' . $contact['network'] . ' to ActivityPub.'); - Contact::updateFromProbe($cid, Protocol::ACTIVITYPUB); + Logger::info('Change existing contact', ['cid' => $cid, 'previous' => $contact['network']]); + Contact::updateFromProbe($cid); } /** diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index 2d46ce328d..5df19226a3 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -177,12 +177,12 @@ class Cron FROM `user` STRAIGHT_JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`poll` != '' - AND `contact`.`network` IN (?, ?, ?, ?) + AND `contact`.`network` IN (?, ?, ?, ?, ?) AND NOT `contact`.`self` AND NOT `contact`.`blocked` AND `contact`.`rel` != ? WHERE NOT `user`.`account_expired` AND NOT `user`.`account_removed`"; - $parameters = [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL, Contact::FOLLOWER]; + $parameters = [Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL, Contact::FOLLOWER]; // Only poll from those with suitable relationships, // and which have a polling address and ignore Diaspora since @@ -209,6 +209,11 @@ class Cron $contact['priority'] = 3; } + // ActivityPub is checked once a week + if ($contact['network'] == Protocol::ACTIVITYPUB) { + $contact['priority'] = 4; + } + // Check archived contacts once a month if ($contact['archive']) { $contact['priority'] = 5; diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index 107bd34246..b557f4ea3d 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -38,9 +38,7 @@ class OnePoll return; } - if ($force) { - Contact::updateFromProbe($contact_id, '', true); - } + Contact::updateFromProbe($contact_id, '', $force); $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]); if (!DBA::isResult($contact)) { @@ -48,6 +46,12 @@ class OnePoll return; } + // Special treatment for wrongly detected local contacts + if (!$force && ($contact['network'] != Protocol::DFRN) && Contact::isLocalById($contact_id)) { + Contact::updateFromProbe($contact_id, Protocol::DFRN, true); + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]); + } + if (($contact['network'] == Protocol::DFRN) && !Contact::isLegacyDFRNContact($contact)) { $protocol = Protocol::ACTIVITYPUB; } else {