‪TYPO3CMS  ‪main
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 PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
26 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
27 
28 final class ‪ImageMagickFileTest extends FunctionalTestCase
29 {
30  protected bool ‪$initializeDatabase = false;
31 
32  public static function ‪framesAreConsideredDataProvider(): array
33  {
34  return [
35  'file.pdf' => ['file.pdf', null, '\'pdf:{directory}/file.pdf\''],
36  'file.pdf[0]' => ['file.pdf', 0, '\'pdf:{directory}/file.pdf[0]\''],
37  ];
38  }
39 
40  #[DataProvider('framesAreConsideredDataProvider')]
41  #[Test]
42  public function ‪framesAreConsidered(string $fileName, ?int $frame, string $expectation): void
43  {
44  $expectation = $this->‪substituteVariables($expectation);
45  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
46  $file = ‪ImageMagickFile::fromFilePath($filePath, $frame);
47  self::assertSame($expectation, (string)$file);
48  }
49 
50  public static function ‪resultIsEscapedDataProvider(): array
51  {
52  // probably Windows system
53  if (DIRECTORY_SEPARATOR === '\\') {
54  return [
55  'without frame' => ['file.pdf', null, '"pdf:{directory}/file.pdf"'],
56  'with first frame' => ['file.pdf', 0, '"pdf:{directory}/file.pdf[0]"'],
57  'special literals' => ['\'`%$!".png', 0, '"png:{directory}/\'` $ .png[0]"'],
58  ];
59  }
60  // probably Unix system
61  return [
62  'without frame' => ['file.pdf', null, '\'pdf:{directory}/file.pdf\''],
63  'with first frame' => ['file.pdf', 0, '\'pdf:{directory}/file.pdf[0]\''],
64  'special literals' => ['\'`%$!".png', 0, '\'png:{directory}/\'\\\'\'`%$!".png[0]\''],
65  ];
66  }
67 
68  #[DataProvider('resultIsEscapedDataProvider')]
69  #[Test]
70  public function ‪resultIsEscaped(string $fileName, ?int $frame, string $expectation): void
71  {
72  $expectation = $this->‪substituteVariables($expectation);
73  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
74  $file = ‪ImageMagickFile::fromFilePath($filePath, $frame);
75  self::assertSame($expectation, (string)$file);
76  }
77 
78  public static function ‪fileStatementIsResolvedDataProvider(): array
79  {
80  return [
81  'file.ai' => ['file.ai', '\'pdf:{directory}/file.ai\''],
82  'file.ai.jpg' => ['file.ai.jpg', '\'pdf:{directory}/file.ai.jpg\''],
83  'file.gif' => ['file.gif', '\'gif:{directory}/file.gif\''],
84  'file.gif.jpg' => ['file.gif.jpg', '\'gif:{directory}/file.gif.jpg\''],
85  'file.jpg' => ['file.jpg', '\'jpg:{directory}/file.jpg\''],
86  'file.jpg.png' => ['file.jpg.png', '\'jpg:{directory}/file.jpg.png\''],
87  'file.png' => ['file.png', '\'png:{directory}/file.png\''],
88  'file.png.jpg' => ['file.png.jpg', '\'png:{directory}/file.png.jpg\''],
89  'file.svg' => ['file.svg', '\'svg:{directory}/file.svg\''],
90  'file.svg.jpg' => ['file.svg.jpg', '\'svg:{directory}/file.svg.jpg\''],
91  'file.tif' => ['file.tif', '\'tif:{directory}/file.tif\''],
92  'file.tif.jpg' => ['file.tif.jpg', '\'tif:{directory}/file.tif.jpg\''],
93  'file.webp' => ['file.webp', '\'webp:{directory}/file.webp\''],
94  'file.webp.jpg' => ['file.webp.jpg', '\'webp:{directory}/file.webp.jpg\''],
95  'file.pdf' => ['file.pdf', '\'pdf:{directory}/file.pdf\''],
96  'file.pdf.jpg' => ['file.pdf.jpg', '\'pdf:{directory}/file.pdf.jpg\''],
97  // accepted, since postscript files are converted using 'jpg:' format
98  'file.ps.jpg' => ['file.ps.jpg', '\'jpg:{directory}/file.ps.jpg\''],
99  'file.eps.jpg' => ['file.eps.jpg', '\'jpg:{directory}/file.eps.jpg\''],
100  ];
101  }
102 
103  #[DataProvider('fileStatementIsResolvedDataProvider')]
104  #[Test]
105  public function ‪fileStatementIsResolved(string $fileName, string $expectation): void
106  {
107  $expectation = $this->‪substituteVariables($expectation);
108  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
109  $file = ‪ImageMagickFile::fromFilePath($filePath);
110  self::assertSame($expectation, (string)$file);
111  }
112 
118  {
119  return [
120  'file.ai.jpg' => ['file.ai.jpg', '\'jpg:{directory}/file.ai.jpg\'', 'inode/x-empty'],
121  'file.bmp.jpg' => ['file.bmp.jpg', '\'jpg:{directory}/file.bmp.jpg\'', 'inode/x-empty'],
122  'file.fax.jpg' => ['file.fax.jpg', '\'jpg:{directory}/file.fax.jpg\'', 'inode/x-empty'],
123  'file.gif.jpg' => ['file.gif.jpg', '\'jpg:{directory}/file.gif.jpg\'', 'inode/x-empty'],
124  'file.jpg' => ['file.jpg', '\'jpg:{directory}/file.jpg\'', 'inode/x-empty'],
125  'file.jpg.png' => ['file.jpg.png', '\'png:{directory}/file.jpg.png\'', 'inode/x-empty'],
126  'file.png' => ['file.png', '\'png:{directory}/file.png\'', 'inode/x-empty'],
127  'file.png.jpg' => ['file.png.jpg', '\'jpg:{directory}/file.png.jpg\'', 'inode/x-empty'],
128  'file.svg.jpg' => ['file.svg.jpg', '\'jpg:{directory}/file.svg.jpg\'', 'inode/x-empty'],
129  'file.tif' => ['file.tif', '\'tif:{directory}/file.tif\'', 'inode/x-empty'],
130  'file.tif.jpg' => ['file.tif.jpg', '\'jpg:{directory}/file.tif.jpg\'', 'inode/x-empty'],
131  'file.webp' => ['file.webp', '\'webp:{directory}/file.webp\'', 'inode/x-empty'],
132  'file.webp.jpg' => ['file.webp.jpg', '\'jpg:{directory}/file.webp.jpg\'', 'inode/x-empty'],
133  'file.pdf.jpg' => ['file.pdf.jpg', '\'jpg:{directory}/file.pdf.jpg\'', 'inode/x-empty'],
134  ];
135  }
136 
137  #[DataProvider('fileStatementIsResolvedForEnforcedMimeTypeDataProvider')]
138  #[Test]
139  public function ‪fileStatementIsResolvedForEnforcedMimeType(string $fileName, string $expectation, string $mimeType): void
140  {
141  $this->‪simulateNextFileInfoInvocation($mimeType);
142  $expectation = $this->‪substituteVariables($expectation);
143  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
144  $file = ‪ImageMagickFile::fromFilePath($filePath, null);
145  self::assertSame($expectation, (string)$file);
146  }
147 
149  {
150  return [
151  'file.fax' => ['file.fax', '\'g3:{directory}/file.fax\''],
152  'file.bmp' => ['file.bmp', '\'dib:{directory}/file.bmp\''],
153  ];
154  }
155 
156  #[DataProvider('fileStatementIsResolvedForConfiguredMimeTypeDataProvider')]
157  #[Test]
158  public function ‪fileStatementIsResolvedForConfiguredMimeType(string $fileName, string $expectation): void
159  {
160  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['g3'] = 'image/g3fax';
161  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['fax'] = 'image/g3fax';
162  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['dib'] = 'image/x-ms-bmp';
163  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['bmp'] = 'image/x-ms-bmp';
164 
165  $expectation = $this->‪substituteVariables($expectation);
166  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
167  $file = ‪ImageMagickFile::fromFilePath($filePath, null);
168  self::assertSame($expectation, (string)$file);
169  }
170 
171  public static function ‪fileStatementIsDeniedDataProvider(): array
172  {
173  return [
174  'file.ps' => ['file.ps'],
175  'file.eps' => ['file.eps'],
176  // denied since not defined in allowed extensions
177  'file.ai' => ['file.ai', 'inode/x-empty'],
178  'file.svg' => ['file.svg', 'inode/x-empty'],
179  'file.pdf' => ['file.pdf', 'inode/x-empty'],
180  ];
181  }
182 
183  #[DataProvider('fileStatementIsDeniedDataProvider')]
184  #[Test]
185  public function ‪fileStatementIsDenied(string $fileName, ?string $mimeType = null): void
186  {
187  $this->expectException(Exception::class);
188  $this->expectExceptionCode(1550060977);
189 
190  if ($mimeType !== null) {
191  $this->‪simulateNextFileInfoInvocation($mimeType);
192  }
193 
194  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
196  }
197 
199  {
200  return [
201  'file.ps' => ['file.ps'],
202  'file.eps' => ['file.eps'],
203  ];
204  }
205 
206  #[DataProvider('fileStatementIsDeniedForConfiguredMimeTypeDataProvider')]
207  #[Test]
208  public function ‪fileStatementIsDeniedForConfiguredMimeType(string $fileName): void
209  {
210  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['ps'] = 'image/x-see-no-evil';
211  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['FileInfo']['fileExtensionToMimeType']['eps'] = 'image/x-see-no-evil';
212 
213  $this->expectException(Exception::class);
214  $this->expectExceptionCode(1550060977);
215 
216  $filePath = sprintf('%s/%s', __DIR__ . '/Fixtures', $fileName);
217  ‪ImageMagickFile::fromFilePath($filePath, null);
218  }
219 
220  private function ‪substituteVariables(string $value): string
221  {
222  return str_replace(
223  ['{directory}'],
224  [__DIR__ . '/Fixtures'],
225  $value
226  );
227  }
228 
229  private function ‪simulateNextFileInfoInvocation(string $mimeType): void
230  {
231  $fileInfo = $this->getAccessibleMock(
232  FileInfo::class,
233  ['getMimeType', 'getMimeExtensions'],
234  [],
235  '',
236  false
237  );
238  $fileInfo->expects(self::atLeastOnce())->method('getMimeType')->willReturn($mimeType);
239  $fileInfo->expects(self::atLeastOnce())->method('getMimeExtensions')->willReturn([]);
240  GeneralUtility::addInstance(FileInfo::class, $fileInfo);
241  }
242 }
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForConfiguredMimeType
‪fileStatementIsResolvedForConfiguredMimeType(string $fileName, string $expectation)
Definition: ImageMagickFileTest.php:158
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDenied
‪fileStatementIsDenied(string $fileName, ?string $mimeType=null)
Definition: ImageMagickFileTest.php:185
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\resultIsEscaped
‪resultIsEscaped(string $fileName, ?int $frame, string $expectation)
Definition: ImageMagickFileTest.php:70
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\framesAreConsideredDataProvider
‪static framesAreConsideredDataProvider()
Definition: ImageMagickFileTest.php:32
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForEnforcedMimeType
‪fileStatementIsResolvedForEnforcedMimeType(string $fileName, string $expectation, string $mimeType)
Definition: ImageMagickFileTest.php:139
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\resultIsEscapedDataProvider
‪static resultIsEscapedDataProvider()
Definition: ImageMagickFileTest.php:50
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedDataProvider
‪static fileStatementIsDeniedDataProvider()
Definition: ImageMagickFileTest.php:171
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedForConfiguredMimeType
‪fileStatementIsDeniedForConfiguredMimeType(string $fileName)
Definition: ImageMagickFileTest.php:208
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForEnforcedMimeTypeDataProvider
‪static fileStatementIsResolvedForEnforcedMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:117
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolved
‪fileStatementIsResolved(string $fileName, string $expectation)
Definition: ImageMagickFileTest.php:105
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\framesAreConsidered
‪framesAreConsidered(string $fileName, ?int $frame, string $expectation)
Definition: ImageMagickFileTest.php:42
‪TYPO3\CMS\Core\Tests\Functional\Imaging
Definition: IconFactoryTest.php:18
‪TYPO3\CMS\Core\Imaging\ImageMagickFile\fromFilePath
‪static fromFilePath(string $filePath, int $frame=null)
Definition: ImageMagickFile.php:111
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedForConfiguredMimeTypeDataProvider
‪static fileStatementIsResolvedForConfiguredMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:148
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\$initializeDatabase
‪bool $initializeDatabase
Definition: ImageMagickFileTest.php:30
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsResolvedDataProvider
‪static fileStatementIsResolvedDataProvider()
Definition: ImageMagickFileTest.php:78
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\simulateNextFileInfoInvocation
‪simulateNextFileInfoInvocation(string $mimeType)
Definition: ImageMagickFileTest.php:229
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\substituteVariables
‪substituteVariables(string $value)
Definition: ImageMagickFileTest.php:220
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪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:52
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest
Definition: ImageMagickFileTest.php:29
‪TYPO3\CMS\Core\Tests\Functional\Imaging\ImageMagickFileTest\fileStatementIsDeniedForConfiguredMimeTypeDataProvider
‪static fileStatementIsDeniedForConfiguredMimeTypeDataProvider()
Definition: ImageMagickFileTest.php:198