‪TYPO3CMS  ‪main
FileHandlingUtility.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\Log\LoggerAwareInterface;
19 use Psr\Log\LoggerAwareTrait;
24 use TYPO3\CMS\Core\Package\PackageManager;
31 
37 class ‪FileHandlingUtility implements LoggerAwareInterface
38 {
39  use LoggerAwareTrait;
40 
42 
43  public function ‪__construct(
44  private readonly PackageManager $packageManager,
45  private readonly EmConfUtility $emConfUtility,
46  private readonly ‪OpcodeCacheService $opcodeCacheService,
47  private readonly ‪ZipService $zipService,
48  ‪LanguageServiceFactory $languageServiceFactory,
49  ) {
50  $this->languageService = $languageServiceFactory->‪createFromUserPreferences(‪$GLOBALS['BE_USER'] ?? null);
51  }
52 
56  public function ‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData, string $pathType = 'Local'): void
57  {
58  $files = $extensionData['FILES'] ?? [];
59  $emConfData = $extensionData['EM_CONF'] ?? [];
60  $extensionDir = $this->‪makeAndClearExtensionDir($extensionKey, $pathType);
61  $directories = $this->‪extractDirectoriesFromExtensionData($files);
62  $files = array_diff_key($files, array_flip($directories));
63  $this->‪createDirectoriesForExtensionFiles($directories, $extensionDir);
64  $this->‪writeExtensionFiles($files, $extensionDir);
65  $this->‪writeEmConfToFile($extensionKey, $emConfData, $extensionDir);
66  $this->‪reloadPackageInformation($extensionKey);
67  }
68 
75  public function ‪getExtensionDir(string $extensionKey, string $pathType = 'Local'): string
76  {
78  $path = $paths[$pathType] ?? '';
79  if (!$path || !is_dir($path) || !$extensionKey) {
81  sprintf(
82  $this->languageService->sL('LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.installPathWasNoDirectory'),
83  $this->getRelativePath($path)
84  ),
85  1337280417
86  );
87  }
88  return $path . $extensionKey . '/';
89  }
90 
96  public function ‪removeDirectory(string $extDirPath): void
97  {
98  $extDirPath = GeneralUtility::fixWindowsFilePath($extDirPath);
99  $extensionPathWithoutTrailingSlash = rtrim($extDirPath, '/');
100  if (is_link($extensionPathWithoutTrailingSlash) && !‪Environment::isWindows()) {
101  $result = unlink($extensionPathWithoutTrailingSlash);
102  } else {
103  $result = ‪GeneralUtility::rmdir($extDirPath, true);
104  }
105  if ($result === false) {
107  sprintf(
108  $this->languageService->sL(
109  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotRemoveDirectory'
110  ),
111  $this->getRelativePath($extDirPath)
112  ),
113  1337280415
114  );
115  }
116  }
117 
126  public function ‪unzipExtensionFromFile(string $file, string $fileName, string $pathType = 'Local'): void
127  {
128  $extensionDir = $this->‪makeAndClearExtensionDir($fileName, $pathType);
129  try {
130  if ($this->zipService->verify($file)) {
131  $this->zipService->extract($file, $extensionDir);
132  }
133  } catch (‪ExtractException $e) {
134  $this->logger->error('Extracting the extension archive failed', ['exception' => $e]);
135  throw new ‪ExtensionManagerException('Extracting the extension archive failed: ' . $e->getMessage(), 1565777179, $e);
136  }
137  ‪GeneralUtility::fixPermissions($extensionDir, true);
138  }
139 
143  protected function ‪extractDirectoriesFromExtensionData(array $files): array
144  {
145  $directories = [];
146  foreach ($files as $filePath => $file) {
147  preg_match('/(.*)\\//', $filePath, $matches);
148  if (!empty($matches[0])) {
149  $directories[] = $matches[0];
150  }
151  }
152  return array_unique($directories);
153  }
154 
161  protected function ‪createDirectoriesForExtensionFiles(array $directories, string $rootPath): void
162  {
163  foreach ($directories as $directory) {
164  $fullPath = $rootPath . $directory;
165  try {
167  } catch (\RuntimeException) {
169  sprintf(
170  $this->languageService->sL(
171  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotCreateDirectory'
172  ),
173  $this->getRelativePath($fullPath)
174  ),
175  1337280416
176  );
177  }
178  }
179  }
180 
184  protected function ‪writeExtensionFiles(array $files, string $rootPath): void
185  {
186  foreach ($files as $file) {
187  ‪GeneralUtility::writeFile($rootPath . $file['name'], $file['content']);
188  }
189  }
190 
198  protected function ‪makeAndClearExtensionDir(string $extensionKey, string $pathType = 'Local'): string
199  {
200  $extDirPath = $this->‪getExtensionDir($extensionKey, $pathType);
201  if (is_dir($extDirPath)) {
202  $this->‪removeDirectory($extDirPath);
203  }
204  $this->‪addDirectory($extDirPath);
205  return $extDirPath;
206  }
207 
213  protected function ‪addDirectory(string $extDirPath): void
214  {
215  ‪GeneralUtility::mkdir($extDirPath);
216  if (!is_dir($extDirPath)) {
218  sprintf(
219  $this->languageService->sL(
220  'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:fileHandling.couldNotCreateDirectory'
221  ),
222  $this->getRelativePath($extDirPath)
223  ),
224  1337280418
225  );
226  }
227  }
228 
232  protected function ‪writeEmConfToFile(string $extensionKey, array $emConfData, string $rootPath): void
233  {
234  $emConfContent = $this->emConfUtility->constructEmConf($extensionKey, $emConfData);
235  ‪GeneralUtility::writeFile($rootPath . 'ext_emconf.php', $emConfContent);
236  }
237 
241  protected function ‪getRelativePath(string $absolutePath): string
242  {
243  return ‪PathUtility::stripPathSitePrefix($absolutePath);
244  }
245 
246  protected function ‪reloadPackageInformation(string $extensionKey): void
247  {
248  if ($this->packageManager->isPackageAvailable($extensionKey)) {
249  $this->opcodeCacheService->clearAllActive();
250  $this->packageManager->reloadPackageInformation($extensionKey);
251  }
252  }
253 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪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:232
‪TYPO3\CMS\Extensionmanager\Utility
Definition: DependencyUtility.php:16
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unzipExtensionFromFile
‪unzipExtensionFromFile(string $file, string $fileName, string $pathType='Local')
Definition: FileHandlingUtility.php:126
‪TYPO3\CMS\Core\Exception\Archive\ExtractException
Definition: ExtractException.php:26
‪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:43
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$languageService
‪LanguageService $languageService
Definition: FileHandlingUtility.php:41
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getRelativePath
‪getRelativePath(string $absolutePath)
Definition: FileHandlingUtility.php:241
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:38
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\reloadPackageInformation
‪reloadPackageInformation(string $extensionKey)
Definition: FileHandlingUtility.php:246
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixPermissions
‪static mixed fixPermissions($path, $recursive=false)
Definition: GeneralUtility.php:1479
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:24
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\createDirectoriesForExtensionFiles
‪createDirectoriesForExtensionFiles(array $directories, string $rootPath)
Definition: FileHandlingUtility.php:161
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unpackExtensionFromExtensionDataArray
‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData, string $pathType='Local')
Definition: FileHandlingUtility.php:56
‪TYPO3\CMS\Core\Service\OpcodeCacheService
Definition: OpcodeCacheService.php:27
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\addDirectory
‪addDirectory(string $extDirPath)
Definition: FileHandlingUtility.php:213
‪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\Utility\GeneralUtility\rmdir
‪static bool rmdir($path, $removeNonEmpty=false)
Definition: GeneralUtility.php:1691
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\makeAndClearExtensionDir
‪makeAndClearExtensionDir(string $extensionKey, string $pathType='Local')
Definition: FileHandlingUtility.php:198
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\removeDirectory
‪removeDirectory(string $extDirPath)
Definition: FileHandlingUtility.php:96
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir($newFolder)
Definition: GeneralUtility.php:1621
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory\createFromUserPreferences
‪createFromUserPreferences(?AbstractUserAuthentication $user)
Definition: LanguageServiceFactory.php:52
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\returnInstallPaths
‪static array returnInstallPaths()
Definition: Extension.php:438
‪TYPO3\CMS\Core\Utility\GeneralUtility\writeFile
‪static bool writeFile($file, $content, $changePermissions=false)
Definition: GeneralUtility.php:1452
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\writeExtensionFiles
‪writeExtensionFiles(array $files, string $rootPath)
Definition: FileHandlingUtility.php:184
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\extractDirectoriesFromExtensionData
‪extractDirectoriesFromExtensionData(array $files)
Definition: FileHandlingUtility.php:143
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static isWindows()
Definition: Environment.php:276
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getExtensionDir
‪getExtensionDir(string $extensionKey, string $pathType='Local')
Definition: FileHandlingUtility.php:75