‪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;
30 
35 class ‪FileHandlingUtility implements ‪SingletonInterface, LoggerAwareInterface
36 {
37  use LoggerAwareTrait;
38 
42  protected ‪$emConfUtility;
43 
47  protected ‪$installUtility;
48 
51 
52  public function ‪injectEmConfUtility(EmConfUtility ‪$emConfUtility)
53  {
54  $this->emConfUtility = ‪$emConfUtility;
55  }
56 
58  {
59  $this->installUtility = ‪$installUtility;
60  }
61 
63  {
64  $this->languageServiceFactory = ‪$languageServiceFactory;
65  }
66 
70  public function ‪initializeObject()
71  {
72  $this->languageService = $this->languageServiceFactory->createFromUserPreferences(‪$GLOBALS['BE_USER'] ?? null);
73  $this->languageService->includeLLFile('EXT:extensionmanager/Resources/Private/Language/locallang.xlf');
74  }
75 
81  public function ‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData, $pathType = 'Local')
82  {
83  $files = $extensionData['FILES'] ?? [];
84  $emConfData = $extensionData['EM_CONF'] ?? [];
85  $extensionDir = $this->‪makeAndClearExtensionDir($extensionKey, $pathType);
86  $directories = $this->‪extractDirectoriesFromExtensionData($files);
87  $files = array_diff_key($files, array_flip($directories));
88  $this->‪createDirectoriesForExtensionFiles($directories, $extensionDir);
89  $this->‪writeExtensionFiles($files, $extensionDir);
90  $this->‪writeEmConfToFile($extensionKey, $emConfData, $extensionDir);
91  $this->‪reloadPackageInformation($extensionKey);
92  }
93 
99  protected function ‪extractDirectoriesFromExtensionData(array $files)
100  {
101  $directories = [];
102  foreach ($files as $filePath => $file) {
103  preg_match('/(.*)\\//', $filePath, $matches);
104  if (!empty($matches[0])) {
105  $directories[] = $matches[0];
106  }
107  }
108  return array_unique($directories);
109  }
110 
115  protected function ‪createDirectoriesForExtensionFiles(array $directories, string $rootPath)
116  {
117  foreach ($directories as $directory) {
118  $this->‪createNestedDirectory($rootPath . $directory);
119  }
120  }
121 
128  protected function ‪createNestedDirectory($directory)
129  {
130  try {
131  ‪GeneralUtility::mkdir_deep($directory);
132  } catch (\RuntimeException $exception) {
133  throw new ExtensionManagerException(
134  sprintf($this->languageService->getLL('fileHandling.couldNotCreateDirectory'), $this->getRelativePath($directory)),
135  1337280416
136  );
137  }
138  }
139 
145  protected function ‪writeExtensionFiles(array $files, $rootPath)
146  {
147  foreach ($files as $file) {
148  ‪GeneralUtility::writeFile($rootPath . $file['name'], $file['content']);
149  }
150  }
151 
161  protected function ‪makeAndClearExtensionDir($extensionKey, $pathType = 'Local')
162  {
163  $extDirPath = $this->‪getExtensionDir($extensionKey, $pathType);
164  if (is_dir($extDirPath)) {
165  $this->‪removeDirectory($extDirPath);
166  }
167  $this->‪addDirectory($extDirPath);
168  return $extDirPath;
169  }
170 
179  public function ‪getExtensionDir($extensionKey, $pathType = 'Local')
180  {
182  $path = $paths[$pathType] ?? '';
183  if (!$path || !is_dir($path) || !$extensionKey) {
184  throw new ExtensionManagerException(
185  sprintf($this->languageService->getLL('fileHandling.installPathWasNoDirectory'), $this->getRelativePath($path)),
186  1337280417
187  );
188  }
189 
190  return $path . $extensionKey . '/';
191  }
192 
199  protected function ‪addDirectory($extDirPath)
200  {
201  ‪GeneralUtility::mkdir($extDirPath);
202  if (!is_dir($extDirPath)) {
203  throw new ExtensionManagerException(
204  sprintf($this->languageService->getLL('fileHandling.couldNotCreateDirectory'), $this->getRelativePath($extDirPath)),
205  1337280418
206  );
207  }
208  }
209 
216  public function ‪removeDirectory($extDirPath)
217  {
218  $extDirPath = GeneralUtility::fixWindowsFilePath($extDirPath);
219  $extensionPathWithoutTrailingSlash = rtrim($extDirPath, '/');
220  if (is_link($extensionPathWithoutTrailingSlash) && !‪Environment::isWindows()) {
221  $result = unlink($extensionPathWithoutTrailingSlash);
222  } else {
223  $result = ‪GeneralUtility::rmdir($extDirPath, true);
224  }
225  if ($result === false) {
226  throw new ExtensionManagerException(
227  sprintf($this->languageService->getLL('fileHandling.couldNotRemoveDirectory'), $this->getRelativePath($extDirPath)),
228  1337280415
229  );
230  }
231  }
232 
236  protected function ‪writeEmConfToFile(string $extensionKey, array $emConfData, string $rootPath)
237  {
238  $emConfContent = $this->emConfUtility->constructEmConf($extensionKey, $emConfData);
239  ‪GeneralUtility::writeFile($rootPath . 'ext_emconf.php', $emConfContent);
240  }
241 
245  protected function ‪getRelativePath(string $absolutePath): string
246  {
247  return ‪PathUtility::stripPathSitePrefix($absolutePath);
248  }
249 
258  public function ‪unzipExtensionFromFile($file, $fileName, $pathType = 'Local')
259  {
260  $extensionDir = $this->‪makeAndClearExtensionDir($fileName, $pathType);
261 
262  try {
263  $zipService = GeneralUtility::makeInstance(ZipService::class);
264  if ($zipService->verify($file)) {
265  $zipService->extract($file, $extensionDir);
266  }
267  } catch (ExtractException $e) {
268  $this->logger->error('Extracting the extension archive failed', ['exception' => $e]);
269  throw new ExtensionManagerException('Extracting the extension archive failed: ' . $e->getMessage(), 1565777179, $e);
270  }
271 
272  ‪GeneralUtility::fixPermissions($extensionDir, true);
273  }
274 
278  protected function ‪reloadPackageInformation($extensionKey)
279  {
280  $this->installUtility->reloadPackageInformation($extensionKey);
281  }
282 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\createNestedDirectory
‪createNestedDirectory($directory)
Definition: FileHandlingUtility.php:126
‪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:234
‪TYPO3\CMS\Extensionmanager\Utility
Definition: DependencyUtility.php:16
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\removeDirectory
‪removeDirectory($extDirPath)
Definition: FileHandlingUtility.php:214
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unzipExtensionFromFile
‪unzipExtensionFromFile($file, $fileName, $pathType='Local')
Definition: FileHandlingUtility.php:256
‪TYPO3\CMS\Core\Exception\Archive\ExtractException
Definition: ExtractException.php:26
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$languageService
‪LanguageService $languageService
Definition: FileHandlingUtility.php:48
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$installUtility
‪InstallUtility $installUtility
Definition: FileHandlingUtility.php:45
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getRelativePath
‪getRelativePath(string $absolutePath)
Definition: FileHandlingUtility.php:243
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:36
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\extractDirectoriesFromExtensionData
‪array extractDirectoriesFromExtensionData(array $files)
Definition: FileHandlingUtility.php:97
‪TYPO3\CMS\Extensionmanager\Utility\InstallUtility
Definition: InstallUtility.php:55
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\initializeObject
‪initializeObject()
Definition: FileHandlingUtility.php:68
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixPermissions
‪static mixed fixPermissions($path, $recursive=false)
Definition: GeneralUtility.php:1594
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1753
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$languageServiceFactory
‪LanguageServiceFactory $languageServiceFactory
Definition: FileHandlingUtility.php:47
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\injectInstallUtility
‪injectInstallUtility(InstallUtility $installUtility)
Definition: FileHandlingUtility.php:55
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\$emConfUtility
‪EmConfUtility $emConfUtility
Definition: FileHandlingUtility.php:41
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:24
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\createDirectoriesForExtensionFiles
‪createDirectoriesForExtensionFiles(array $directories, string $rootPath)
Definition: FileHandlingUtility.php:113
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\reloadPackageInformation
‪reloadPackageInformation($extensionKey)
Definition: FileHandlingUtility.php:276
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\makeAndClearExtensionDir
‪string makeAndClearExtensionDir($extensionKey, $pathType='Local')
Definition: FileHandlingUtility.php:159
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\unpackExtensionFromExtensionDataArray
‪unpackExtensionFromExtensionDataArray(string $extensionKey, array $extensionData, $pathType='Local')
Definition: FileHandlingUtility.php:79
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\injectLanguageServiceFactory
‪injectLanguageServiceFactory(LanguageServiceFactory $languageServiceFactory)
Definition: FileHandlingUtility.php:60
‪TYPO3\CMS\Core\Service\Archive\ZipService
Definition: ZipService.php:29
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\getExtensionDir
‪string getExtensionDir($extensionKey, $pathType='Local')
Definition: FileHandlingUtility.php:177
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:23
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\addDirectory
‪addDirectory($extDirPath)
Definition: FileHandlingUtility.php:197
‪TYPO3\CMS\Core\Utility\GeneralUtility\rmdir
‪static bool rmdir($path, $removeNonEmpty=false)
Definition: GeneralUtility.php:1806
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\writeExtensionFiles
‪writeExtensionFiles(array $files, $rootPath)
Definition: FileHandlingUtility.php:143
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility\injectEmConfUtility
‪injectEmConfUtility(EmConfUtility $emConfUtility)
Definition: FileHandlingUtility.php:50
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir($newFolder)
Definition: GeneralUtility.php:1736
‪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:1567
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static isWindows()
Definition: Environment.php:287