From 97e16e6bbfe295bf3436cf94dd8da7b86883dc4c Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Sun, 28 Jun 2020 17:46:01 +0200 Subject: [PATCH 1/3] fix --- src/Illuminate/Validation/Validator.php | 31 +++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Validation/Validator.php b/src/Illuminate/Validation/Validator.php index 669c8b7c4e22..40960a996d7c 100755 --- a/src/Illuminate/Validation/Validator.php +++ b/src/Illuminate/Validation/Validator.php @@ -277,7 +277,7 @@ public function __construct(Translator $translator, array $data, array $rules, } /** - * Parse the data array, converting dots to ->. + * Parse the data array, converting dots and asterisks. * * @param array $data * @return array @@ -303,6 +303,33 @@ public function parseData(array $data) return $newData; } + /** + * Replace the placeholder used in data keys. + * + * @param array $data + * @return array + */ + public function replacePlaceholders($data) + { + $newData = []; + + foreach ($data as $key => $value) { + if (is_array($value)) { + $value = $this->replacePlaceholders($value); + } + + $key = str_replace( + [$this->dotPlaceholder, '__asterisk__'], + ['.', '*'], + $key + ); + + $newData[$key] = $value; + } + + return $newData; + } + /** * Add an after validation callback. * @@ -464,7 +491,7 @@ public function validated() } } - return $results; + return $this->replacePlaceholders($results); } /** From 91afbe064a5ddc9a210f47e9abd03c5c98bafacd Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Sun, 28 Jun 2020 17:47:28 +0200 Subject: [PATCH 2/3] reneame variables --- src/Illuminate/Validation/Validator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Validation/Validator.php b/src/Illuminate/Validation/Validator.php index 40960a996d7c..e1a7217bb644 100755 --- a/src/Illuminate/Validation/Validator.php +++ b/src/Illuminate/Validation/Validator.php @@ -311,7 +311,7 @@ public function parseData(array $data) */ public function replacePlaceholders($data) { - $newData = []; + $originalData = []; foreach ($data as $key => $value) { if (is_array($value)) { @@ -324,10 +324,10 @@ public function replacePlaceholders($data) $key ); - $newData[$key] = $value; + $originalData[$key] = $value; } - return $newData; + return $originalData; } /** From 92cf9d989a55abb95827c6b11828690d020e4fc9 Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Mon, 29 Jun 2020 17:42:23 +0200 Subject: [PATCH 3/3] add test --- tests/Validation/ValidationValidatorTest.php | 57 ++++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index a73f218714dd..cd113411389f 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -3880,6 +3880,32 @@ public function testPassingSlashVulnerability() $this->assertTrue($v->fails()); } + public function testPlaceholdersAreReplaced() + { + $trans = $this->getIlluminateArrayTranslator(); + + $v = new Validator($trans, [ + 'matrix' => ['\\' => ['invalid'], '1\\' => ['invalid']], + ], [ + 'matrix.*.*' => 'integer', + ]); + $this->assertTrue($v->fails()); + + $v = new Validator($trans, [ + 'matrix' => ['\\' => [1], '1\\' => [1]], + ], [ + 'matrix.*.*' => 'integer', + ]); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, [ + 'foo' => ['bar' => 'valid'], 'foo.bar' => 'invalid', 'foo->bar' => 'valid', + ], [ + 'foo\.bar' => 'required|in:valid', + ]); + $this->assertTrue($v->fails()); + } + public function testCoveringEmptyKeys() { $trans = $this->getIlluminateArrayTranslator(); @@ -3891,35 +3917,8 @@ public function testImplicitEachWithAsterisksWithArrayValues() { $trans = $this->getIlluminateArrayTranslator(); - $v = new Validator($trans, ['foo' => [1, 2, 3]], ['foo' => 'size:4']); - $this->assertFalse($v->passes()); - - $v = new Validator($trans, ['foo' => [1, 2, 3, 4]], ['foo' => 'size:4']); - $this->assertTrue($v->passes()); - - $v = new Validator($trans, ['foo' => [1, 2, 3, 4]], ['foo.*' => 'integer', 'foo.0' => 'required']); - $this->assertTrue($v->passes()); - - $v = new Validator($trans, ['foo' => [['bar' => [1, 2, 3]], ['bar' => [1, 2, 3]]]], ['foo.*.bar' => 'size:4']); - $this->assertFalse($v->passes()); - - $v = new Validator($trans, - ['foo' => [['bar' => [1, 2, 3]], ['bar' => [1, 2, 3]]]], ['foo.*.bar' => 'min:3']); - $this->assertTrue($v->passes()); - - $v = new Validator($trans, - ['foo' => [['bar' => [1, 2, 3]], ['bar' => [1, 2, 3]]]], ['foo.*.bar' => 'between:3,6']); - $this->assertTrue($v->passes()); - - $v = new Validator($trans, - ['foo' => [['name' => 'first', 'votes' => [1, 2]], ['name' => 'second', 'votes' => ['something', 2]]]], - ['foo.*.votes' => ['Required', 'Size:2']]); - $this->assertTrue($v->passes()); - - $v = new Validator($trans, - ['foo' => [['name' => 'first', 'votes' => [1, 2, 3]], ['name' => 'second', 'votes' => ['something', 2]]]], - ['foo.*.votes' => ['Required', 'Size:2']]); - $this->assertFalse($v->passes()); + $v = new Validator($trans, ['foo' => ['bar.baz' => '']], ['foo' => 'required']); + $this->assertEquals(['foo' => ['bar.baz' => '']], $v->validated()); } public function testValidateNestedArrayWithCommonParentChildKey()