From 0ad328c20170ddaaa5ce894eac430959dce3d736 Mon Sep 17 00:00:00 2001
From: Benjamin Franzke <bfr@qbus.de>
Date: Mon, 13 Apr 2020 23:19:43 +0200
Subject: [PATCH] [BUGFIX] Fix PackageManager event binding

PackageManager can not have DI tags assigned as it is a early container
instance (injected from core Bootstrap). That caused the
'packagesMayHaveChanged' event to never be executed.

We rather need to hookup the event listener using a service
provider that extends the ListenerProvider. (That's pretty much
the same, what the DI tags do in the background as well.)

Notes:
 1) To avoid similar future mistakes we also remove the unneeded
    `autoconfigure: false` from Configuration.yaml
 2) This restriction (no DI tag configuration) does only apply to early
    instance services, which is a static list of core TYPO3 services.
 3) We additionally drop the currently unused event callback
    PackageManager::beforeInstallationEventListener.
    It was not fully migrated to a PSR-14 event callback in #90249, which
    revealed that it is actually unneeded. The signal callback was
    introduced with #52766 in EXT:extensionmanager/ext_localconf.php,
    but became obsolete with later fixes: #71071 and #71455
    ExtensionManagementService now calls (through Install/ListUtility)
    directly into packageManager instead of (mis-)using a signal/event.

Resolves: #90955
Related: #90249
Releases: master
Change-Id: I8943e6149743d527c9e1157e425eed3afa98b0d4
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64156
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Simon Gilli <typo3@gilbertsoft.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Simon Gilli <typo3@gilbertsoft.org>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../sysext/core/Classes/Package/PackageManager.php  |  8 --------
 typo3/sysext/core/Classes/ServiceProvider.php       | 13 +++++++++++++
 typo3/sysext/core/Configuration/Services.yaml       |  8 --------
 3 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index 294b3664088d..e63846301c25 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -21,7 +21,6 @@ use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Core\ClassLoadingInformation;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Information\Typo3Version;
-use TYPO3\CMS\Core\Package\Event\BeforePackageActivationEvent;
 use TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent;
 use TYPO3\CMS\Core\Package\Exception\InvalidPackageKeyException;
 use TYPO3\CMS\Core\Package\Exception\InvalidPackageManifestException;
@@ -316,13 +315,6 @@ class PackageManager implements SingletonInterface
         $this->scanAvailablePackages();
     }
 
-    public function beforeInstallationEventListener(BeforePackageActivationEvent $event): void
-    {
-        if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_BE) {
-            $this->scanAvailablePackages();
-        }
-    }
-
     /**
      * Scans all directories for a certain package.
      *
diff --git a/typo3/sysext/core/Classes/ServiceProvider.php b/typo3/sysext/core/Classes/ServiceProvider.php
index fc8a922ec8b2..d5b534ef3c2b 100644
--- a/typo3/sysext/core/Classes/ServiceProvider.php
+++ b/typo3/sysext/core/Classes/ServiceProvider.php
@@ -53,6 +53,7 @@ class ServiceProvider extends AbstractServiceProvider
     {
         return [
             EventDispatcherInterface::class => [ static::class, 'provideFallbackEventDispatcher' ],
+            EventDispatcher\ListenerProvider::class => [ static::class, 'extendEventListenerProvider' ],
         ] + parent::getExtensions();
     }
 
@@ -105,6 +106,18 @@ class ServiceProvider extends AbstractServiceProvider
         return new EventDispatcher\ListenerProvider($container);
     }
 
+    public static function extendEventListenerProvider(
+        ContainerInterface $container,
+        EventDispatcher\ListenerProvider $listenerProvider
+    ): EventDispatcher\ListenerProvider {
+        $listenerProvider->addListener(
+            Package\Event\PackagesMayHaveChangedEvent::class,
+            Package\PackageManager::class,
+            'packagesMayHaveChanged'
+        );
+        return $listenerProvider;
+    }
+
     public static function getDependencyOrderingService(ContainerInterface $container): Service\DependencyOrderingService
     {
         return new Service\DependencyOrderingService();
diff --git a/typo3/sysext/core/Configuration/Services.yaml b/typo3/sysext/core/Configuration/Services.yaml
index 4a5291ca131b..2b461c5e4667 100644
--- a/typo3/sysext/core/Configuration/Services.yaml
+++ b/typo3/sysext/core/Configuration/Services.yaml
@@ -56,14 +56,6 @@ services:
     arguments:
       $configPath: "%env(TYPO3:configPath)%/sites"
 
-  TYPO3\CMS\Core\Package\PackageManager:
-    autoconfigure: false
-    tags:
-      - name: event.listener
-        identifier: 'typo3-core'
-        method: 'packagesMayHaveChanged'
-        event: TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent
-
   TYPO3\CMS\Core\Package\FailsafePackageManager:
     autoconfigure: false
 
-- 
GitLab