‪TYPO3CMS  ‪main
FileHandlingUtility.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\Log\LoggerAwareInterface;
21 use Psr\Log\LoggerAwareTrait;
26 use TYPO3\CMS\Core\Package\PackageManager;
33 
39 class ‪FileHandlingUtility implements LoggerAwareInterface
40 {
41  use LoggerAwareTrait;
42 
44 
45  public function ‪__construct(
46  private readonly PackageManager $packageManager,
47  private readonly EmConfUtility $emConfUtility,
48  private readonly ‪OpcodeCacheService $opcodeCacheService,
49  private readonly ‪ZipService $zipService,
50  ‪LanguageServiceFactory $languageServiceFactory,
51  ) {
52  $this->languageService = $languageServiceFactory->‪createFromUserPreferences(‪$GLOBALS['BE_USER'] ?? null);
53  }
54 
58  public function ‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData): void
59  {
60  $files = $extensionData['FILES'] ?? [];
61  $emConfData = $extensionData['EM_CONF'] ?? [];
62  $extensionDir = $this->‪makeAndClearExtensionDir($extensionKey);
63  $directories = $this->‪extractDirectoriesFromExtensionData($files);
64  $files = array_diff_key($files, array_flip($directories));
65  $this->‪createDirectoriesForExtensionFiles($directories, $extensionDir);
66  $this->‪writeExtensionFiles($files, $extensionDir);
67  $this->‪writeEmConfToFile($extensionKey, $emConfData, $extensionDir);
68  $this->‪reloadPackageInformation($extensionKey);
69  }
70 
74  public function ‪getExtensionDir(string $extensionKey): string
75  {
77  $path = $paths['Local'] ?? '';
78  if (!$path || !is_dir($path) || !$extensionKey) {
80  sprintf(
81  $this->languageService->sL('LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.installPathWasNoDirectory'),
82  $this->getRelativePath($path)
83  ),
84  1337280417
85  );
86  }
87  return $path . $extensionKey . '/';
88  }
89 
93  public function ‪removeDirectory(string $extDirPath): void
94  {
95  $extDirPath = GeneralUtility::fixWindowsFilePath($extDirPath);
96  $extensionPathWithoutTrailingSlash = rtrim($extDirPath, '/');
97  if (is_link($extensionPathWithoutTrailingSlash) && !‪Environment::isWindows()) {
98  $result = unlink($extensionPathWithoutTrailingSlash);
99  } else {
100  $result = ‪GeneralUtility::rmdir($extDirPath, true);
101  }
102  if ($result === false) {
104  sprintf(
105  $this->languageService->sL(
106  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotRemoveDirectory'
107  ),
108  $this->getRelativePath($extDirPath)
109  ),
110  1337280415
111  );
112  }
113  }
114 
121  public function ‪unzipExtensionFromFile(string $file, string $fileName): void
122  {
123  $extensionDir = $this->‪makeAndClearExtensionDir($fileName);
124  try {
125  if ($this->zipService->verify($file)) {
126  $this->zipService->extract($file, $extensionDir);
127  }
128  } catch (‪ExtractException $e) {
129  $this->logger->error('Extracting the extension archive failed', ['exception' => $e]);
130  throw new ‪ExtensionManagerException('Extracting the extension archive failed: ' . $e->getMessage(), 1565777179, $e);
131  }
132  ‪GeneralUtility::fixPermissions($extensionDir, true);
133  }
134 
138  protected function ‪extractDirectoriesFromExtensionData(array $files): array
139  {
140  $directories = [];
141  foreach ($files as $filePath => $file) {
142  preg_match('/(.*)\\//', $filePath, $matches);
143  if (!empty($matches[0])) {
144  $directories[] = $matches[0];
145  }
146  }
147  return array_unique($directories);
148  }
149 
154  protected function ‪createDirectoriesForExtensionFiles(array $directories, string $rootPath): void
155  {
156  foreach ($directories as $directory) {
157  $fullPath = $rootPath . $directory;
158  try {
160  } catch (\RuntimeException) {
162  sprintf(
163  $this->languageService->sL(
164  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotCreateDirectory'
165  ),
166  $this->getRelativePath($fullPath)
167  ),
168  1337280416
169  );
170  }
171  }
172  }
173 
177  protected function ‪writeExtensionFiles(array $files, string $rootPath): void
178  {
179  foreach ($files as $file) {
180  ‪GeneralUtility::writeFile($rootPath . $file['name'], $file['content']);
181  }
182  }
183 
188  protected function ‪makeAndClearExtensionDir(string $extensionKey): string
189  {
190  $extDirPath = $this->‪getExtensionDir($extensionKey);
191  if (is_dir($extDirPath)) {
192  $this->‪removeDirectory($extDirPath);
193  }
194  $this->‪addDirectory($extDirPath);
195  return $extDirPath;
196  }
197 
201  protected function ‪addDirectory(string $extDirPath): void
202  {
203  ‪GeneralUtility::mkdir($extDirPath);
204  if (!is_dir($extDirPath)) {
206  sprintf(
207  $this->languageService->sL(
208  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotCreateDirectory'
209  ),
210  $this->getRelativePath($extDirPath)
211  ),
212  1337280418
213  );
214  }
215  }
216 
220  protected function ‪writeEmConfToFile(string $extensionKey, array $emConfData, string $rootPath): void
221  {
222  $emConfContent = $this->emConfUtility->constructEmConf($extensionKey, $emConfData);
223  ‪GeneralUtility::writeFile($rootPath . 'ext_emconf.php', $emConfContent);
224  }
225 
226  protected function ‪getRelativePath(string $absolutePath): string
227  {
228  return ‪PathUtility::stripPathSitePrefix($absolutePath);
229  }
230 
231  protected function ‪reloadPackageInformation(string $extensionKey): void
232  {
233  if ($this->packageManager->isPackageAvailable($extensionKey)) {
234  $this->opcodeCacheService->clearAllActive();
235  $this->packageManager->reloadPackageInformation($extensionKey);
236  }
237  }
238 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir(string $newFolder)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Core\Utility\PathUtility\stripPathSitePrefix
‪static stripPathSitePrefix(string $path)
Definition: PathUtility.php:428
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\writeEmConfToFile
‪writeEmConfToFile(string $extensionKey, array $emConfData, string $rootPath)
Definition: FileHandlingUtility.php:220
‪TYPO3\CMS\Extensionmanager\Utility
Definition: DependencyUtility.php:18
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:30
‪TYPO3\CMS\Core\Exception\Archive\ExtractException
Definition: ExtractException.php:25
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\__construct
‪__construct(private readonly PackageManager $packageManager, private readonly EmConfUtility $emConfUtility, private readonly OpcodeCacheService $opcodeCacheService, private readonly ZipService $zipService, LanguageServiceFactory $languageServiceFactory,)
Definition: FileHandlingUtility.php:45
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$languageService
‪LanguageService $languageService
Definition: FileHandlingUtility.php:43
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unpackExtensionFromExtensionDataArray
‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData)
Definition: FileHandlingUtility.php:58
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unzipExtensionFromFile
‪unzipExtensionFromFile(string $file, string $fileName)
Definition: FileHandlingUtility.php:121
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getRelativePath
‪getRelativePath(string $absolutePath)
Definition: FileHandlingUtility.php:226
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep(string $directory)
Definition: GeneralUtility.php:1654
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:40
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\reloadPackageInformation
‪reloadPackageInformation(string $extensionKey)
Definition: FileHandlingUtility.php:231
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getExtensionDir
‪getExtensionDir(string $extensionKey)
Definition: FileHandlingUtility.php:74
‪TYPO3\CMS\Core\Utility\GeneralUtility\writeFile
‪static bool writeFile(string $file, string $content, bool $changePermissions=false)
Definition: GeneralUtility.php:1469
‪TYPO3\CMS\Core\Utility\GeneralUtility\rmdir
‪static bool rmdir(string $path, bool $removeNonEmpty=false)
Definition: GeneralUtility.php:1702
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:25
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\createDirectoriesForExtensionFiles
‪createDirectoriesForExtensionFiles(array $directories, string $rootPath)
Definition: FileHandlingUtility.php:154
‪TYPO3\CMS\Core\Service\OpcodeCacheService
Definition: OpcodeCacheService.php:27
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixPermissions
‪static bool fixPermissions(string $path, bool $recursive=false)
Definition: GeneralUtility.php:1496
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\returnInstallPaths
‪static returnInstallPaths()
Definition: Extension.php:297
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\addDirectory
‪addDirectory(string $extDirPath)
Definition: FileHandlingUtility.php:201
‪TYPO3\CMS\Core\Service\Archive\ZipService
Definition: ZipService.php:29
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\removeDirectory
‪removeDirectory(string $extDirPath)
Definition: FileHandlingUtility.php:93
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory\createFromUserPreferences
‪createFromUserPreferences(?AbstractUserAuthentication $user)
Definition: LanguageServiceFactory.php:44
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\makeAndClearExtensionDir
‪makeAndClearExtensionDir(string $extensionKey)
Definition: FileHandlingUtility.php:188
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\writeExtensionFiles
‪writeExtensionFiles(array $files, string $rootPath)
Definition: FileHandlingUtility.php:177
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\extractDirectoriesFromExtensionData
‪extractDirectoriesFromExtensionData(array $files)
Definition: FileHandlingUtility.php:138
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static isWindows()
Definition: Environment.php:276