From f212925242d08a552d10e238d2f9772226654a5b Mon Sep 17 00:00:00 2001 From: DarkDef Date: Wed, 19 Aug 2020 20:32:15 +0300 Subject: [PATCH] Fix #18239: Fix support of no-extension files for `FileValidator::validateExtension()` --- framework/CHANGELOG.md | 1 + framework/assets/yii.validation.js | 2 +- framework/validators/FileValidator.php | 2 +- .../validators/FileValidatorTest.php | 21 +++++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d28e1d3337..1dfbfdbea8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,6 +6,7 @@ Yii Framework 2 Change Log - Enh #18236: Allow `yii\filters\RateLimiter` to accept a closure function for the `$user` property in order to assign values on runtime (nadar) - Bug #18233: Add PHP 8 support (samdark) +- Bug #18239: Fix support of no-extension files for `FileValidator::validateExtension()` (darkdef) - Bug #18229: Add flag for recognize SyBase databases on uses pdo_dblib (darkdef) diff --git a/framework/assets/yii.validation.js b/framework/assets/yii.validation.js index a43c4c801d..88f79decba 100644 --- a/framework/assets/yii.validation.js +++ b/framework/assets/yii.validation.js @@ -413,7 +413,7 @@ yii.validation = (function ($) { for (var index=0; index < options.extensions.length; index++) { var ext = options.extensions[index].toLowerCase(); - if (filename.substr(filename.length - options.extensions[index].length - 1) === ('.' + ext)) { + if ((ext === '' && filename.indexOf('.') === -1) || (filename.substr(filename.length - options.extensions[index].length - 1) === ('.' + ext))) { found = true; break; } diff --git a/framework/validators/FileValidator.php b/framework/validators/FileValidator.php index f9767630e8..c941ff6f48 100644 --- a/framework/validators/FileValidator.php +++ b/framework/validators/FileValidator.php @@ -415,7 +415,7 @@ class FileValidator extends Validator if (!empty($this->extensions)) { foreach ((array) $this->extensions as $ext) { - if (StringHelper::endsWith($file->name, ".$ext", false)) { + if ($extension === $ext || StringHelper::endsWith($file->name, ".$ext", false)) { return true; } } diff --git a/tests/framework/validators/FileValidatorTest.php b/tests/framework/validators/FileValidatorTest.php index c787eec6b4..cbed1fbabf 100644 --- a/tests/framework/validators/FileValidatorTest.php +++ b/tests/framework/validators/FileValidatorTest.php @@ -452,6 +452,27 @@ class FileValidatorTest extends TestCase $this->assertNotFalse(stripos(current($m->getErrors('attr_exe')), 'Only files with these extensions ')); } + public function testValidateEmptyExtension() + { + $val = new FileValidator([ + 'extensions' => ['txt', ''], + 'checkExtensionByMimeType' => false, + ]); + $m = FakedValidationModel::createWithAttributes( + [ + 'attr_txt' => $this->createTestFiles([['name' => 'one.txt']]), + 'attr_empty' => $this->createTestFiles([['name' => 'bad.']]), + 'attr_empty2' => $this->createTestFiles([['name' => 'bad']]), + ] + ); + $val->validateAttribute($m, 'attr_txt'); + $this->assertFalse($m->hasErrors('attr_txt')); + $val->validateAttribute($m, 'attr_empty'); + $this->assertFalse($m->hasErrors('attr_empty')); + $val->validateAttribute($m, 'attr_empty2'); + $this->assertFalse($m->hasErrors('attr_empty2')); + } + public function testValidateAttributeDoubleType() { $val = new FileValidator([