Skip to content

Commit 165bf3a

Browse files
authored
Merge pull request #1196 from CurosMJ/add-database-presence-verifier
[Bug Fix][Validation][Security] Fix working of unique and exists
2 parents 374845a + 0a84b82 commit 165bf3a

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php namespace Jenssegers\Mongodb\Validation;
2+
3+
class DatabasePresenceVerifier extends \Illuminate\Validation\DatabasePresenceVerifier
4+
{
5+
/**
6+
* Count the number of objects in a collection having the given value.
7+
*
8+
* @param string $collection
9+
* @param string $column
10+
* @param string $value
11+
* @param int $excludeId
12+
* @param string $idColumn
13+
* @param array $extra
14+
* @return int
15+
*/
16+
public function getCount($collection, $column, $value, $excludeId = null, $idColumn = null, array $extra = [])
17+
{
18+
$query = $this->table($collection)->where($column, 'regex', "/$value/i");
19+
20+
if (! is_null($excludeId) && $excludeId != 'NULL') {
21+
$query->where($idColumn ?: 'id', '<>', $excludeId);
22+
}
23+
24+
foreach ($extra as $key => $extraValue) {
25+
$this->addWhere($query, $key, $extraValue);
26+
}
27+
28+
return $query->count();
29+
}
30+
31+
/**
32+
* Count the number of objects in a collection with the given values.
33+
*
34+
* @param string $collection
35+
* @param string $column
36+
* @param array $values
37+
* @param array $extra
38+
* @return int
39+
*/
40+
public function getMultiCount($collection, $column, array $values, array $extra = [])
41+
{
42+
// Generates a regex like '/(a|b|c)/i' which can query multiple values
43+
$regex = '/('.implode('|', $values).')/i';
44+
45+
$query = $this->table($collection)->where($column, 'regex', $regex);
46+
47+
foreach ($extra as $key => $extraValue) {
48+
$this->addWhere($query, $key, $extraValue);
49+
}
50+
51+
return $query->count();
52+
}
53+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php namespace Jenssegers\Mongodb\Validation;
2+
3+
use Illuminate\Validation\ValidationServiceProvider as BaseProvider;
4+
5+
class ValidationServiceProvider extends BaseProvider
6+
{
7+
protected function registerPresenceVerifier()
8+
{
9+
$this->app->singleton('validation.presence', function ($app) {
10+
return new DatabasePresenceVerifier($app['db']);
11+
});
12+
}
13+
}

tests/TestCase.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ protected function getPackageProviders($app)
2929
return [
3030
Jenssegers\Mongodb\MongodbServiceProvider::class,
3131
Jenssegers\Mongodb\Auth\PasswordResetServiceProvider::class,
32+
Jenssegers\Mongodb\Validation\ValidationServiceProvider::class
3233
];
3334
}
3435

tests/ValidationTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,53 @@ public function testUnique()
2222
['name' => 'required|unique:users']
2323
);
2424
$this->assertTrue($validator->fails());
25+
26+
$validator = Validator::make(
27+
['name' => 'John doe'],
28+
['name' => 'required|unique:users']
29+
);
30+
$this->assertTrue($validator->fails());
31+
32+
$validator = Validator::make(
33+
['name' => 'john doe'],
34+
['name' => 'required|unique:users']
35+
);
36+
$this->assertTrue($validator->fails());
37+
38+
$validator = Validator::make(
39+
['name' => 'test doe'],
40+
['name' => 'required|unique:users']
41+
);
42+
$this->assertFalse($validator->fails());
43+
}
44+
45+
public function testExists()
46+
{
47+
$validator = Validator::make(
48+
['name' => 'John Doe'],
49+
['name' => 'required|exists:users']
50+
);
51+
$this->assertTrue($validator->fails());
52+
53+
User::create(['name' => 'John Doe']);
54+
User::create(['name' => 'Test Name']);
55+
56+
$validator = Validator::make(
57+
['name' => 'John Doe'],
58+
['name' => 'required|exists:users']
59+
);
60+
$this->assertFalse($validator->fails());
61+
62+
$validator = Validator::make(
63+
['name' => 'john Doe'],
64+
['name' => 'required|exists:users']
65+
);
66+
$this->assertFalse($validator->fails());
67+
68+
$validator = Validator::make(
69+
['name' => ['test name', 'john doe']],
70+
['name' => 'required|exists:users']
71+
);
72+
$this->assertFalse($validator->fails());
2573
}
2674
}

0 commit comments

Comments
 (0)