From eac2c19601180efdbb1a2b43435b4b48700be6ab Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Tue, 19 Nov 2024 04:03:08 -0700 Subject: [PATCH] Update AutolinkService, optimize lookups --- app/Services/AutolinkService.php | 58 +++++++++----------------------- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/app/Services/AutolinkService.php b/app/Services/AutolinkService.php index f0f3278ff..c494ab151 100644 --- a/app/Services/AutolinkService.php +++ b/app/Services/AutolinkService.php @@ -2,53 +2,25 @@ namespace App\Services; -use Cache; use App\Profile; -use Illuminate\Support\Str; -use Illuminate\Support\Facades\Http; -use App\Util\Webfinger\WebfingerUrl; +use Cache; +use Purify; class AutolinkService { - const CACHE_KEY = 'pf:services:autolink:'; + const CACHE_KEY = 'pf:services:autolink:mue:'; - public static function mentionedUsernameExists($username) - { - $key = 'pf:services:autolink:userexists:' . hash('sha256', $username); + public static function mentionedUsernameExists($username) + { + if (str_starts_with($username, '@')) { + if (substr_count($username, '@') === 1) { + $username = substr($username, 1); + } + } + $name = Purify::clean(strtolower($username)); - return Cache::remember($key, 3600, function() use($username) { - $remote = Str::of($username)->contains('@'); - $profile = Profile::whereUsername($username)->first(); - if($profile) { - if($profile->domain != null) { - $instance = InstanceService::getByDomain($profile->domain); - if($instance && $instance->banned == true) { - return false; - } - } - return true; - } else { - if($remote) { - $parts = explode('@', $username); - $domain = last($parts); - $instance = InstanceService::getByDomain($domain); - - if($instance) { - if($instance->banned == true) { - return false; - } else { - $wf = WebfingerUrl::generateWebfingerUrl($username); - $res = Http::head($wf); - return $res->ok(); - } - } else { - $wf = WebfingerUrl::generateWebfingerUrl($username); - $res = Http::head($wf); - return $res->ok(); - } - } - } - return false; - }); - } + return Cache::remember(self::CACHE_KEY.base64_encode($name), 7200, function () use ($name) { + return Profile::where('username', $name)->exists(); + }); + } }