‪TYPO3CMS  11.5
ImageMagickFileTest.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 org\bovigo\vfs\vfsStream;
21 use org\bovigo\vfs\vfsStreamDirectory;
26 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
27 
28 class ‪ImageMagickFileTest extends FunctionalTestCase
29 {
33  protected ‪$initializeDatabase = false;
34 
38  private ‪$directory;
39 
40  protected function ‪setUp(): void
41  {
42  parent::setUp();
43 
44  $fixturePath = __DIR__ . '/Fixtures';
45  $structure = [];
46  $this->‪addFiles($structure, ['file.ai', 'file.ai.jpg'], $fixturePath . '/file.ai');
47  $this->‪addFiles($structure, ['file.bmp', 'file.bmp.jpg'], $fixturePath . '/file.bmp');
48  $this->‪addFiles($structure, ['file.gif', 'file.gif.jpg'], $fixturePath . '/file.gif');
49  $this->‪addFiles($structure, ['file.fax', 'file.fax.jpg'], $fixturePath . '/file.fax');
50  $this->‪addFiles($structure, ['file.jpg', 'file.jpg.png'], $fixturePath . '/file.jpg');
51  $this->‪addFiles($structure, ['file.png', 'file.png.jpg'], $fixturePath . '/file.png');
52  $this->‪addFiles($structure, ['file.svg', 'file.svg.jpg'], $fixturePath . '/file.svg');
53  $this->‪addFiles($structure, ['file.tif', 'file.tif.jpg'], $fixturePath . '/file.tif');
54  $this->‪addFiles($structure, ['file.webp', 'file.webp.jpg'], $fixturePath . '/file.webp');
55  $this->‪addFiles($structure, ['file.pdf', 'file.pdf.jpg'], $fixturePath . '/file.pdf');
56  $this->‪addFiles($structure, ['file.ps', 'file.ps.jpg'], $fixturePath . '/file.ps');
57  $this->‪addFiles($structure, ['file.eps', 'file.eps.jpg'], $fixturePath . '/file.eps');
58  $this->directory = vfsStream::setup('root', null, $structure);
59  }
60 
61  protected function ‪tearDown(): void
62  {
63  unset($this->directory);
64  parent::tearDown();
65  }
66 
70  public function ‪framesAreConsideredDataProvider(): array
71  {
72  return [
73  'file.pdf' => ['file.pdf', null, '\'pdf:{directory}/file.pdf\''],
74  'file.pdf[0]' => ['file.pdf', 0, '\'pdf:{directory}/file.pdf[0]\''],
75  ];
76  }
77 
86  public function ‪framesAreConsidered(string $fileName, ?int $frame, string $expectation): void
87  {
88  $expectation = $this->‪substituteVariables($expectation);
89  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
90  $file = ‪ImageMagickFile::fromFilePath($filePath, $frame);
91  self::assertSame($expectation, (string)$file);
92  }
93 
97  public function ‪resultIsEscapedDataProvider(): array
98  {
99  // probably Windows system
100  if (DIRECTORY_SEPARATOR === '\\') {
101  return [
102  'without frame' => ['file.pdf', null, '"pdf:{directory}/file.pdf"'],
103  'with first frame' => ['file.pdf', 0, '"pdf:{directory}/file.pdf[0]"'],
104  'special literals' => ['\'`%$!".png', 0, '"png:{directory}/\'` $ .png[0]"'],
105  ];
106  }
107  // probably Unix system
108  return [
109  'without frame' => ['file.pdf', null, '\'pdf:{directory}/file.pdf\''],
110  'with first frame' => ['file.pdf', 0, '\'pdf:{directory}/file.pdf[0]\''],
111  'special literals' => ['\'`%$!".png', 0, '\'png:{directory}/\'\\\'\'`%$!".png[0]\''],
112  ];
113  }
114 
123  public function ‪resultIsEscaped(string $fileName, ?int $frame, string $expectation): void
124  {
125  $expectation = $this->‪substituteVariables($expectation);
126  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
127  $file = ‪ImageMagickFile::fromFilePath($filePath, $frame);
128  self::assertSame($expectation, (string)$file);
129  }
130 
134  public function ‪fileStatementIsResolvedDataProvider(): array
135  {
136  return [
137  'file.ai' => ['file.ai', '\'pdf:{directory}/file.ai\''],
138  'file.ai.jpg' => ['file.ai.jpg', '\'pdf:{directory}/file.ai.jpg\''],
139  'file.gif' => ['file.gif', '\'gif:{directory}/file.gif\''],
140  'file.gif.jpg' => ['file.gif.jpg', '\'gif:{directory}/file.gif.jpg\''],
141  'file.jpg' => ['file.jpg', '\'jpg:{directory}/file.jpg\''],
142  'file.jpg.png' => ['file.jpg.png', '\'jpg:{directory}/file.jpg.png\''],
143  'file.png' => ['file.png', '\'png:{directory}/file.png\''],
144  'file.png.jpg' => ['file.png.jpg', '\'png:{directory}/file.png.jpg\''],
145  'file.svg' => ['file.svg', '\'svg:{directory}/file.svg\''],
146  'file.svg.jpg' => ['file.svg.jpg', '\'svg:{directory}/file.svg.jpg\''],
147  'file.tif' => ['file.tif', '\'tif:{directory}/file.tif\''],
148  'file.tif.jpg' => ['file.tif.jpg', '\'tif:{directory}/file.tif.jpg\''],
149  'file.webp' => ['file.webp', '\'webp:{directory}/file.webp\''],
150  'file.webp.jpg' => ['file.webp.jpg', '\'webp:{directory}/file.webp.jpg\''],
151  'file.pdf' => ['file.pdf', '\'pdf:{directory}/file.pdf\''],
152  'file.pdf.jpg' => ['file.pdf.jpg', '\'pdf:{directory}/file.pdf.jpg\''],
153  // accepted, since postscript files are converted using 'jpg:' format
154  'file.ps.jpg' => ['file.ps.jpg', '\'jpg:{directory}/file.ps.jpg\''],
155  'file.eps.jpg' => ['file.eps.jpg', '\'jpg:{directory}/file.eps.jpg\''],
156  ];
157  }
158 
166  public function ‪fileStatementIsResolved(string $fileName, string $expectation): void
167  {
168  $expectation = $this->‪substituteVariables($expectation);
169  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
170  $file = ‪ImageMagickFile::fromFilePath($filePath, null);
171  self::assertSame($expectation, (string)$file);
172  }
173 
181  {
182  return [
183  'file.ai.jpg' => ['file.ai.jpg', '\'jpg:{directory}/file.ai.jpg\'', 'inode/x-empty'],
184  'file.bmp.jpg' => ['file.bmp.jpg', '\'jpg:{directory}/file.bmp.jpg\'', 'inode/x-empty'],
185  'file.fax.jpg' => ['file.fax.jpg', '\'jpg:{directory}/file.fax.jpg\'', 'inode/x-empty'],
186  'file.gif.jpg' => ['file.gif.jpg', '\'jpg:{directory}/file.gif.jpg\'', 'inode/x-empty'],
187  'file.jpg' => ['file.jpg', '\'jpg:{directory}/file.jpg\'', 'inode/x-empty'],
188  'file.jpg.png' => ['file.jpg.png', '\'png:{directory}/file.jpg.png\'', 'inode/x-empty'],
189  'file.png' => ['file.png', '\'png:{directory}/file.png\'', 'inode/x-empty'],
190  'file.png.jpg' => ['file.png.jpg', '\'jpg:{directory}/file.png.jpg\'', 'inode/x-empty'],
191  'file.svg.jpg' => ['file.svg.jpg', '\'jpg:{directory}/file.svg.jpg\'', 'inode/x-empty'],
192  'file.tif' => ['file.tif', '\'tif:{directory}/file.tif\'', 'inode/x-empty'],
193  'file.tif.jpg' => ['file.tif.jpg', '\'jpg:{directory}/file.tif.jpg\'', 'inode/x-empty'],
194  'file.webp' => ['file.webp', '\'webp:{directory}/file.webp\'', 'inode/x-empty'],
195  'file.webp.jpg' => ['file.webp.jpg', '\'jpg:{directory}/file.webp.jpg\'', 'inode/x-empty'],
196  'file.pdf.jpg' => ['file.pdf.jpg', '\'jpg:{directory}/file.pdf.jpg\'', 'inode/x-empty'],
197  ];
198  }
199 
208  public function ‪fileStatementIsResolvedForEnforcedMimeType(string $fileName, string $expectation, string $mimeType): void
209  {
210  $this->‪simulateNextFileInfoInvocation($mimeType);
211  $expectation = $this->‪substituteVariables($expectation);
212  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
213  $file = ‪ImageMagickFile::fromFilePath($filePath, null);
214  self::assertSame($expectation, (string)$file);
215  }
216 
221  {
222  return [
223  'file.fax' => ['file.fax', '\'g3:{directory}/file.fax\''],
224  'file.bmp' => ['file.bmp', '\'dib:{directory}/file.bmp\''],
225  ];
226  }
227 
235  public function ‪fileStatementIsResolvedForConfiguredMimeType(string $fileName, string $expectation): void
236  {
237  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['g3'] = 'image/g3fax';
238  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['fax'] = 'image/g3fax';
239  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['dib'] = 'image/x-ms-bmp';
240  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['bmp'] = 'image/x-ms-bmp';
241 
242  $expectation = $this->‪substituteVariables($expectation);
243  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
244  $file = ‪ImageMagickFile::fromFilePath($filePath, null);
245  self::assertSame($expectation, (string)$file);
246  }
247 
251  public function ‪fileStatementIsDeniedDataProvider(): array
252  {
253  return [
254  'file.ps' => ['file.ps'],
255  'file.eps' => ['file.eps'],
256  // denied since not defined in allowed extensions
257  'file.ai' => ['file.ai', 'inode/x-empty'],
258  'file.svg' => ['file.svg', 'inode/x-empty'],
259  'file.pdf' => ['file.pdf', 'inode/x-empty'],
260  ];
261  }
262 
270  public function ‪fileStatementIsDenied(string $fileName, string $mimeType = null): void
271  {
272  $this->expectException(Exception::class);
273  $this->expectExceptionCode(1550060977);
274 
275  if ($mimeType !== null) {
276  $this->‪simulateNextFileInfoInvocation($mimeType);
277  }
278 
279  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
280  ‪ImageMagickFile::fromFilePath($filePath, null);
281  }
282 
287  {
288  return [
289  'file.ps' => ['file.ps'],
290  'file.eps' => ['file.eps'],
291  ];
292  }
293 
300  public function ‪fileStatementIsDeniedForConfiguredMimeType(string $fileName): void
301  {
302  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['ps'] = 'image/x-see-no-evil';
303  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['eps'] = 'image/x-see-no-evil';
304 
305  $this->expectException(Exception::class);
306  $this->expectExceptionCode(1550060977);
307 
308  $filePath = sprintf('%s/%s', $this->directory->url(), $fileName);
309  ‪ImageMagickFile::fromFilePath($filePath, null);
310  }
311 
317  private function ‪addFiles(array &$structure, array $fileNames, string $sourcePath): void
318  {
319  $structure = array_merge(
320  $structure,
321  array_fill_keys(
322  $fileNames,
323  file_get_contents($sourcePath)
324  )
325  );
326  }
327 
332  private function ‪substituteVariables(string $value): string
333  {
334  return str_replace(
335  ['{directory}'],
336  [$this->directory->url()],
337  $value
338  );
339  }
340 
345  private function ‪simulateNextFileInfoInvocation(string $mimeType, array $mimeExtensions = []): void
346  {
347  $fileInfo = $this->getAccessibleMock(
348  FileInfo::class,
349  ['getMimeType', 'getMimeExtensions'],
350  [],
351  '',
352  false
353  );
354  $fileInfo->expects(self::atLeastOnce())->method('getMimeType')->willReturn($mimeType);
355  $fileInfo->expects(self::atLeastOnce())->method('getMimeExtensions')->willReturn($mimeExtensions);
356  GeneralUtility::addInstance(FileInfo::class, $fileInfo);
357  }
358 }
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForConfiguredMimeType
‪fileStatementIsResolvedForConfiguredMimeType(string $fileName, string $expectation)
Definition: ImageMagickFileTest.php:233
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\resultIsEscaped
‪resultIsEscaped(string $fileName, ?int $frame, string $expectation)
Definition: ImageMagickFileTest.php:121
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForEnforcedMimeTypeDataProvider
‪array fileStatementIsResolvedForEnforcedMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:178
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForEnforcedMimeType
‪fileStatementIsResolvedForEnforcedMimeType(string $fileName, string $expectation, string $mimeType)
Definition: ImageMagickFileTest.php:206
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\framesAreConsideredDataProvider
‪array framesAreConsideredDataProvider()
Definition: ImageMagickFileTest.php:68
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\$directory
‪vfsStreamDirectory $directory
Definition: ImageMagickFileTest.php:36
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDenied
‪fileStatementIsDenied(string $fileName, string $mimeType=null)
Definition: ImageMagickFileTest.php:268
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedDataProvider
‪array fileStatementIsResolvedDataProvider()
Definition: ImageMagickFileTest.php:132
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForConfiguredMimeTypeDataProvider
‪array fileStatementIsResolvedForConfiguredMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:218
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedForConfiguredMimeType
‪fileStatementIsDeniedForConfiguredMimeType(string $fileName)
Definition: ImageMagickFileTest.php:298
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\tearDown
‪tearDown()
Definition: ImageMagickFileTest.php:59
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolved
‪fileStatementIsResolved(string $fileName, string $expectation)
Definition: ImageMagickFileTest.php:164
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\addFiles
‪addFiles(array &$structure, array $fileNames, string $sourcePath)
Definition: ImageMagickFileTest.php:315
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\framesAreConsidered
‪framesAreConsidered(string $fileName, ?int $frame, string $expectation)
Definition: ImageMagickFileTest.php:84
‪TYPO3\CMS\Core\Tests\Functional\Imaging
Definition: IconFactoryTest.php:18
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\$initializeDatabase
‪bool $initializeDatabase
Definition: ImageMagickFileTest.php:32
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\substituteVariables
‪string substituteVariables(string $value)
Definition: ImageMagickFileTest.php:330
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\resultIsEscapedDataProvider
‪array resultIsEscapedDataProvider()
Definition: ImageMagickFileTest.php:95
‪TYPO3\CMS\Core\Imaging\ImageMagickFile\fromFilePath
‪static ImageMagickFile fromFilePath(string $filePath, int $frame=null)
Definition: ImageMagickFile.php:113
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedDataProvider
‪array fileStatementIsDeniedDataProvider()
Definition: ImageMagickFileTest.php:249
‪TYPO3\CMS\Core\Imaging\ImageMagickFile
Definition: ImageMagickFile.php:30
‪TYPO3\CMS\Core\Type\File\FileInfo
Definition: FileInfo.php:25
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedForConfiguredMimeTypeDataProvider
‪array fileStatementIsDeniedForConfiguredMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:284
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest
Definition: ImageMagickFileTest.php:29
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\simulateNextFileInfoInvocation
‪simulateNextFileInfoInvocation(string $mimeType, array $mimeExtensions=[])
Definition: ImageMagickFileTest.php:343
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\setUp
‪setUp()
Definition: ImageMagickFileTest.php:38