From 91d8cd2c873be4dfebc3fb84d41d840f8a47fe82 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 26 Jan 2023 00:00:55 -0500 Subject: [PATCH 1/2] Prevent fatal error when probing WebFinger address in Network\Probe::feed --- src/Network/Probe.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Network/Probe.php b/src/Network/Probe.php index d35490d0d3..7c2760393a 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -761,7 +761,7 @@ class Probe $result = self::feed($uri); } else { // We overwrite the detected nick with our try if the previois routines hadn't detected it. - // Additionally it is overwritten when the nickname doesn't make sense (contains spaces). + // Additionally, it is overwritten when the nickname doesn't make sense (contains spaces). if ((empty($result['nick']) || (strstr($result['nick'], ' '))) && ($nick != '')) { $result['nick'] = $nick; } @@ -1853,11 +1853,18 @@ class Probe */ private static function feed(string $url, bool $probe = true): array { - $curlResult = DI::httpClient()->get($url, HttpClientAccept::FEED_XML); + try { + $curlResult = DI::httpClient()->get($url, HttpClientAccept::FEED_XML); + } catch(\Throwable $e) { + DI::logger()->info('Error requesting feed URL', ['url' => $url, 'exception' => $e]); + return []; + } + if ($curlResult->isTimeout()) { self::$isTimeout = true; return []; } + $feed = $curlResult->getBody(); $feed_data = Feed::import($feed); From 79dc5c177ea35917fbae4718ec0f56c67b1e2ebc Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 26 Jan 2023 00:03:57 -0500 Subject: [PATCH 2/2] Replace custom WebFinger implementation by Probe::getWebfingerArray in APContact::fetchWebfingerData - This implementation didn't support separate domains for the address and the final account --- src/Model/APContact.php | 19 ++++++------------- src/Network/Probe.php | 2 +- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Model/APContact.php b/src/Model/APContact.php index 09a6cb9e78..c72028ef31 100644 --- a/src/Model/APContact.php +++ b/src/Model/APContact.php @@ -71,21 +71,14 @@ class APContact return $data; } - $data = ['addr' => $addr]; - $template = 'https://' . $addr_parts[1] . '/.well-known/webfinger?resource=acct:' . urlencode($addr); - $webfinger = Probe::webfinger(str_replace('{uri}', urlencode($addr), $template), HttpClientAccept::JRD_JSON); - if (empty($webfinger['links'])) { - $template = 'http://' . $addr_parts[1] . '/.well-known/webfinger?resource=acct:' . urlencode($addr); - $webfinger = Probe::webfinger(str_replace('{uri}', urlencode($addr), $template), HttpClientAccept::JRD_JSON); - if (empty($webfinger['links'])) { - return []; - } - $data['baseurl'] = 'http://' . $addr_parts[1]; - } else { - $data['baseurl'] = 'https://' . $addr_parts[1]; + $webfinger = Probe::getWebfingerArray($addr); + if (empty($webfinger['webfinger']['links'])) { + return []; } - foreach ($webfinger['links'] as $link) { + $data['baseurl'] = $webfinger['baseurl']; + + foreach ($webfinger['webfinger']['links'] as $link) { if (empty($link['rel'])) { continue; } diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 7c2760393a..12ac8a04f9 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -519,7 +519,7 @@ class Probe * @return array Webfinger data * @throws HTTPException\InternalServerErrorException */ - private static function getWebfingerArray(string $uri): array + public static function getWebfingerArray(string $uri): array { $parts = parse_url($uri);