Skip to content

Commit

Permalink
[6.x] Verify column names are actual columns when using guarded (#33777)
Browse files Browse the repository at this point in the history
* verify column names are actual columns when using guarded

* Apply fixes from StyleCI (#33778)

* remove json check
  • Loading branch information
taylorotwell authored Aug 7, 2020
1 parent 7a74817 commit 897d107
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 4 deletions.
31 changes: 28 additions & 3 deletions src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ trait GuardsAttributes
*/
protected static $unguarded = false;

/**
* The actual columns that exist on the database and can be guarded.
*
* @var array
*/
protected static $guardableColumns = [];

/**
* Get the fillable attributes for the model.
*
Expand Down Expand Up @@ -164,12 +171,30 @@ public function isFillable($key)
*/
public function isGuarded($key)
{
if (strpos($key, '->') !== false) {
$key = Str::before($key, '->');
if (empty($this->getGuarded())) {
return false;
}

return $this->getGuarded() == ['*'] ||
! empty(preg_grep('/^'.preg_quote($key).'$/i', $this->getGuarded()));
! empty(preg_grep('/^'.preg_quote($key).'$/i', $this->getGuarded())) ||
! $this->isGuardableColumn($key);
}

/**
* Determine if the given column is a valid, guardable column.
*
* @param string $key
* @return bool
*/
protected function isGuardableColumn($key)
{
if (! isset(static::$guardableColumns[get_class($this)])) {
static::$guardableColumns[get_class($this)] = $this->getConnection()
->getSchemaBuilder()
->getColumnListing($this->getTable());
}

return in_array($key, static::$guardableColumns[get_class($this)]);
}

/**
Expand Down
13 changes: 12 additions & 1 deletion tests/Database/DatabaseEloquentModelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Database\Connection;
use Illuminate\Database\ConnectionResolverInterface;
use Illuminate\Database\ConnectionResolverInterface as Resolver;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\JsonEncodingException;
Expand Down Expand Up @@ -1014,11 +1015,21 @@ public function testUnderscorePropertiesAreNotFilled()
public function testGuarded()
{
$model = new EloquentModelStub;

EloquentModelStub::setConnectionResolver($resolver = m::mock(Resolver::class));
$resolver->shouldReceive('connection')->andReturn($connection = m::mock(stdClass::class));
$connection->shouldReceive('getSchemaBuilder->getColumnListing')->andReturn(['name', 'age', 'foo']);

$model->guard(['name', 'age']);
$model->fill(['name' => 'foo', 'age' => 'bar', 'foo' => 'bar']);
$this->assertFalse(isset($model->name));
$this->assertFalse(isset($model->age));
$this->assertSame('bar', $model->foo);

$model = new EloquentModelStub;
$model->guard(['name', 'age']);
$model->fill(['Foo' => 'bar']);
$this->assertFalse(isset($model->Foo));
}

public function testFillableOverridesGuarded()
Expand Down Expand Up @@ -2134,7 +2145,7 @@ public function getDates()
class EloquentModelSaveStub extends Model
{
protected $table = 'save_stub';
protected $guarded = ['id'];
protected $guarded = [];

public function save(array $options = [])
{
Expand Down

0 comments on commit 897d107

Please sign in to comment.