From 7d534d84d7aaa0a618438f640028fa1383b792a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mor=C3=A1vek?= Date: Fri, 10 Apr 2020 20:41:27 +0200 Subject: [PATCH] Validator: do not require UploadControl instance for file upload related validations --- src/Forms/Validator.php | 9 ++++++--- tests/Forms/Validator.customControl.phpt | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Forms/Validator.php b/src/Forms/Validator.php index 2719804aa..487db98b5 100644 --- a/src/Forms/Validator.php +++ b/src/Forms/Validator.php @@ -323,9 +323,10 @@ public static function validateFloat(IControl $control): bool /** * Is file size in limit? */ - public static function validateFileSize(Controls\UploadControl $control, $limit): bool + public static function validateFileSize(IControl $control, $limit): bool { foreach (static::toArray($control->getValue()) as $file) { + Validators::assert($file, Nette\Http\FileUpload::class, 'control value'); if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) { return false; } @@ -338,10 +339,11 @@ public static function validateFileSize(Controls\UploadControl $control, $limit) * Has file specified mime type? * @param string|string[] $mimeType */ - public static function validateMimeType(Controls\UploadControl $control, $mimeType): bool + public static function validateMimeType(IControl $control, $mimeType): bool { $mimeTypes = is_array($mimeType) ? $mimeType : explode(',', $mimeType); foreach (static::toArray($control->getValue()) as $file) { + Validators::assert($file, Nette\Http\FileUpload::class, 'control value'); $type = strtolower($file->getContentType()); if (!in_array($type, $mimeTypes, true) && !in_array(preg_replace('#/.*#', '/*', $type), $mimeTypes, true)) { return false; @@ -354,9 +356,10 @@ public static function validateMimeType(Controls\UploadControl $control, $mimeTy /** * Is file image? */ - public static function validateImage(Controls\UploadControl $control): bool + public static function validateImage(IControl $control): bool { foreach (static::toArray($control->getValue()) as $file) { + Validators::assert($file, Nette\Http\FileUpload::class, 'control value'); if (!$file->isImage()) { return false; } diff --git a/tests/Forms/Validator.customControl.phpt b/tests/Forms/Validator.customControl.phpt index 12b7fc2ec..5b037e51c 100644 --- a/tests/Forms/Validator.customControl.phpt +++ b/tests/Forms/Validator.customControl.phpt @@ -8,6 +8,7 @@ declare(strict_types=1); use Nette\Forms\Form; use Nette\Forms\Validator; +use Nette\Http\FileUpload; use Tester\Assert; @@ -74,3 +75,26 @@ test(function () { // filled, blank Assert::true(Validator::validateFilled($input)); Assert::false(Validator::validateBlank($input)); }); + + +test(function () { // file upload related validators + $input = new CustomControl(new FileUpload([ + 'name' => 'foo', + 'size' => 1, + 'tmp_name' => __FILE__, + 'error' => UPLOAD_ERR_OK + ])); + Assert::true(Validator::validateFileSize($input, 42)); + Assert::true(Validator::validateMimeType($input, ['text/x-php'])); + Assert::false(Validator::validateImage($input)); + + $input = new CustomControl(new FileUpload([ + 'name' => 'foo', + 'size' => 100, + 'tmp_name' => __DIR__ . '/files/logo.gif', + 'error' => UPLOAD_ERR_OK + ])); + Assert::false(Validator::validateFileSize($input, 42)); + Assert::false(Validator::validateMimeType($input, ['text/x-php'])); + Assert::true(Validator::validateImage($input)); +});