‪TYPO3CMS  ‪main
MimeTypeValidatorTest.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;
32 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
33 
34 final class ‪MimeTypeValidatorTest extends FunctionalTestCase
35 {
36  protected array ‪$coreExtensionsToLoad = ['form'];
37 
38  protected function ‪setUp(): void
39  {
40  parent::setUp();
41  ‪$GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageServiceFactory::class)->create('default');
42  $request = (new ‪ServerRequest())->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_BE);
43  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
44  mkdir($this->instancePath . '/tmp');
45  file_put_contents($this->instancePath . '/tmp/file.exe', "MZ\x90\x00\x03\x00");
46  file_put_contents($this->instancePath . '/tmp/file.zip', "PK\x03\x04");
47  file_put_contents($this->instancePath . '/tmp/file.jpg', "\xFF\xD8\xFF\xDB");
48  file_put_contents($this->instancePath . '/tmp/file.gif', 'GIF87a');
49  file_put_contents($this->instancePath . '/tmp/file.pdf', '%PDF-');
50  }
51 
52  protected function ‪tearDown(): void
53  {
54  ‪GeneralUtility::rmdir($this->instancePath . '/tmp', true);
55  parent::tearDown();
56  }
57 
58  #[Test]
60  {
61  $this->expectException(InvalidValidationOptionsException::class);
62  $this->expectExceptionCode(1471713296);
63  $options = ['allowedMimeTypes' => ''];
65  ‪$validator->setOptions($options);
66  ‪$validator->validate(true);
67  }
68 
69  #[Test]
71  {
72  $this->expectException(InvalidValidationOptionsException::class);
73  $this->expectExceptionCode(1471713296);
74  $options = ['allowedMimeTypes' => []];
76  ‪$validator->setOptions($options);
77  ‪$validator->validate(true);
78  }
79 
80  #[Test]
82  {
83  $options = ['allowedMimeTypes' => ['image/jpeg']];
85  ‪$validator->setOptions($options);
86  $mockedStorage = $this->getMockBuilder(ResourceStorage::class)->disableOriginalConstructor()->getMock();
87  $file = new ‪File(['name' => 'foo', 'identifier' => '/foo', 'mime_type' => 'image/png'], $mockedStorage);
88  self::assertTrue(‪$validator->validate($file)->hasErrors());
89  }
90 
91  #[Test]
93  {
94  $options = ['allowedMimeTypes' => ['fake']];
96  ‪$validator->setOptions($options);
97  self::assertFalse(‪$validator->validate('')->hasErrors());
98  }
99 
100  #[Test]
102  {
103  $options = ['allowedMimeTypes' => ['fake']];
105  ‪$validator->setOptions($options);
106  self::assertTrue(‪$validator->validate('string')->hasErrors());
107  }
108 
109  public static function ‪fileExtensionMatchesMimeTypesDataProvider(): array
110  {
111  $allowedMimeTypes = ['application/pdf', 'application/vnd.oasis.opendocument.text'];
112  return [
113  // filename, file mime-type, allowed types, is valid (is allowed)
114  ['something.pdf', 'application/pdf', $allowedMimeTypes, true],
115  ['something.txt', 'application/pdf', $allowedMimeTypes, false],
116  ['something.pdf', 'application/pdf', [false], false],
117  ['something.pdf', 'false', $allowedMimeTypes, false],
118  ];
119  }
120 
121  #[DataProvider('fileExtensionMatchesMimeTypesDataProvider')]
122  #[Test]
123  public function ‪fileExtensionMatchesMimeTypes(string $fileName, string $fileMimeType, array $allowedMimeTypes, bool $isValid): void
124  {
125  $options = ['allowedMimeTypes' => $allowedMimeTypes];
127  ‪$validator->setOptions($options);
128  $mockedStorage = $this->getMockBuilder(ResourceStorage::class)->disableOriginalConstructor()->getMock();
129  $file = new ‪File([
130  'name' => $fileName,
131  'identifier' => '/folder/' . $fileName,
132  'mime_type' => $fileMimeType,
133  ], $mockedStorage);
134  $result = ‪$validator->validate($file);
135  self::assertSame($isValid, !$result->hasErrors());
136  }
137 
138  public static function ‪validateHandlesMimeTypesOfFilesDataProvider(): array
139  {
140  // error-codes
141  // + 1471708998: mime-type not allowed
142  // + 1613126216: mime-type to file-extension mismatch
143  return [
144  'submitted gif as upload.gif' => [
145  [
146  'tmp_name' => 'file.gif',
147  'name' => 'upload.gif',
148  'type' => 'does/not-matter',
149  ],
150  ['image/gif'],
151  ],
152  'submitted jpg as upload.jpg' => [
153  [
154  'tmp_name' => 'file.jpg',
155  'name' => 'upload.jpg',
156  'type' => 'does/not-matter',
157  ],
158  ['image/jpeg'],
159  ],
160  'submitted pdf as upload.pdf' => [
161  [
162  'tmp_name' => 'file.pdf',
163  'name' => 'upload.pdf',
164  'type' => 'does/not-matter',
165  ],
166  ['application/pdf'],
167  ],
168  'submitted exe as upload.exe' => [
169  [
170  'tmp_name' => 'file.exe',
171  'name' => 'upload.exe',
172  'type' => 'does/not-matter',
173  ], // upload data (as in $_FILES)
174  ['image/gif'], // allowed mime-types
175  [1471708998], // expected error-codes
176  ],
177  'submitted gif as upload.exe' => [
178  [
179  'tmp_name' => 'file.gif',
180  'name' => 'upload.exe',
181  'type' => 'does/not-matter',
182  ], // upload data (as in $_FILES)
183  ['image/gif'], // allowed mime-types
184  [1613126216], // expected error-codes
185  ],
186  ];
187  }
188 
194  #[DataProvider('validateHandlesMimeTypesOfFilesDataProvider')]
195  #[Test]
196  public function ‪validateHandlesMimeTypesOfFiles(array $uploadData, array $allowedMimeTypes, array $expectedErrorCodes = []): void
197  {
198  $uploadData['tmp_name'] = $this->instancePath . '/tmp/' . $uploadData['tmp_name'];
199  $uploadData['error'] = \UPLOAD_ERR_OK;
200  $uploadData['size'] = filesize($uploadData['tmp_name']);
201 
203  ‪$validator->setOptions(['allowedMimeTypes' => $allowedMimeTypes]);
204 
205  $resource = new ‪PseudoFile($uploadData);
206  $result = ‪$validator->validate($resource);
207  $errorCodes = array_map([$this, 'resolveErrorCode'], $result->getErrors());
208  self::assertSame($expectedErrorCodes, $errorCodes);
209  }
210 
211  private function ‪resolveErrorCode(‪Error $error): int
212  {
213  return $error->‪getCode();
214  }
215 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation
Definition: CountValidatorTest.php:18
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\MimeTypeValidatorThrowsExceptionIfAllowedMimeTypesOptionIsString
‪MimeTypeValidatorThrowsExceptionIfAllowedMimeTypesOptionIsString()
Definition: MimeTypeValidatorTest.php:59
‪TYPO3\CMS\Form\Mvc\Validation\Exception\InvalidValidationOptionsException
Definition: InvalidValidationOptionsException.php:22
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\MimeTypeValidatorThrowsExceptionIfAllowedMimeTypesOptionIsEmptyArray
‪MimeTypeValidatorThrowsExceptionIfAllowedMimeTypesOptionIsEmptyArray()
Definition: MimeTypeValidatorTest.php:70
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\$coreExtensionsToLoad
‪array $coreExtensionsToLoad
Definition: MimeTypeValidatorTest.php:36
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\fileExtensionMatchesMimeTypes
‪fileExtensionMatchesMimeTypes(string $fileName, string $fileMimeType, array $allowedMimeTypes, bool $isValid)
Definition: MimeTypeValidatorTest.php:123
‪TYPO3\CMS\Extbase\Error\Message\getCode
‪int getCode()
Definition: Message.php:80
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder\REQUESTTYPE_BE
‪const REQUESTTYPE_BE
Definition: SystemEnvironmentBuilder.php:45
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\resolveErrorCode
‪resolveErrorCode(Error $error)
Definition: MimeTypeValidatorTest.php:211
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\validateHandlesMimeTypesOfFiles
‪validateHandlesMimeTypesOfFiles(array $uploadData, array $allowedMimeTypes, array $expectedErrorCodes=[])
Definition: MimeTypeValidatorTest.php:196
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\MimeTypeValidatorReturnsTrueIfFileResourceIsNotAllowedMimeType
‪MimeTypeValidatorReturnsTrueIfFileResourceIsNotAllowedMimeType()
Definition: MimeTypeValidatorTest.php:81
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\MimeTypeValidatorReturnsFalseIfInputIsEmptyString
‪MimeTypeValidatorReturnsFalseIfInputIsEmptyString()
Definition: MimeTypeValidatorTest.php:92
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest
Definition: MimeTypeValidatorTest.php:35
‪TYPO3\CMS\Extbase\Error\Error
Definition: Error.php:25
‪$validator
‪if(isset($args['d'])) $validator
Definition: validateRstFiles.php:262
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Form\Mvc\Validation\MimeTypeValidator
Definition: MimeTypeValidator.php:33
‪TYPO3\CMS\Core\Utility\GeneralUtility\rmdir
‪static bool rmdir(string $path, bool $removeNonEmpty=false)
Definition: GeneralUtility.php:1702
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\fileExtensionMatchesMimeTypesDataProvider
‪static fileExtensionMatchesMimeTypesDataProvider()
Definition: MimeTypeValidatorTest.php:109
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:129
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\validateHandlesMimeTypesOfFilesDataProvider
‪static validateHandlesMimeTypesOfFilesDataProvider()
Definition: MimeTypeValidatorTest.php:138
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\setUp
‪setUp()
Definition: MimeTypeValidatorTest.php:38
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\MimeTypeValidatorReturnsTrueIfInputIsNoFileResource
‪MimeTypeValidatorReturnsTrueIfInputIsNoFileResource()
Definition: MimeTypeValidatorTest.php:101
‪TYPO3\CMS\Form\Tests\Functional\Mvc\Validation\MimeTypeValidatorTest\tearDown
‪tearDown()
Definition: MimeTypeValidatorTest.php:52
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\PseudoFile
Definition: PseudoFile.php:30