From a0da6ec39adebd360bb10c8a8e964b3a31b84a5b Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 15 Jan 2023 02:35:10 -0700 Subject: [PATCH] Update InstanceService, improve unlisted/banned network post filtering --- app/Services/InstanceService.php | 16 +++++++++++++++- app/Services/NetworkTimelineService.php | 13 ++++++++++++- app/Util/ActivityPub/Helpers.php | 9 ++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/Services/InstanceService.php b/app/Services/InstanceService.php index 3f051d66d..b53e8ac00 100644 --- a/app/Services/InstanceService.php +++ b/app/Services/InstanceService.php @@ -7,13 +7,14 @@ use App\Instance; class InstanceService { + const CACHE_KEY_BY_DOMAIN = 'pf:services:instance:by_domain:'; const CACHE_KEY_BANNED_DOMAINS = 'instances:banned:domains'; const CACHE_KEY_UNLISTED_DOMAINS = 'instances:unlisted:domains'; const CACHE_KEY_NSFW_DOMAINS = 'instances:auto_cw:domains'; public static function getByDomain($domain) { - return Cache::remember('pf:services:instance:by_domain:'.$domain, 3600, function() use($domain) { + return Cache::remember(self::CACHE_KEY_BY_DOMAIN.$domain, 3600, function() use($domain) { return Instance::whereDomain($domain)->first(); }); } @@ -50,4 +51,17 @@ class InstanceService return $instance->software; }); } + + public static function refresh() + { + Cache::forget(self::CACHE_KEY_BANNED_DOMAINS); + Cache::forget(self::CACHE_KEY_UNLISTED_DOMAINS); + Cache::forget(self::CACHE_KEY_NSFW_DOMAINS); + + self::getBannedDomains(); + self::getUnlistedDomains(); + self::getNsfwDomains(); + + return true; + } } diff --git a/app/Services/NetworkTimelineService.php b/app/Services/NetworkTimelineService.php index a25f6712c..52fc9b0bd 100644 --- a/app/Services/NetworkTimelineService.php +++ b/app/Services/NetworkTimelineService.php @@ -77,6 +77,11 @@ class NetworkTimelineService if(self::count() == 0 || $force == true) { $hideNsfw = config('instance.hide_nsfw_on_public_feeds'); Redis::del(self::CACHE_KEY); + $filteredDomains = collect(InstanceService::getBannedDomains()) + ->merge(InstanceService::getUnlistedDomains()) + ->unique() + ->values() + ->toArray(); $ids = Status::whereNotNull('uri') ->whereScope('public') ->when($hideNsfw, function($q, $hideNsfw) { @@ -88,7 +93,13 @@ class NetworkTimelineService ->where('created_at', '>', now()->subHours(config('instance.timeline.network.max_hours_old'))) ->orderByDesc('created_at') ->limit($limit) - ->pluck('id'); + ->pluck('uri', 'id'); + $ids = $ids->filter(function($k, $v) use($filteredDomains) { + $domain = parse_url($k, PHP_URL_HOST); + return !in_array($domain, $filteredDomains); + })->map(function($k, $v) { + return $v; + })->flatten(); foreach($ids as $id) { self::add($id); } diff --git a/app/Util/ActivityPub/Helpers.php b/app/Util/ActivityPub/Helpers.php index b5603666c..39e7a8bf2 100644 --- a/app/Util/ActivityPub/Helpers.php +++ b/app/Util/ActivityPub/Helpers.php @@ -510,7 +510,14 @@ class Helpers { $status->created_at->gt(now()->subHours(config('instance.timeline.network.max_hours_old'))) && (config('instance.hide_nsfw_on_public_feeds') == true ? $status->is_nsfw == false : true) ) { - NetworkTimelineService::add($status->id); + $filteredDomains = collect(InstanceService::getBannedDomains()) + ->merge(InstanceService::getUnlistedDomains()) + ->unique() + ->values() + ->toArray(); + if(!in_array($urlDomain, $filteredDomains)) { + NetworkTimelineService::add($status->id); + } } IncrementPostCount::dispatch($pid)->onQueue('low');