Browse Source

Issue 8675: reduce requests of foreign pages

pull/8713/head
Michael 1 year ago
parent
commit
e379698227
7 changed files with 52 additions and 48 deletions
  1. +12
    -10
      src/Model/APContact.php
  2. +1
    -1
      src/Model/Contact.php
  3. +1
    -2
      src/Model/Profile.php
  4. +4
    -7
      src/Module/RemoteFollow.php
  5. +2
    -1
      src/Network/CurlResult.php
  6. +30
    -26
      src/Network/Probe.php
  7. +2
    -1
      static/dbstructure.config.php

+ 12
- 10
src/Model/APContact.php View File

@ -276,15 +276,17 @@ class APContact
}
}
$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'])) {
@ -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;
}


+ 1
- 1
src/Model/Contact.php View File

@ -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]);


+ 1
- 2
src/Model/Profile.php View File

@ -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();


+ 4
- 7
src/Module/RemoteFollow.php View File

@ -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);
}


+ 2
- 1
src/Network/CurlResult.php View File

@ -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,7 +167,7 @@ class CurlResult
}
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);
}


+ 30
- 26
src/Network/Probe.php View File

@ -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;
}


+ 2
- 1
static/dbstructure.config.php View File

@ -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" => ""],


Loading…
Cancel
Save