From 84b03aa5a71210cd047ddf92bb53a4d72a5e8849 Mon Sep 17 00:00:00 2001
From: Kevin Appelt <kevin.appelt@icloud.com>
Date: Wed, 23 Feb 2022 15:41:24 +0100
Subject: [PATCH] [TASK] Allow extension scanner reporting for dirs outside
 typo3conf

Resolves: #97008
Releases: main, 11.5
Change-Id: I00e34e4d43d1babd085435d096af773876480e49
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/73679
Tested-by: core-ci <typo3@b13.com>
Tested-by: Helmut Hummel <typo3@helhum.io>
Tested-by: Simon Gilli <typo3@gilbertsoft.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Jan Helke <jh@f7.de>
Reviewed-by: Simon Gilli <typo3@gilbertsoft.org>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../Classes/Controller/UpgradeController.php  | 33 ++++++++++++++-----
 .../Private/Templates/Upgrade/Cards.html      |  4 +--
 .../Templates/Upgrade/ExtensionScanner.html   |  8 ++---
 3 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/typo3/sysext/install/Classes/Controller/UpgradeController.php b/typo3/sysext/install/Classes/Controller/UpgradeController.php
index b04a5b99b404..7b2630c2b53e 100644
--- a/typo3/sysext/install/Classes/Controller/UpgradeController.php
+++ b/typo3/sysext/install/Classes/Controller/UpgradeController.php
@@ -193,11 +193,18 @@ class UpgradeController extends AbstractController
     public function cardsAction(ServerRequestInterface $request): ResponseInterface
     {
         $view = $this->initializeView($request);
-        $installedExtensions = 0;
-        if (is_dir(Environment::getExtensionsPath())) {
-            $installedExtensions = (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->count();
+        $hasExtensions = false;
+
+        foreach ($this->packageManager->getAvailablePackages() as $package) {
+            if (!$package->getPackageMetaData()->isExtensionType() || $package->getPackageMetaData()->isFrameworkType()) {
+                continue;
+            }
+
+            $hasExtensions = true;
+            break;
         }
-        $view->assign('extensionFoldersInTypo3conf', $installedExtensions);
+
+        $view->assign('hasExtensions', $hasExtensions);
         return new JsonResponse([
             'success' => true,
             'html' => $view->render('Upgrade/Cards'),
@@ -621,11 +628,19 @@ class UpgradeController extends AbstractController
      */
     public function extensionScannerGetDataAction(ServerRequestInterface $request): ResponseInterface
     {
-        $extensionsInTypo3conf = (new Finder())->directories()->in(Environment::getExtensionsPath())->depth(0)->sortByName();
+        $extensions = [];
+        foreach ($this->packageManager->getAvailablePackages() as $package) {
+            if (!$package->getPackageMetaData()->isExtensionType() || $package->getPackageMetaData()->isFrameworkType()) {
+                continue;
+            }
+
+            $extensions[] = $package->getPackageKey();
+        }
+        sort($extensions);
         $view = $this->initializeView($request);
         $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class);
         $view->assignMultiple([
-            'extensionScannerExtensionList' => $extensionsInTypo3conf,
+            'extensionScannerExtensionList' => $extensions,
             'extensionScannerFilesToken' => $formProtection->generateToken('installTool', 'extensionScannerFiles'),
             'extensionScannerScanFileToken' => $formProtection->generateToken('installTool', 'extensionScannerScanFile'),
             'extensionScannerMarkFullyScannedRestFilesToken' => $formProtection->generateToken('installTool', 'extensionScannerMarkFullyScannedRestFiles'),
@@ -652,7 +667,7 @@ class UpgradeController extends AbstractController
     {
         // Get and validate path
         $extension = $request->getParsedBody()['install']['extension'];
-        $extensionBasePath = Environment::getExtensionsPath() . '/' . $extension;
+        $extensionBasePath = $this->packageManager->getPackage($extension)->getPackagePath();
         if (empty($extension) || !GeneralUtility::isAllowedAbsPath($extensionBasePath)) {
             throw new \RuntimeException(
                 'Path to extension ' . $extension . ' not allowed.',
@@ -741,7 +756,7 @@ class UpgradeController extends AbstractController
     {
         // Get and validate path and file
         $extension = $request->getParsedBody()['install']['extension'];
-        $extensionBasePath = Environment::getExtensionsPath() . '/' . $extension;
+        $extensionBasePath = $this->packageManager->getPackage($extension)->getPackagePath();
         if (empty($extension) || !GeneralUtility::isAllowedAbsPath($extensionBasePath)) {
             throw new \RuntimeException(
                 'Path to extension ' . $extension . ' not allowed.',
@@ -755,7 +770,7 @@ class UpgradeController extends AbstractController
             );
         }
         $file = $request->getParsedBody()['install']['file'];
-        $absoluteFilePath = $extensionBasePath . '/' . $file;
+        $absoluteFilePath = $extensionBasePath . $file;
         if (empty($file) || !GeneralUtility::isAllowedAbsPath($absoluteFilePath)) {
             throw new \RuntimeException(
                 'Path to file ' . $file . ' of extension ' . $extension . ' not allowed.',
diff --git a/typo3/sysext/install/Resources/Private/Templates/Upgrade/Cards.html b/typo3/sysext/install/Resources/Private/Templates/Upgrade/Cards.html
index 7b65ef06227a..a41b9e5d7261 100644
--- a/typo3/sysext/install/Resources/Private/Templates/Upgrade/Cards.html
+++ b/typo3/sysext/install/Resources/Private/Templates/Upgrade/Cards.html
@@ -68,12 +68,12 @@
             <button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/tca-migrations-check.js">Check TCA Migrations</button>
         </div>
     </div>
-    <div class="card card-size-fixed-small {f:if(condition:'!{extensionFoldersInTypo3conf}', then: 'card-disabled')}">
+    <div class="card card-size-fixed-small {f:if(condition:'!{hasExtensions}', then: 'card-disabled')}">
         <f:render partial="Card/Header" arguments="{ title: 'Scan Extension Files', subtitle: 'Extensions', icon: 'EXT:install/Resources/Public/Icons/modules/install-scan-extensions.svg'}" />
         <div class="card-body">
             <p class="card-text">Scan extensions for usage of deprecated or outdated TYPO3 API calls.</p>
         </div>
-        <f:if condition="{extensionFoldersInTypo3conf}">
+        <f:if condition="{hasExtensions}">
             <f:then>
                 <div class="card-footer">
                     <button type="button" class="btn btn-default" data-import="@typo3/install/module/upgrade/extension-scanner.js">Scan Extension Files</button>
diff --git a/typo3/sysext/install/Resources/Private/Templates/Upgrade/ExtensionScanner.html b/typo3/sysext/install/Resources/Private/Templates/Upgrade/ExtensionScanner.html
index 9f703a143af7..1b2ce172ba95 100644
--- a/typo3/sysext/install/Resources/Private/Templates/Upgrade/ExtensionScanner.html
+++ b/typo3/sysext/install/Resources/Private/Templates/Upgrade/ExtensionScanner.html
@@ -68,10 +68,10 @@
     <h2>Extensions</h2>
 
     <div class="panel-group panel-group-flat panel-group-scanner-extensions">
-        <f:for each="{extensionScannerExtensionList}" as="extensionInTypo3conf" iteration="iterator">
+        <f:for each="{extensionScannerExtensionList}" as="extension" iteration="iterator">
             <div
-                class="panel panel-default panel-flat t3js-extensionScanner-extension t3js-extensionScanner-extension-{extensionInTypo3conf.filename}"
-                data-extension="{extensionInTypo3conf.filename}">
+                class="panel panel-default panel-flat t3js-extensionScanner-extension t3js-extensionScanner-extension-{extension}"
+                data-extension="{extension}">
                 <div class="panel-progress">
                     <div class="panel-progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;"><span class="sr-only"></span></div>
                 </div>
@@ -79,7 +79,7 @@
                     <h2 class="panel-title">
                         <a href="#extension-{iterator.index}" class="collapsed" data-bs-toggle="collapse">
                             <span class="caret"></span>
-                            Extension: <strong>{extensionInTypo3conf.filename}</strong>
+                            Extension: <strong>{extension}</strong>
                             <span class="pull-right t3js-extensionScanner-number-of-files"></span>
                         </a>
                     </h2>
-- 
GitLab