Skip to content

Commit

Permalink
[Validator] Use Mime component to determine mime type for file validator
Browse files Browse the repository at this point in the history
  • Loading branch information
pierredup committed May 29, 2020
1 parent 96d2d19 commit 35fc85e
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 60 deletions.
13 changes: 10 additions & 3 deletions src/Symfony/Component/Validator/Constraints/FileValidator.php
Expand Up @@ -13,8 +13,10 @@

use Symfony\Component\HttpFoundation\File\File as FileObject;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Mime\MimeTypes;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

Expand Down Expand Up @@ -170,12 +172,17 @@ public function validate($value, Constraint $constraint)
}

if ($constraint->mimeTypes) {
if (!$value instanceof FileObject) {
$value = new FileObject($value);
if (class_exists(MimeTypes::class)) {
$mime = MimeTypes::getDefault()->guessMimeType($path);
} elseif ($value instanceof FileObject) {
$mime = $value->getMimeType();
} elseif (!class_exists(FileObject::class)) {
throw new LogicException('You cannot validate the mime-type of files as the Mime component is not installed. Try running "composer require symfony/mime".');
} else {
$mime = (new FileObject($value))->getMimeType();
}

$mimeTypes = (array) $constraint->mimeTypes;
$mime = $value->getMimeType();

foreach ($mimeTypes as $mimeType) {
if ($mimeType === $mime) {
Expand Down
Expand Up @@ -11,6 +11,7 @@

namespace Symfony\Component\Validator\Tests\Constraints;

use Symfony\Component\HttpFoundation\File\File as FileObject;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\FileValidator;
Expand Down Expand Up @@ -283,21 +284,10 @@ public function testBinaryFormat($bytesWritten, $limit, $binaryFormat, $sizeAsSt

public function testValidMimeType()
{
$file = $this
->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
->setConstructorArgs([__DIR__.'/Fixtures/foo'])
->getMock();
$file
->expects($this->once())
->method('getPathname')
->willReturn($this->path);
$file
->expects($this->once())
->method('getMimeType')
->willReturn('image/jpg');
$file = new FileObject(__DIR__.'/Fixtures/blank.jpg');

$constraint = new File([
'mimeTypes' => ['image/png', 'image/jpg'],
'mimeTypes' => ['image/png', 'image/jpeg'],
]);

$this->validator->validate($file, $constraint);
Expand All @@ -307,18 +297,7 @@ public function testValidMimeType()

public function testValidWildcardMimeType()
{
$file = $this
->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
->setConstructorArgs([__DIR__.'/Fixtures/foo'])
->getMock();
$file
->expects($this->once())
->method('getPathname')
->willReturn($this->path);
$file
->expects($this->once())
->method('getMimeType')
->willReturn('image/jpg');
$file = new FileObject(__DIR__.'/Fixtures/test.gif');

$constraint = new File([
'mimeTypes' => ['image/*'],
Expand All @@ -331,62 +310,40 @@ public function testValidWildcardMimeType()

public function testInvalidMimeType()
{
$file = $this
->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
->setConstructorArgs([__DIR__.'/Fixtures/foo'])
->getMock();
$file
->expects($this->once())
->method('getPathname')
->willReturn($this->path);
$file
->expects($this->once())
->method('getMimeType')
->willReturn('application/pdf');
$file = new FileObject(__DIR__.'/Fixtures/blank.pdf');

$constraint = new File([
'mimeTypes' => ['image/png', 'image/jpg'],
'mimeTypes' => ['image/png', 'image/jpeg'],
'mimeTypesMessage' => 'myMessage',
]);

$this->validator->validate($file, $constraint);

$this->buildViolation('myMessage')
->setParameter('{{ type }}', '"application/pdf"')
->setParameter('{{ types }}', '"image/png", "image/jpg"')
->setParameter('{{ file }}', '"'.$this->path.'"')
->setParameter('{{ name }}', '"'.basename($this->path).'"')
->setParameter('{{ types }}', '"image/png", "image/jpeg"')
->setParameter('{{ file }}', '"'.__DIR__.'/Fixtures/blank.pdf'.'"')
->setParameter('{{ name }}', '"blank.pdf"')
->setCode(File::INVALID_MIME_TYPE_ERROR)
->assertRaised();
}

public function testInvalidWildcardMimeType()
{
$file = $this
->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
->setConstructorArgs([__DIR__.'/Fixtures/foo'])
->getMock();
$file
->expects($this->once())
->method('getPathname')
->willReturn($this->path);
$file
->expects($this->once())
->method('getMimeType')
->willReturn('application/pdf');
$file = new FileObject(__DIR__.'/Fixtures/blank.pdf');

$constraint = new File([
'mimeTypes' => ['image/*', 'image/jpg'],
'mimeTypes' => ['image/*', 'image/jpeg'],
'mimeTypesMessage' => 'myMessage',
]);

$this->validator->validate($file, $constraint);

$this->buildViolation('myMessage')
->setParameter('{{ type }}', '"application/pdf"')
->setParameter('{{ types }}', '"image/*", "image/jpg"')
->setParameter('{{ file }}', '"'.$this->path.'"')
->setParameter('{{ name }}', '"'.basename($this->path).'"')
->setParameter('{{ types }}', '"image/*", "image/jpeg"')
->setParameter('{{ file }}', '"'.__DIR__.'/Fixtures/blank.pdf'.'"')
->setParameter('{{ name }}', '"blank.pdf"')
->setCode(File::INVALID_MIME_TYPE_ERROR)
->assertRaised();
}
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.

0 comments on commit 35fc85e

Please sign in to comment.