diff --git a/app/Services/WebfingerService.php b/app/Services/WebfingerService.php index 1269dd0eb..3615018bc 100644 --- a/app/Services/WebfingerService.php +++ b/app/Services/WebfingerService.php @@ -6,7 +6,7 @@ use Cache; use App\Profile; use Illuminate\Support\Facades\Redis; use App\Util\Webfinger\WebfingerUrl; -use Zttp\Zttp; +use Illuminate\Support\Facades\Http; use App\Util\ActivityPub\Helpers; use App\Transformer\Api\AccountTransformer; use League\Fractal; @@ -32,16 +32,39 @@ class WebfingerService if(!Helpers::validateUrl($url)) { return []; } - $res = Zttp::get($url); - $webfinger = $res->json(); - if(!isset($webfinger['links'])) { + + $res = Http::retry(3, 500) + ->acceptJson() + ->withHeaders([ + 'User-Agent' => '(Pixelfed/' . config('pixelfed.version') . '; +' . config('app.url') . ')' + ]) + ->timeout(20) + ->get($url); + + if(!$res->successful()) { return []; } - $profile = Helpers::profileFetch($webfinger['links'][0]['href']); + + $webfinger = $res->json(); + if(!isset($webfinger['links']) || !is_array($webfinger['links']) || empty($webfinger['links'])) { + return ['nolinks']; + } + + $link = collect($webfinger['links']) + ->filter(function($link) { + return $link && + isset($link['type']) && + isset($link['href']) && + $link['type'] == 'application/activity+json'; + }) + ->pluck('href') + ->first(); + + $profile = Helpers::profileFetch($link); $fractal = new Fractal\Manager(); $fractal->setSerializer(new ArraySerializer()); $resource = new Fractal\Resource\Item($profile, new AccountTransformer()); $res = $fractal->createData($resource)->toArray(); return $res; } -} \ No newline at end of file +}