From bd637d374bb69ef1d7abd14f713503e24f5d138f Mon Sep 17 00:00:00 2001
From: Helmut Hummel <typo3@helhum.io>
Date: Tue, 5 Oct 2021 23:48:50 +0200
Subject: [PATCH] [BUGFIX] Fix some minor Composer mode path inconsistencies

* Use config API instead of env vars when building package artifact
* Don't try to scan for extensions in Composer mode
* Don't create extension directory in Composer mode, as
  the composer installer takes care of creating it if needed
* Don't try to scan extension directory if it does not exist
* Use package type instead of install path to distinguish core extensions

Releases: master
Resolves: #95483
Change-Id: I63ff42c301eba66e85471702fb03739374f7821c
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/71453
Tested-by: core-ci <typo3@b13.com>
Tested-by: Oliver Bartsch <bo@cedev.de>
Tested-by: Simon Gilli <typo3@gilbertsoft.org>
Tested-by: Helmut Hummel <typo3@helhum.io>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Benjamin Franzke <bfr@qbus.de>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Simon Gilli <typo3@gilbertsoft.org>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
---
 .../Classes/Composer/PackageArtifactBuilder.php    |  4 ++--
 .../sysext/core/Classes/Package/PackageManager.php |  3 +++
 .../Classes/Controller/UpgradeController.php       |  6 +++++-
 .../Classes/FolderStructure/DefaultFactory.php     |  7 -------
 .../Classes/Service/LanguagePackService.php        | 14 +++-----------
 5 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
index 1492746422e7..6aae34d4ee00 100644
--- a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
+++ b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
@@ -92,7 +92,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
         }
         $this->sortPackagesAndConfiguration();
         $cacheIdentifier = md5(serialize($composer->getLocker()->getLockData()));
-        $this->setPackageCache(new ComposerPackageArtifact(getenv('TYPO3_PATH_APP') . '/var', new Filesystem(), $cacheIdentifier));
+        $this->setPackageCache(new ComposerPackageArtifact($this->config->get('app-dir') . '/var', new Filesystem(), $cacheIdentifier));
         $this->saveToPackageCache();
 
         return true;
@@ -271,7 +271,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
      */
     private function scanForRootExtensions(): array
     {
-        $thirdPartyExtensionDir = getenv('TYPO3_PATH_ROOT') . '/typo3conf/ext';
+        $thirdPartyExtensionDir = $this->config->get('root-dir') . '/typo3conf/ext';
         if (!is_dir($thirdPartyExtensionDir) || !$this->hasSubDirectories($thirdPartyExtensionDir)) {
             return [];
         }
diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index 5268cc381184..66079e71bb13 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -249,6 +249,9 @@ class PackageManager implements SingletonInterface
      */
     public function scanAvailablePackages()
     {
+        if (Environment::isComposerMode()) {
+            return;
+        }
         $packagePaths = $this->scanPackagePathsForExtensions();
         $packages = [];
         foreach ($packagePaths as $packageKey => $packagePath) {
diff --git a/typo3/sysext/install/Classes/Controller/UpgradeController.php b/typo3/sysext/install/Classes/Controller/UpgradeController.php
index 92aafe3b71df..f9e8bc44e5b8 100644
--- a/typo3/sysext/install/Classes/Controller/UpgradeController.php
+++ b/typo3/sysext/install/Classes/Controller/UpgradeController.php
@@ -211,7 +211,11 @@ class UpgradeController extends AbstractController
     public function cardsAction(ServerRequestInterface $request): ResponseInterface
     {
         $view = $this->initializeStandaloneView($request, 'Upgrade/Cards.html');
-        $view->assign('extensionFoldersInTypo3conf', (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->count());
+        $installedExtensions = 0;
+        if (is_dir(Environment::getExtensionsPath())) {
+            $installedExtensions = (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->count();
+        }
+        $view->assign('extensionFoldersInTypo3conf', $installedExtensions);
         return new JsonResponse([
             'success' => true,
             'html' => $view->render(),
diff --git a/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php b/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
index 422fca2b0d2a..6d8d502681be 100644
--- a/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
+++ b/typo3/sysext/install/Classes/FolderStructure/DefaultFactory.php
@@ -164,13 +164,6 @@ class DefaultFactory
                     'name' => 'typo3conf',
                     'type' => DirectoryNode::class,
                     'targetPermission' => $directoryPermission,
-                    'children' => [
-                        [
-                            'name' => 'ext',
-                            'type' => DirectoryNode::class,
-                            'targetPermission' => $directoryPermission,
-                        ],
-                    ],
                 ],
                 $this->getFileadminStructure(),
             ];
diff --git a/typo3/sysext/install/Classes/Service/LanguagePackService.php b/typo3/sysext/install/Classes/Service/LanguagePackService.php
index ae39779b61ca..e25c04c78ced 100644
--- a/typo3/sysext/install/Classes/Service/LanguagePackService.php
+++ b/typo3/sysext/install/Classes/Service/LanguagePackService.php
@@ -217,15 +217,8 @@ class LanguagePackService
             throw new \RuntimeException('Language iso code ' . (string)$iso . ' not available or active', 1520117054);
         }
         $packageManager = GeneralUtility::makeInstance(PackageManager::class);
-        $activePackages = $packageManager->getActivePackages();
-        $packageActive = false;
-        foreach ($activePackages as $package) {
-            if ($package->getPackageKey() === $key) {
-                $packageActive = true;
-                break;
-            }
-        }
-        if (!$packageActive) {
+        $package = $packageManager->getActivePackages()[$key] ?? null;
+        if (!$package) {
             throw new \RuntimeException('Extension ' . (string)$key . ' not loaded', 1520117245);
         }
 
@@ -234,9 +227,8 @@ class LanguagePackService
         // Allow to modify the base url on the fly
         $event = $this->eventDispatcher->dispatch(new ModifyLanguagePackRemoteBaseUrlEvent(new Uri($languagePackBaseUrl), $key));
         $languagePackBaseUrl = $event->getBaseUrl();
-        $path = ExtensionManagementUtility::extPath($key);
         $majorVersion = GeneralUtility::makeInstance(Typo3Version::class)->getMajorVersion();
-        if (strpos($path, '/sysext/') !== false) {
+        if ($package->getValueFromComposerManifest('type') === 'typo3-cms-framework') {
             // This is a system extension and the package URL should be adapted to have different packs per core major version
             // https://localize.typo3.org/xliff/b/a/backend-l10n/backend-l10n-fr.v9.zip
             $packageUrl = $key[0] . '/' . $key[1] . '/' . $key . '-l10n/' . $key . '-l10n-' . $iso . '.v' . $majorVersion . '.zip';
-- 
GitLab