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
*
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;
}
$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']);
}
*/
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);
}
/**
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
$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;
return;
}
- if ($force) {
- Contact::updateFromProbe($contact_id, '', true);
- }
+ Contact::updateFromProbe($contact_id, '', $force);
$contact = DBA::selectFirst('contact', [], ['id' => $contact_id]);
if (!DBA::isResult($contact)) {
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 {