diff --git a/src/Model/APContact.php b/src/Model/APContact.php index 17a4d22a2..1c5b5d211 100644 --- a/src/Model/APContact.php +++ b/src/Model/APContact.php @@ -276,15 +276,17 @@ class APContact } } - $parts = parse_url($apcontact['url']); - unset($parts['path']); - $baseurl = Network::unparseURL($parts); + if (empty($fetched_contact['baseurl']) || $update) { + $parts = parse_url($apcontact['url']); + unset($parts['path']); + $baseurl = Network::unparseURL($parts); - // Check if the address is resolvable or the profile url is identical with the base url of the system - if (self::addrToUrl($apcontact['addr'], $apcontact['url']) || Strings::compareLink($apcontact['url'], $baseurl)) { - $apcontact['baseurl'] = $baseurl; - } else { - $apcontact['addr'] = null; + // Check if the address is resolvable or the profile url is identical with the base url of the system + if (self::addrToUrl($apcontact['addr'], $apcontact['url']) || Strings::compareLink($apcontact['url'], $baseurl)) { + $apcontact['baseurl'] = $baseurl; + } else { + $apcontact['addr'] = null; + } } if (empty($apcontact['baseurl'])) { @@ -312,7 +314,7 @@ class APContact DBA::delete('apcontact', ['url' => $url]); } - Logger::log('Updated profile for ' . $url, Logger::DEBUG); + Logger::info('Updated profile', ['url' => $url]); return $apcontact; } diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 3ddefdd0b..e881398df 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -2085,7 +2085,7 @@ class Contact // These fields aren't updated by this routine: // 'xmpp', 'sensitive' - $fields = ['uid', 'avatar', 'name', 'nick', 'location', 'keywords', 'about', + $fields = ['uid', 'avatar', 'name', 'nick', 'location', 'keywords', 'about', 'subscribe', 'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey']; $contact = DBA::selectFirst('contact', $fields, ['id' => $id]); diff --git a/src/Model/Profile.php b/src/Model/Profile.php index ed55354b6..2b1546db4 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -27,7 +27,6 @@ use Friendica\Content\Widget\ContactBlock; use Friendica\Core\Cache\Duration; use Friendica\Core\Hook; use Friendica\Core\Logger; -use Friendica\Network\Probe; use Friendica\Core\Protocol; use Friendica\Core\Renderer; use Friendica\Core\Session; @@ -772,7 +771,7 @@ class Profile $_SESSION['visitor_handle'] = $visitor['addr']; $_SESSION['visitor_home'] = $visitor['url']; $_SESSION['my_url'] = $visitor['url']; - $_SESSION['remote_comment'] = Probe::getRemoteFollowLink($visitor['url']); + $_SESSION['remote_comment'] = $visitor['subscribe']; Session::setVisitorsContacts(); diff --git a/src/Module/RemoteFollow.php b/src/Module/RemoteFollow.php index 8e4da3c63..bf71b077f 100644 --- a/src/Module/RemoteFollow.php +++ b/src/Module/RemoteFollow.php @@ -67,17 +67,14 @@ class RemoteFollow extends BaseModule return; } - // Fetch link for the "remote follow" functionality of the given profile - $follow_link_template = Probe::getRemoteFollowLink($url); - - if (empty($follow_link_template)) { + if (empty($data['subscribe'])) { notice(DI::l10n()->t("Remote subscription can't be done for your network. Please subscribe directly on your system.")); return; } - Logger::notice('Remote request', ['url' => $url, 'follow' => $a->profile['url'], 'remote' => $follow_link_template]); + Logger::notice('Remote request', ['url' => $url, 'follow' => $a->profile['url'], 'remote' => $data['subscribe']]); - // Substitute our user's feed URL into $follow_link_template + // Substitute our user's feed URL into $data['subscribe'] // Send the subscriber home to subscribe // Diaspora needs the uri in the format user@domain.tld if ($data['network'] == Protocol::DIASPORA) { @@ -86,7 +83,7 @@ class RemoteFollow extends BaseModule $uri = urlencode($a->profile['url']); } - $follow_link = str_replace('{uri}', $uri, $follow_link_template); + $follow_link = str_replace('{uri}', $uri, $data['subscribe']); System::externalRedirect($follow_link); } diff --git a/src/Network/CurlResult.php b/src/Network/CurlResult.php index 44263716b..d7e0e884c 100644 --- a/src/Network/CurlResult.php +++ b/src/Network/CurlResult.php @@ -22,6 +22,7 @@ namespace Friendica\Network; use Friendica\Core\Logger; +use Friendica\Core\System; use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Util\Network; @@ -166,8 +167,8 @@ class CurlResult } if (!$this->isSuccess) { - Logger::log('error: ' . $this->url . ': ' . $this->returnCode . ' - ' . $this->error, Logger::INFO); - Logger::log('debug: ' . print_r($this->info, true), Logger::DATA); + Logger::error('error', ['url' => $this->url, 'code' => $this->returnCode, 'error' => $this->error, 'callstack' => System::callstack(20)]); + Logger::debug('debug', ['info' => $this->info]); } if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) { diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 28f58c467..0a67b2461 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -85,7 +85,7 @@ class Probe { $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type", "community", "keywords", "location", "about", "hide", - "batch", "notify", "poll", "request", "confirm", "poco", + "batch", "notify", "poll", "request", "confirm", "subscribe", "poco", "following", "followers", "inbox", "outbox", "sharedinbox", "priority", "network", "pubkey", "baseurl", "gsid"]; @@ -270,37 +270,15 @@ class Probe return $profile_link; } - /** - * Get the link for the remote follow page for a given profile link - * - * @param sting $profile - * @return string Remote follow page link - */ - public static function getRemoteFollowLink(string $profile) - { - $follow_link = ''; - - $links = self::lrdd($profile); - - if (!empty($links) && is_array($links)) { - foreach ($links as $link) { - if ($link['@attributes']['rel'] === ActivityNamespace::OSTATUSSUB) { - $follow_link = $link['@attributes']['template']; - } - } - } - return $follow_link; - } - /** * Check an URI for LRDD data * - * @param string $uri Address that should be probed + * @param string $uri Address that should be probed * * @return array uri data * @throws HTTPException\InternalServerErrorException */ - public static function lrdd($uri) + public static function lrdd(string $uri) { $lrdd = self::hostMeta($uri); $webfinger = null; @@ -423,7 +401,9 @@ class Probe $ap_profile = ActivityPub::probeProfile($uri); if (empty($data) || (!empty($ap_profile) && empty($network) && (($data['network'] ?? '') != Protocol::DFRN))) { + $subscribe = $data['subscribe']; $data = $ap_profile; + $data['subscribe'] = $subscribe; } elseif (!empty($ap_profile)) { $ap_profile['batch'] = ''; $data = array_merge($ap_profile, $data); @@ -597,6 +577,28 @@ class Probe return $webfinger; } + /** + * Fetch the "subscribe" and add it to the result + * + * @param array $result + * @param array $webfinger + * @return array result + */ + private static function getSubscribeLink(array $result, array $webfinger) + { + if (empty($webfinger['links'])) { + return $result; + } + + foreach ($webfinger['links'] as $link) { + if ($link['rel'] === ActivityNamespace::OSTATUSSUB) { + $result['subscribe'] = $link['template']; + } + } + + return $result; + } + /** * Fetch information (protocol endpoints and user information) about a given uri * @@ -720,7 +722,7 @@ class Probe $result = false; - Logger::log("Probing ".$uri, Logger::DEBUG); + Logger::info("Probing", ['uri' => $uri]); if (in_array($network, ["", Protocol::DFRN])) { $result = self::dfrn($webfinger); @@ -751,6 +753,8 @@ class Probe } } + $result = self::getSubscribeLink($result, $webfinger); + if (empty($result["network"])) { $result["network"] = Protocol::PHANTOM; } diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 9fccdf14b..1a7020125 100755 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -54,7 +54,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1351); + define('DB_UPDATE_VERSION', 1352); } return [ @@ -141,6 +141,7 @@ return [ "notify" => ["type" => "varchar(255)", "comment" => ""], "poll" => ["type" => "varchar(255)", "comment" => ""], "confirm" => ["type" => "varchar(255)", "comment" => ""], + "subscribe" => ["type" => "varchar(255)", "comment" => ""], "poco" => ["type" => "varchar(255)", "comment" => ""], "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],