}
}
- $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;
+ 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;
+ }
}
if (empty($apcontact['baseurl'])) {
DBA::delete('apcontact', ['url' => $url]);
}
- Logger::log('Updated profile for ' . $url, Logger::DEBUG);
+ Logger::info('Updated profile', ['url' => $url]);
return $apcontact;
}
// 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]);
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;
$_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();
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) {
$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);
}
namespace Friendica\Network;
use Friendica\Core\Logger;
+use Friendica\Core\System;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Util\Network;
}
if (!$this->isSuccess) {
- Logger::log('error: ' . $this->url . ': ' . $this->returnCode . ' - ' . $this->error, Logger::INFO);
+ Logger::error('error', ['url' => $this->url, 'code' => $this->returnCode, 'error' => $this->error, 'callstack' => System::callstack(20)]);
Logger::log('debug: ' . print_r($this->info, true), Logger::DATA);
}
{
$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"];
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;
$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);
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
*
$result = false;
- Logger::log("Probing ".$uri, Logger::DEBUG);
+ Logger::info("Probing", ['uri' => $uri]);
if (in_array($network, ["", Protocol::DFRN])) {
$result = self::dfrn($webfinger);
}
}
+ $result = self::getSubscribeLink($result, $webfinger);
+
if (empty($result["network"])) {
$result["network"] = Protocol::PHANTOM;
}
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
- define('DB_UPDATE_VERSION', 1351);
+ define('DB_UPDATE_VERSION', 1352);
}
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" => ""],