Merge pull request #8713 from annando/issue-8675
Issue 8675: reduce requests of foreign pages
This commit is contained in:
commit
e5eaf0e0ec
7 changed files with 52 additions and 48 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,8 +167,8 @@ 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::debug('debug', ['info' => $this->info]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) {
|
if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" => ""],
|
||||||
|
|
Loading…
Reference in a new issue