From bd5916e1a67fedc4e41009930a315f5dbd32d798 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 9 Apr 2026 09:18:43 +0200 Subject: [PATCH] Avoid sending filter notification emails on staging --- src/Service/FilterListWorker.php | 65 +++++++++++++++++--------------- tests/FilterListWorkerTest.php | 2 +- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/Service/FilterListWorker.php b/src/Service/FilterListWorker.php index 7af88458c..6db8c9e11 100644 --- a/src/Service/FilterListWorker.php +++ b/src/Service/FilterListWorker.php @@ -46,6 +46,7 @@ public function __construct( private DownloadManager $downloadManager, private string $mailFromEmail, private UrlGeneratorInterface $urlGenerator, + private string $packagistHost, ) { } @@ -90,39 +91,41 @@ public function process(Job $job, SignalHandler $signal): array $this->malwarePackageVersionUpdateListener->flushChangesToPackages(); - /** @var array> $newEntriesByPackage */ - $newEntriesByPackage = []; - foreach ($new as $entry) { - $newEntriesByPackage[$entry->getPackageName()][] = $entry; - } - - foreach ($newEntriesByPackage as $packageName => $entries) { - $package = $this->doctrine->getRepository(Package::class)->findOneBy(['name' => $packageName]); - $downloads = $package ? $this->downloadManager->getTotalDownloads($package->getId()) : 0; - $packageUrl = $this->urlGenerator->generate('view_package', ['name' => $packageName], UrlGeneratorInterface::ABSOLUTE_URL); - - if ($downloads >= 10_000) { - $subject = '[URGENT] Filter list entry added for high-download package '.$packageName.' ('.number_format($downloads).' downloads)'; - $body = 'A new filter list entry has been added for '.$packageName.' which has '.number_format($downloads)." total downloads. This requires urgent attention.\n\n"; - } else { - $subject = 'Filter list entry added for '.$packageName; - $body = 'A new filter list entry has been added for '.$packageName.".\n\n"; + if ($this->packagistHost === 'packagist.org') { + /** @var array> $newEntriesByPackage */ + $newEntriesByPackage = []; + foreach ($new as $entry) { + $newEntriesByPackage[$entry->getPackageName()][] = $entry; } - $body .= 'Package: '.$packageUrl."\n" - .'List: '.$list->value."\n" - .'Versions: '.implode(', ', array_map(fn (FilterListEntry $e) => $e->getVersion(), $entries))."\n" - .'Reason: '.($entries[0]->getReason() ?? 'N/A')."\n" - .'Link: '.($entries[0]->getLink() ?? 'N/A')."\n"; - - $message = new Email() - ->subject($subject) - ->from(new Address($this->mailFromEmail)) - ->to($this->mailFromEmail) - ->text($body) - ; - $message->getHeaders()->addTextHeader('X-Auto-Response-Suppress', 'OOF, DR, RN, NRN, AutoReply'); - $this->mailer->send($message); + foreach ($newEntriesByPackage as $packageName => $entries) { + $package = $this->doctrine->getRepository(Package::class)->findOneBy(['name' => $packageName]); + $downloads = $package ? $this->downloadManager->getTotalDownloads($package->getId()) : 0; + $packageUrl = $this->urlGenerator->generate('view_package', ['name' => $packageName], UrlGeneratorInterface::ABSOLUTE_URL); + + if ($downloads >= 10_000) { + $subject = '[URGENT] Filter list entry added for high-download package '.$packageName.' ('.number_format($downloads).' downloads)'; + $body = 'A new filter list entry has been added for '.$packageName.' which has '.number_format($downloads)." total downloads. This requires urgent attention.\n\n"; + } else { + $subject = 'Filter list entry added for '.$packageName; + $body = 'A new filter list entry has been added for '.$packageName.".\n\n"; + } + + $body .= 'Package: '.$packageUrl."\n" + .'List: '.$list->value."\n" + .'Versions: '.implode(', ', array_map(fn (FilterListEntry $e) => $e->getVersion(), $entries))."\n" + .'Reason: '.($entries[0]->getReason() ?? 'N/A')."\n" + .'Link: '.($entries[0]->getLink() ?? 'N/A')."\n"; + + $message = new Email() + ->subject($subject) + ->from(new Address($this->mailFromEmail)) + ->to($this->mailFromEmail) + ->text($body) + ; + $message->getHeaders()->addTextHeader('X-Auto-Response-Suppress', 'OOF, DR, RN, NRN, AutoReply'); + $this->mailer->send($message); + } } $this->locker->unlockFilterList(self::FILTER_LIST_WORKER_RUN); diff --git a/tests/FilterListWorkerTest.php b/tests/FilterListWorkerTest.php index 64d46a5e2..37a0e2131 100644 --- a/tests/FilterListWorkerTest.php +++ b/tests/FilterListWorkerTest.php @@ -55,7 +55,7 @@ protected function setUp(): void $this->downloadManager = $this->createStub(DownloadManager::class); $this->urlGenerator = $this->createStub(UrlGeneratorInterface::class); $doctrine = $this->createStub(ManagerRegistry::class); - $this->worker = new FilterListWorker($this->locker, new NullLogger(), $doctrine, [FilterLists::AIKIDO_MALWARE->value => $this->filterList], new FilterListResolver(), new FilterListEntryUpdateListener($doctrine), $this->mailer, $this->downloadManager, 'test@example.com', $this->urlGenerator); + $this->worker = new FilterListWorker($this->locker, new NullLogger(), $doctrine, [FilterLists::AIKIDO_MALWARE->value => $this->filterList], new FilterListResolver(), new FilterListEntryUpdateListener($doctrine), $this->mailer, $this->downloadManager, 'test@example.com', $this->urlGenerator, 'packagist.org'); $this->em = $this->createMock(EntityManager::class);