X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FAPContact.php;h=09a6cb9e78db781f1ccabac557cd5fbc0747b40c;hb=21f172c585aff8c606774a05fde1548ddff1667d;hp=bb6f12e10c292c4c62bd36bb73c2cb559d90953a;hpb=86105635ca3b0e096d128718b778b313b5eaa88e;p=friendica.git diff --git a/src/Model/APContact.php b/src/Model/APContact.php index bb6f12e10c..09a6cb9e78 100644 --- a/src/Model/APContact.php +++ b/src/Model/APContact.php @@ -1,6 +1,6 @@ $local_owner['addr'], 'baseurl' => $local_owner['baseurl'], 'url' => $local_owner['url'], - 'subscribe' => $local_owner['baseurl'] . '/follow?url={uri}']; + 'subscribe' => $local_owner['baseurl'] . '/contact/follow?url={uri}']; if (!empty($local_owner['alias']) && ($local_owner['url'] != $local_owner['alias'])) { $data['alias'] = $local_owner['alias']; @@ -224,14 +226,11 @@ class APContact $apcontact['following'] = JsonLD::fetchElement($compacted, 'as:following', '@id'); $apcontact['followers'] = JsonLD::fetchElement($compacted, 'as:followers', '@id'); $apcontact['inbox'] = (JsonLD::fetchElement($compacted, 'ldp:inbox', '@id') ?? ''); - self::unarchiveInbox($apcontact['inbox'], false); - $apcontact['outbox'] = JsonLD::fetchElement($compacted, 'as:outbox', '@id'); $apcontact['sharedinbox'] = ''; if (!empty($compacted['as:endpoints'])) { $apcontact['sharedinbox'] = (JsonLD::fetchElement($compacted['as:endpoints'], 'as:sharedInbox', '@id') ?? ''); - self::unarchiveInbox($apcontact['sharedinbox'], true); } $apcontact['featured'] = JsonLD::fetchElement($compacted, 'toot:featured', '@id'); @@ -289,22 +288,19 @@ class APContact return $fetched_contact; } - $parts = parse_url($apcontact['url']); - unset($parts['scheme']); - unset($parts['path']); - if (empty($apcontact['addr'])) { - if (!empty($apcontact['nick']) && is_array($parts)) { - $apcontact['addr'] = $apcontact['nick'] . '@' . str_replace('//', '', Network::unparseURL($parts)); - } else { + try { + $apcontact['addr'] = $apcontact['nick'] . '@' . (new Uri($apcontact['url']))->getAuthority(); + } catch (\Throwable $e) { + Logger::warning('Unable to coerce APContact URL into a UriInterface object', ['url' => $apcontact['url'], 'error' => $e->getMessage()]); $apcontact['addr'] = ''; } } $apcontact['pubkey'] = null; if (!empty($compacted['w3id:publicKey'])) { - $apcontact['pubkey'] = trim(JsonLD::fetchElement($compacted['w3id:publicKey'], 'w3id:publicKeyPem', '@value')); - if (strstr($apcontact['pubkey'], 'RSA ')) { + $apcontact['pubkey'] = trim(JsonLD::fetchElement($compacted['w3id:publicKey'], 'w3id:publicKeyPem', '@value') ?? ''); + if (strpos($apcontact['pubkey'], 'RSA ') !== false) { $apcontact['pubkey'] = Crypto::rsaToPem($apcontact['pubkey']); } } @@ -352,17 +348,18 @@ class APContact if (!empty($apcontact['outbox'])) { if (!empty($local_owner)) { - $outbox = ActivityPub\Transmitter::getOutbox($local_owner); + $statuses_count = self::getStatusesCount($local_owner); } else { $outbox = ActivityPub::fetchContent($apcontact['outbox']); + $statuses_count = $outbox['totalItems'] ?? 0; } - if (!empty($outbox['totalItems'])) { + if (!empty($statuses_count)) { // Mastodon seriously allows for this condition? // Jul 20 2021 - See https://chaos.social/@m11 for a negative posts count - if ($outbox['totalItems'] < 0) { - $outbox['totalItems'] = 0; + if ($statuses_count < 0) { + $statuses_count = 0; } - $apcontact['statuses_count'] = $outbox['totalItems']; + $apcontact['statuses_count'] = $statuses_count; } } @@ -380,14 +377,14 @@ class APContact // kroeg:blocks, updated // When the photo is too large, try to shorten it by removing parts - if (strlen($apcontact['photo']) > 255) { + if (strlen($apcontact['photo'] ?? '') > 255) { $parts = parse_url($apcontact['photo']); unset($parts['fragment']); - $apcontact['photo'] = Uri::fromParts($parts); + $apcontact['photo'] = (string)Uri::fromParts($parts); if (strlen($apcontact['photo']) > 255) { unset($parts['query']); - $apcontact['photo'] = Uri::fromParts($parts); + $apcontact['photo'] = (string)Uri::fromParts($parts); } if (strlen($apcontact['photo']) > 255) { @@ -427,6 +424,12 @@ class APContact $apcontact['gsid'] = null; } + self::unarchiveInbox($apcontact['inbox'], false, $apcontact['gsid']); + + if (!empty($apcontact['sharedinbox'])) { + self::unarchiveInbox($apcontact['sharedinbox'], true, $apcontact['gsid']); + } + if ($apcontact['url'] == $apcontact['alias']) { $apcontact['alias'] = null; } @@ -483,6 +486,30 @@ class APContact return DBA::selectFirst('apcontact', [], ['url' => $apcontact['url']]) ?: []; } + /** + * Fetch the number of statuses for the given owner + * + * @param array $owner + * + * @return integer + */ + private static function getStatusesCount(array $owner): int + { + $condition = [ + 'private' => [Item::PUBLIC, Item::UNLISTED], + 'author-id' => Contact::getIdForURL($owner['url'], 0, false), + 'gravity' => [Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT], + 'network' => Protocol::DFRN, + 'parent-network' => Protocol::FEDERATED, + 'deleted' => false, + 'visible' => true, + ]; + + $count = Post::countPosts($condition); + + return $count; + } + /** * Mark the given AP Contact as "to archive" * @@ -493,7 +520,7 @@ class APContact { if (!empty($apcontact['inbox'])) { Logger::info('Set inbox status to failure', ['inbox' => $apcontact['inbox']]); - HTTPSignature::setInboxStatus($apcontact['inbox'], false); + HTTPSignature::setInboxStatus($apcontact['inbox'], false, false, $apcontact['gsid']); } if (!empty($apcontact['sharedinbox'])) { @@ -503,7 +530,7 @@ class APContact if (!$available) { // If all known personal inboxes are failing then set their shared inbox to failure as well Logger::info('Set shared inbox status to failure', ['sharedinbox' => $apcontact['sharedinbox']]); - HTTPSignature::setInboxStatus($apcontact['sharedinbox'], false, true); + HTTPSignature::setInboxStatus($apcontact['sharedinbox'], false, true, $apcontact['gsid']); } } } @@ -518,11 +545,11 @@ class APContact { if (!empty($apcontact['inbox'])) { Logger::info('Set inbox status to success', ['inbox' => $apcontact['inbox']]); - HTTPSignature::setInboxStatus($apcontact['inbox'], true); + HTTPSignature::setInboxStatus($apcontact['inbox'], true, false, $apcontact['gsid']); } if (!empty($apcontact['sharedinbox'])) { Logger::info('Set shared inbox status to success', ['sharedinbox' => $apcontact['sharedinbox']]); - HTTPSignature::setInboxStatus($apcontact['sharedinbox'], true, true); + HTTPSignature::setInboxStatus($apcontact['sharedinbox'], true, true, $apcontact['gsid']); } } @@ -531,15 +558,16 @@ class APContact * * @param string $url inbox url * @param boolean $shared Shared Inbox + * @param int $gsid Global server id * @return void */ - private static function unarchiveInbox(string $url, bool $shared) + private static function unarchiveInbox(string $url, bool $shared, int $gsid = null) { if (empty($url)) { return; } - HTTPSignature::setInboxStatus($url, true, $shared); + HTTPSignature::setInboxStatus($url, true, $shared, $gsid); } /** @@ -547,19 +575,19 @@ class APContact * * @param array $apcontact * - * @return bool + * @return bool */ public static function isRelay(array $apcontact): bool { - if ($apcontact['nick'] != 'relay') { + if (empty($apcontact['nick']) || $apcontact['nick'] != 'relay') { return false; } - if ($apcontact['type'] == 'Application') { + if (!empty($apcontact['type']) && $apcontact['type'] == 'Application') { return true; } - if (in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) { + if (!empty($apcontact['type']) && in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) { return true; }