Commit 165bf3a3 authored by Jens Segers's avatar Jens Segers Committed by GitHub

Merge pull request #1196 from CurosMJ/add-database-presence-verifier

[Bug Fix][Validation][Security] Fix working of unique and exists
parents 374845a7 0a84b82b
<?php namespace Jenssegers\Mongodb\Validation;
class DatabasePresenceVerifier extends \Illuminate\Validation\DatabasePresenceVerifier
{
/**
* Count the number of objects in a collection having the given value.
*
* @param string $collection
* @param string $column
* @param string $value
* @param int $excludeId
* @param string $idColumn
* @param array $extra
* @return int
*/
public function getCount($collection, $column, $value, $excludeId = null, $idColumn = null, array $extra = [])
{
$query = $this->table($collection)->where($column, 'regex', "/$value/i");
if (! is_null($excludeId) && $excludeId != 'NULL') {
$query->where($idColumn ?: 'id', '<>', $excludeId);
}
foreach ($extra as $key => $extraValue) {
$this->addWhere($query, $key, $extraValue);
}
return $query->count();
}
/**
* Count the number of objects in a collection with the given values.
*
* @param string $collection
* @param string $column
* @param array $values
* @param array $extra
* @return int
*/
public function getMultiCount($collection, $column, array $values, array $extra = [])
{
// Generates a regex like '/(a|b|c)/i' which can query multiple values
$regex = '/('.implode('|', $values).')/i';
$query = $this->table($collection)->where($column, 'regex', $regex);
foreach ($extra as $key => $extraValue) {
$this->addWhere($query, $key, $extraValue);
}
return $query->count();
}
}
<?php namespace Jenssegers\Mongodb\Validation;
use Illuminate\Validation\ValidationServiceProvider as BaseProvider;
class ValidationServiceProvider extends BaseProvider
{
protected function registerPresenceVerifier()
{
$this->app->singleton('validation.presence', function ($app) {
return new DatabasePresenceVerifier($app['db']);
});
}
}
...@@ -29,6 +29,7 @@ class TestCase extends Orchestra\Testbench\TestCase ...@@ -29,6 +29,7 @@ class TestCase extends Orchestra\Testbench\TestCase
return [ return [
Jenssegers\Mongodb\MongodbServiceProvider::class, Jenssegers\Mongodb\MongodbServiceProvider::class,
Jenssegers\Mongodb\Auth\PasswordResetServiceProvider::class, Jenssegers\Mongodb\Auth\PasswordResetServiceProvider::class,
Jenssegers\Mongodb\Validation\ValidationServiceProvider::class
]; ];
} }
......
...@@ -22,5 +22,53 @@ class ValidationTest extends TestCase ...@@ -22,5 +22,53 @@ class ValidationTest extends TestCase
['name' => 'required|unique:users'] ['name' => 'required|unique:users']
); );
$this->assertTrue($validator->fails()); $this->assertTrue($validator->fails());
$validator = Validator::make(
['name' => 'John doe'],
['name' => 'required|unique:users']
);
$this->assertTrue($validator->fails());
$validator = Validator::make(
['name' => 'john doe'],
['name' => 'required|unique:users']
);
$this->assertTrue($validator->fails());
$validator = Validator::make(
['name' => 'test doe'],
['name' => 'required|unique:users']
);
$this->assertFalse($validator->fails());
}
public function testExists()
{
$validator = Validator::make(
['name' => 'John Doe'],
['name' => 'required|exists:users']
);
$this->assertTrue($validator->fails());
User::create(['name' => 'John Doe']);
User::create(['name' => 'Test Name']);
$validator = Validator::make(
['name' => 'John Doe'],
['name' => 'required|exists:users']
);
$this->assertFalse($validator->fails());
$validator = Validator::make(
['name' => 'john Doe'],
['name' => 'required|exists:users']
);
$this->assertFalse($validator->fails());
$validator = Validator::make(
['name' => ['test name', 'john doe']],
['name' => 'required|exists:users']
);
$this->assertFalse($validator->fails());
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment