‪TYPO3CMS  ‪main
ActionController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ResponseInterface;
35 
43 {
44  public function ‪__construct(
45  protected readonly ‪InstallUtility $installUtility,
46  protected readonly ‪ExtensionManagementService $managementService,
47  protected readonly ‪Registry $registry,
48  ) {
49  }
50 
54  protected function ‪toggleExtensionInstallationStateAction(string $extensionKey): ResponseInterface
55  {
56  try {
59  'The system is set to composer mode. You are not allowed to activate or deactivate any extension.',
60  1629922856
61  );
62  }
64  if (in_array($extensionKey, $installedExtensions)) {
65  // uninstall
66  $this->installUtility->uninstall($extensionKey);
67  } else {
68  // install
70  $this->installUtility->enrichExtensionWithDetails($extensionKey, false)
71  );
72  if ($this->managementService->installExtension($extension) === false) {
73  return $this->‪redirect(
74  'unresolvedDependencies',
75  'List',
76  null,
77  [
78  'extensionKey' => $extensionKey,
79  'returnAction' => ['controller' => 'List', 'action' => 'index'],
80  ]
81  );
82  }
83  }
85  $this->‪addFlashMessage($e->getMessage(), '', ContextualFeedbackSeverity::ERROR);
86  }
87  return $this->‪redirect('index', 'List', null, [
88  self::TRIGGER_RefreshModuleMenu => true,
89  self::TRIGGER_RefreshTopbar => true,
90  ]);
91  }
92 
96  public function ‪installExtensionWithoutSystemDependencyCheckAction(string $extensionKey): ResponseInterface
97  {
98  $this->managementService->setSkipDependencyCheck(true);
99  return (new ‪ForwardResponse('toggleExtensionInstallationState'))->withArguments(['extensionKey' => $extensionKey]);
100  }
101 
105  protected function ‪removeExtensionAction(string $extension): ResponseInterface
106  {
107  try {
110  'The system is set to composer mode. You are not allowed to remove any extension.',
111  1590314046
112  );
113  }
114 
115  $this->installUtility->removeExtension($extension);
116  $this->‪addFlashMessage(
118  'extensionList.remove.message',
119  'extensionmanager',
120  [
121  'extension' => $extension,
122  ]
123  ) ?? ''
124  );
126  $this->‪addFlashMessage($e->getMessage(), '', ContextualFeedbackSeverity::ERROR);
127  }
128 
129  return $this->‪htmlResponse('');
130  }
131 
135  protected function ‪downloadExtensionZipAction(string $extension): ResponseInterface
136  {
139  'The system is set to composer mode. You are not allowed to export extension archives.',
140  1634662405
141  );
142  }
143 
144  $fileName = $this->‪createZipFileFromExtension($extension);
145  $response = $this->responseFactory
146  ->createResponse()
147  ->withAddedHeader('Content-Type', 'application/zip')
148  ->withAddedHeader('Content-Length', (string)(filesize($fileName) ?: ''))
149  ->withAddedHeader('Content-Disposition', 'attachment; filename="' . ‪PathUtility::basename($fileName) . '"')
150  ->withBody($this->streamFactory->createStreamFromFile($fileName));
151 
152  unlink($fileName);
153 
154  return $response;
155  }
156 
160  protected function ‪reloadExtensionDataAction(string $extension): ResponseInterface
161  {
162  $extension = $this->installUtility->enrichExtensionWithDetails($extension, false);
163  $registryKey = ‪PathUtility::stripPathSitePrefix($extension['packagePath']) . 'ext_tables_static+adt.sql';
164 
165  $this->registry->remove('extensionDataImport', $registryKey);
166 
167  $this->installUtility->processExtensionSetup($extension['key']);
168 
169  return $this->‪redirect('index', 'List');
170  }
171 
177  protected function ‪createZipFileFromExtension(string $extensionKey): string
178  {
179  $extensionDetails = $this->installUtility->enrichExtensionWithDetails($extensionKey);
180  $extensionPath = $extensionDetails['packagePath'];
181 
182  // Add trailing slash to the extension path, getAllFilesAndFoldersInPath explicitly requires that.
183  $extensionPath = ‪PathUtility::sanitizeTrailingSeparator($extensionPath);
184 
185  $version = (string)$extensionDetails['version'];
186  if (empty($version)) {
187  $version = '0.0.0';
188  }
189 
190  $temporaryPath = ‪Environment::getVarPath() . '/transient/';
191  if (!@is_dir($temporaryPath)) {
192  ‪GeneralUtility::mkdir($temporaryPath);
193  }
194  $fileName = $temporaryPath . $extensionKey . '_' . $version . '_' . date('YmdHi', ‪$GLOBALS['EXEC_TIME']) . '.zip';
195 
196  $zip = new \ZipArchive();
197  $zip->open($fileName, \ZipArchive::CREATE);
198 
199  $excludePattern = ‪$GLOBALS['TYPO3_CONF_VARS']['EXT']['excludeForPackaging'];
200 
201  // Get all the files of the extension, but exclude the ones specified in the excludePattern
202  $files = GeneralUtility::getAllFilesAndFoldersInPath(
203  [], // No files pre-added
204  $extensionPath, // Start from here
205  '', // Do not filter files by extension
206  true, // Include subdirectories
207  PHP_INT_MAX, // Recursion level
208  $excludePattern // Files and directories to exclude.
209  );
210 
211  // Make paths relative to extension root directory.
212  $files = GeneralUtility::removePrefixPathFromList($files, $extensionPath);
213  $files = is_array($files) ? $files : [];
214 
215  // Remove the one empty path that is the extension dir itself.
216  $files = array_filter($files);
217 
218  foreach ($files as $file) {
219  $fullPath = $extensionPath . $file;
220  // Distinguish between files and directories, as creation of the archive
221  // fails on Windows when trying to add a directory with "addFile".
222  if (is_dir($fullPath)) {
223  $zip->addEmptyDir($file);
224  } else {
225  $zip->addFile($fullPath, $file);
226  }
227  }
228 
229  $zip->close();
230  return $fileName;
231  }
232 }
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirect
‪redirect($actionName, $controllerName=null, $extensionName=null, array $arguments=null, $pageUid=null, $_=null, $statusCode=303)
Definition: ActionController.php:719
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\getLoadedExtensionListArray
‪static getLoadedExtensionListArray()
Definition: ExtensionManagementUtility.php:1480
‪TYPO3\CMS\Core\Utility\PathUtility\stripPathSitePrefix
‪static stripPathSitePrefix(string $path)
Definition: PathUtility.php:428
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\createZipFileFromExtension
‪string createZipFileFromExtension(string $extensionKey)
Definition: ActionController.php:177
‪TYPO3\CMS\Core\Package\Exception\PackageStatesFileNotWritableException
Definition: PackageStatesFileNotWritableException.php:24
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Core\Utility\PathUtility\sanitizeTrailingSeparator
‪static sanitizeTrailingSeparator(string $path, string $separator='/')
Definition: PathUtility.php:203
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility
Definition: LocalizationUtility.php:35
‪TYPO3\CMS\Core\Package\Exception
Definition: Exception.php:22
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static isComposerMode()
Definition: Environment.php:137
‪TYPO3\CMS\Core\Registry
Definition: Registry.php:33
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\downloadExtensionZipAction
‪downloadExtensionZipAction(string $extension)
Definition: ActionController.php:135
‪TYPO3\CMS\Extensionmanager\Controller
Definition: AbstractController.php:18
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Utility\PathUtility\basename
‪static basename(string $path)
Definition: PathUtility.php:219
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\createFromExtensionArray
‪static createFromExtensionArray(array $extensionArray)
Definition: Extension.php:590
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:40
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Extensionmanager\Utility\InstallUtility
Definition: InstallUtility.php:57
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪htmlResponse(string $html=null)
Definition: ActionController.php:839
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\addFlashMessage
‪addFlashMessage(string $messageBody, $messageTitle='', ContextualFeedbackSeverity $severity=ContextualFeedbackSeverity::OK, $storeInSession=true)
Definition: ActionController.php:672
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\installExtensionWithoutSystemDependencyCheckAction
‪installExtensionWithoutSystemDependencyCheckAction(string $extensionKey)
Definition: ActionController.php:96
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility\translate
‪static string null translate(string $key, ?string $extensionName=null, array $arguments=null, Locale|string $languageKey=null)
Definition: LocalizationUtility.php:47
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:24
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController
Definition: AbstractController.php:32
‪TYPO3\CMS\Extensionmanager\Service\ExtensionManagementService
Definition: ExtensionManagementService.php:36
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController
Definition: ActionController.php:61
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\toggleExtensionInstallationStateAction
‪toggleExtensionInstallationStateAction(string $extensionKey)
Definition: ActionController.php:54
‪TYPO3\CMS\Core\Package\Exception
Definition: InvalidPackageKeyException.php:16
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\__construct
‪__construct(protected readonly InstallUtility $installUtility, protected readonly ExtensionManagementService $managementService, protected readonly Registry $registry,)
Definition: ActionController.php:44
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\removeExtensionAction
‪removeExtensionAction(string $extension)
Definition: ActionController.php:105
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir($newFolder)
Definition: GeneralUtility.php:1621
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\reloadExtensionDataAction
‪reloadExtensionDataAction(string $extension)
Definition: ActionController.php:160