‪TYPO3CMS  11.5
ActionController.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
18 use Psr\Http\Message\ResponseInterface;
33 
40 {
43 
44  public function ‪__construct(
45  ‪InstallUtility $installUtility,
46  ‪ExtensionManagementService $managementService
47  ) {
48  $this->installUtility = $installUtility;
49  $this->managementService = $managementService;
50  }
51 
57  protected function ‪toggleExtensionInstallationStateAction($extensionKey)
58  {
59  try {
62  'The system is set to composer mode. You are not allowed to activate or deactivate any extension.',
63  1629922856
64  );
65  }
67  if (in_array($extensionKey, $installedExtensions)) {
68  // uninstall
69  $this->installUtility->uninstall($extensionKey);
70  } else {
71  // install
73  $this->installUtility->enrichExtensionWithDetails($extensionKey, false)
74  );
75  if ($this->managementService->installExtension($extension) === false) {
76  $this->‪redirect('unresolvedDependencies', 'List', null, ['extensionKey' => $extensionKey]);
77  }
78  }
80  $this->‪addFlashMessage($e->getMessage(), '', ‪FlashMessage::ERROR);
81  }
82  $this->‪redirect('index', 'List', null, [
83  self::TRIGGER_RefreshModuleMenu => true,
84  self::TRIGGER_RefreshTopbar => true,
85  ]);
86  }
87 
93  public function ‪installExtensionWithoutSystemDependencyCheckAction($extensionKey): ResponseInterface
94  {
95  $this->managementService->setSkipDependencyCheck(true);
96  return (new ‪ForwardResponse('toggleExtensionInstallationState'))->withArguments(['extensionKey' => $extensionKey]);
97  }
98 
105  protected function ‪removeExtensionAction($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(), '', ‪FlashMessage::ERROR);
127  }
128 
129  return $this->‪htmlResponse('');
130  }
131 
138  protected function ‪downloadExtensionZipAction($extension): ResponseInterface
139  {
142  'The system is set to composer mode. You are not allowed to export extension archives.',
143  1634662405
144  );
145  }
146 
147  $fileName = $this->‪createZipFileFromExtension($extension);
148  $response = $this->responseFactory
149  ->createResponse()
150  ->withAddedHeader('Content-Type', 'application/zip')
151  ->withAddedHeader('Content-Length', (string)(filesize($fileName) ?: ''))
152  ->withAddedHeader('Content-Disposition', 'attachment; filename="' . ‪PathUtility::basename($fileName) . '"')
153  ->withBody($this->streamFactory->createStreamFromFile($fileName));
154 
155  unlink($fileName);
156 
157  return $response;
158  }
159 
165  protected function ‪reloadExtensionDataAction($extension)
166  {
167  $extension = $this->installUtility->enrichExtensionWithDetails($extension, false);
168  $registryKey = ‪PathUtility::stripPathSitePrefix($extension['packagePath']) . 'ext_tables_static+adt.sql';
169 
170  $registry = GeneralUtility::makeInstance(Registry::class);
171  $registry->remove('extensionDataImport', $registryKey);
172 
173  $this->installUtility->processExtensionSetup($extension['key']);
174 
175  $this->‪redirect('index', 'List');
176  }
177 
184  protected function ‪createZipFileFromExtension(string $extensionKey): string
185  {
186  $extensionDetails = $this->installUtility->enrichExtensionWithDetails($extensionKey);
187  $extensionPath = $extensionDetails['packagePath'];
188 
189  // Add trailing slash to the extension path, getAllFilesAndFoldersInPath explicitly requires that.
190  $extensionPath = ‪PathUtility::sanitizeTrailingSeparator($extensionPath);
191 
192  $version = (string)$extensionDetails['version'];
193  if (empty($version)) {
194  $version = '0.0.0';
195  }
196 
197  $temporaryPath = ‪Environment::getVarPath() . '/transient/';
198  if (!@is_dir($temporaryPath)) {
199  ‪GeneralUtility::mkdir($temporaryPath);
200  }
201  $fileName = $temporaryPath . $extensionKey . '_' . $version . '_' . date('YmdHi', ‪$GLOBALS['EXEC_TIME']) . '.zip';
202 
203  $zip = new \ZipArchive();
204  $zip->open($fileName, \ZipArchive::CREATE);
205 
206  $excludePattern = ‪$GLOBALS['TYPO3_CONF_VARS']['EXT']['excludeForPackaging'];
207 
208  // Get all the files of the extension, but exclude the ones specified in the excludePattern
209  $files = GeneralUtility::getAllFilesAndFoldersInPath(
210  [], // No files pre-added
211  $extensionPath, // Start from here
212  '', // Do not filter files by extension
213  true, // Include subdirectories
214  PHP_INT_MAX, // Recursion level
215  $excludePattern // Files and directories to exclude.
216  );
217 
218  // Make paths relative to extension root directory.
219  $files = GeneralUtility::removePrefixPathFromList($files, $extensionPath);
220  $files = is_array($files) ? $files : [];
221 
222  // Remove the one empty path that is the extension dir itself.
223  $files = array_filter($files);
224 
225  foreach ($files as $file) {
226  $fullPath = $extensionPath . $file;
227  // Distinguish between files and directories, as creation of the archive
228  // fails on Windows when trying to add a directory with "addFile".
229  if (is_dir($fullPath)) {
230  $zip->addEmptyDir($file);
231  } else {
232  $zip->addFile($fullPath, $file);
233  }
234  }
235 
236  $zip->close();
237  return $fileName;
238  }
239 }
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\createZipFileFromExtension
‪string createZipFileFromExtension(string $extensionKey)
Definition: ActionController.php:184
‪TYPO3\CMS\Core\Package\Exception\PackageStatesFileNotWritableException
Definition: PackageStatesFileNotWritableException.php:23
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:25
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪ResponseInterface htmlResponse(string $html=null)
Definition: ActionController.php:1067
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility
Definition: LocalizationUtility.php:33
‪TYPO3\CMS\Core\Package\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Utility\PathUtility\stripPathSitePrefix
‪static string stripPathSitePrefix($path)
Definition: PathUtility.php:445
‪TYPO3\CMS\Core\Registry
Definition: Registry.php:33
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\$managementService
‪ExtensionManagementService $managementService
Definition: ActionController.php:42
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\createFromExtensionArray
‪static Extension createFromExtensionArray(array $extensionArray)
Definition: Extension.php:625
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\$installUtility
‪InstallUtility $installUtility
Definition: ActionController.php:41
‪TYPO3\CMS\Extensionmanager\Controller
Definition: AbstractController.php:16
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\addFlashMessage
‪addFlashMessage($messageBody, $messageTitle='', $severity=AbstractMessage::OK, $storeInSession=true)
Definition: ActionController.php:828
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\removeExtensionAction
‪ResponseInterface removeExtensionAction($extension)
Definition: ActionController.php:105
‪TYPO3\CMS\Core\Utility\PathUtility\basename
‪static string basename($path)
Definition: PathUtility.php:226
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:43
‪TYPO3\CMS\Extensionmanager\Utility\InstallUtility
Definition: InstallUtility.php:56
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\reloadExtensionDataAction
‪reloadExtensionDataAction($extension)
Definition: ActionController.php:165
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\toggleExtensionInstallationStateAction
‪toggleExtensionInstallationStateAction($extensionKey)
Definition: ActionController.php:57
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\installExtensionWithoutSystemDependencyCheckAction
‪installExtensionWithoutSystemDependencyCheckAction($extensionKey)
Definition: ActionController.php:93
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility\translate
‪static string null translate(string $key, ?string $extensionName=null, array $arguments=null, string $languageKey=null, array $alternativeLanguageKeys=null)
Definition: LocalizationUtility.php:67
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:23
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\__construct
‪__construct(InstallUtility $installUtility, ExtensionManagementService $managementService)
Definition: ActionController.php:44
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController
Definition: AbstractController.php:26
‪TYPO3\CMS\Core\Utility\PathUtility\sanitizeTrailingSeparator
‪static string sanitizeTrailingSeparator($path, $separator='/')
Definition: PathUtility.php:209
‪TYPO3\CMS\Extensionmanager\Service\ExtensionManagementService
Definition: ExtensionManagementService.php:36
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static bool isComposerMode()
Definition: Environment.php:152
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:26
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:43
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController
Definition: ActionController.php:65
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirect
‪never redirect($actionName, $controllerName=null, $extensionName=null, array $arguments=null, $pageUid=null, $_=null, $statusCode=303)
Definition: ActionController.php:940
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\getLoadedExtensionListArray
‪static array getLoadedExtensionListArray()
Definition: ExtensionManagementUtility.php:1830
‪TYPO3\CMS\Core\Package\Exception
Definition: InvalidPackageKeyException.php:16
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir($newFolder)
Definition: GeneralUtility.php:1891
‪TYPO3\CMS\Extensionmanager\Controller\ActionController\downloadExtensionZipAction
‪ResponseInterface downloadExtensionZipAction($extension)
Definition: ActionController.php:138
‪TYPO3\CMS\Core\Messaging\AbstractMessage\ERROR
‪const ERROR
Definition: AbstractMessage.php:31
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static string getVarPath()
Definition: Environment.php:218