Issue 8675: reduce requests of foreign pages

This commit is contained in:
Michael 2020-06-01 21:52:31 +00:00
parent 4a363b50b4
commit e379698227
7 changed files with 51 additions and 47 deletions

View file

@ -276,15 +276,17 @@ class APContact
} }
} }
$parts = parse_url($apcontact['url']); if (empty($fetched_contact['baseurl']) || $update) {
unset($parts['path']); $parts = parse_url($apcontact['url']);
$baseurl = Network::unparseURL($parts); 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 // 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)) { if (self::addrToUrl($apcontact['addr'], $apcontact['url']) || Strings::compareLink($apcontact['url'], $baseurl)) {
$apcontact['baseurl'] = $baseurl; $apcontact['baseurl'] = $baseurl;
} else { } else {
$apcontact['addr'] = null; $apcontact['addr'] = null;
}
} }
if (empty($apcontact['baseurl'])) { if (empty($apcontact['baseurl'])) {
@ -312,7 +314,7 @@ class APContact
DBA::delete('apcontact', ['url' => $url]); DBA::delete('apcontact', ['url' => $url]);
} }
Logger::log('Updated profile for ' . $url, Logger::DEBUG); Logger::info('Updated profile', ['url' => $url]);
return $apcontact; return $apcontact;
} }

View file

@ -2085,7 +2085,7 @@ class Contact
// These fields aren't updated by this routine: // These fields aren't updated by this routine:
// 'xmpp', 'sensitive' // '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', 'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco',
'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey']; 'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey'];
$contact = DBA::selectFirst('contact', $fields, ['id' => $id]); $contact = DBA::selectFirst('contact', $fields, ['id' => $id]);

View file

@ -27,7 +27,6 @@ use Friendica\Content\Widget\ContactBlock;
use Friendica\Core\Cache\Duration; use Friendica\Core\Cache\Duration;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Network\Probe;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Session; use Friendica\Core\Session;
@ -772,7 +771,7 @@ class Profile
$_SESSION['visitor_handle'] = $visitor['addr']; $_SESSION['visitor_handle'] = $visitor['addr'];
$_SESSION['visitor_home'] = $visitor['url']; $_SESSION['visitor_home'] = $visitor['url'];
$_SESSION['my_url'] = $visitor['url']; $_SESSION['my_url'] = $visitor['url'];
$_SESSION['remote_comment'] = Probe::getRemoteFollowLink($visitor['url']); $_SESSION['remote_comment'] = $visitor['subscribe'];
Session::setVisitorsContacts(); Session::setVisitorsContacts();

View file

@ -67,17 +67,14 @@ class RemoteFollow extends BaseModule
return; return;
} }
// Fetch link for the "remote follow" functionality of the given profile if (empty($data['subscribe'])) {
$follow_link_template = Probe::getRemoteFollowLink($url);
if (empty($follow_link_template)) {
notice(DI::l10n()->t("Remote subscription can't be done for your network. Please subscribe directly on your system.")); notice(DI::l10n()->t("Remote subscription can't be done for your network. Please subscribe directly on your system."));
return; 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 // Send the subscriber home to subscribe
// Diaspora needs the uri in the format user@domain.tld // Diaspora needs the uri in the format user@domain.tld
if ($data['network'] == Protocol::DIASPORA) { if ($data['network'] == Protocol::DIASPORA) {
@ -86,7 +83,7 @@ class RemoteFollow extends BaseModule
$uri = urlencode($a->profile['url']); $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); System::externalRedirect($follow_link);
} }

View file

@ -22,6 +22,7 @@
namespace Friendica\Network; namespace Friendica\Network;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Util\Network; use Friendica\Util\Network;
@ -166,7 +167,7 @@ class CurlResult
} }
if (!$this->isSuccess) { 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); Logger::log('debug: ' . print_r($this->info, true), Logger::DATA);
} }

View file

@ -85,7 +85,7 @@ class Probe
{ {
$fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type", $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type",
"community", "keywords", "location", "about", "hide", "community", "keywords", "location", "about", "hide",
"batch", "notify", "poll", "request", "confirm", "poco", "batch", "notify", "poll", "request", "confirm", "subscribe", "poco",
"following", "followers", "inbox", "outbox", "sharedinbox", "following", "followers", "inbox", "outbox", "sharedinbox",
"priority", "network", "pubkey", "baseurl", "gsid"]; "priority", "network", "pubkey", "baseurl", "gsid"];
@ -270,37 +270,15 @@ class Probe
return $profile_link; 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 * 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 * @return array uri data
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
*/ */
public static function lrdd($uri) public static function lrdd(string $uri)
{ {
$lrdd = self::hostMeta($uri); $lrdd = self::hostMeta($uri);
$webfinger = null; $webfinger = null;
@ -423,7 +401,9 @@ class Probe
$ap_profile = ActivityPub::probeProfile($uri); $ap_profile = ActivityPub::probeProfile($uri);
if (empty($data) || (!empty($ap_profile) && empty($network) && (($data['network'] ?? '') != Protocol::DFRN))) { if (empty($data) || (!empty($ap_profile) && empty($network) && (($data['network'] ?? '') != Protocol::DFRN))) {
$subscribe = $data['subscribe'];
$data = $ap_profile; $data = $ap_profile;
$data['subscribe'] = $subscribe;
} elseif (!empty($ap_profile)) { } elseif (!empty($ap_profile)) {
$ap_profile['batch'] = ''; $ap_profile['batch'] = '';
$data = array_merge($ap_profile, $data); $data = array_merge($ap_profile, $data);
@ -597,6 +577,28 @@ class Probe
return $webfinger; 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 * Fetch information (protocol endpoints and user information) about a given uri
* *
@ -720,7 +722,7 @@ class Probe
$result = false; $result = false;
Logger::log("Probing ".$uri, Logger::DEBUG); Logger::info("Probing", ['uri' => $uri]);
if (in_array($network, ["", Protocol::DFRN])) { if (in_array($network, ["", Protocol::DFRN])) {
$result = self::dfrn($webfinger); $result = self::dfrn($webfinger);
@ -751,6 +753,8 @@ class Probe
} }
} }
$result = self::getSubscribeLink($result, $webfinger);
if (empty($result["network"])) { if (empty($result["network"])) {
$result["network"] = Protocol::PHANTOM; $result["network"] = Protocol::PHANTOM;
} }

View file

@ -54,7 +54,7 @@
use Friendica\Database\DBA; use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) { if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1351); define('DB_UPDATE_VERSION', 1352);
} }
return [ return [
@ -141,6 +141,7 @@ return [
"notify" => ["type" => "varchar(255)", "comment" => ""], "notify" => ["type" => "varchar(255)", "comment" => ""],
"poll" => ["type" => "varchar(255)", "comment" => ""], "poll" => ["type" => "varchar(255)", "comment" => ""],
"confirm" => ["type" => "varchar(255)", "comment" => ""], "confirm" => ["type" => "varchar(255)", "comment" => ""],
"subscribe" => ["type" => "varchar(255)", "comment" => ""],
"poco" => ["type" => "varchar(255)", "comment" => ""], "poco" => ["type" => "varchar(255)", "comment" => ""],
"aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
"ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],