Skip to content

Commit

Permalink
ENH Override record if a provided GroupId with provided Code already …
Browse files Browse the repository at this point in the history
…exist in Permission table.
  • Loading branch information
sabina-talipova committed May 23, 2022
1 parent b64ad66 commit 70f1dc8
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 6 deletions.
26 changes: 20 additions & 6 deletions src/Security/Permission.php
Expand Up @@ -392,9 +392,16 @@ public static function groupList($memberID = null)
*/
public static function grant($groupID, $code, $arg = "any")
{
$perm = new Permission();
$perm->GroupID = $groupID;
$perm->Code = $code;
$permissions = Permission::get()->filter(['GroupID' => $groupID, 'Code' => $code]);

if ($permissions && $permissions->count() > 0) {
$perm = $permissions->last();
} else {
$perm = new Permission();
$perm->GroupID = $groupID;
$perm->Code = $code;
}

$perm->Type = self::GRANT_PERMISSION;

// Arg component
Expand Down Expand Up @@ -427,9 +434,16 @@ public static function grant($groupID, $code, $arg = "any")
*/
public static function deny($groupID, $code, $arg = "any")
{
$perm = new Permission();
$perm->GroupID = $groupID;
$perm->Code = $code;
$permissions = Permission::get()->filter(['GroupID' => $groupID, 'Code' => $code]);

if ($permissions && $permissions->count() > 0) {
$perm = $permissions->last();
} else {
$perm = new Permission();
$perm->GroupID = $groupID;
$perm->Code = $code;
}

$perm->Type = self::DENY_PERMISSION;

// Arg component
Expand Down
121 changes: 121 additions & 0 deletions tests/php/Security/PermissionTest.php
Expand Up @@ -3,6 +3,7 @@
namespace SilverStripe\Security\Tests;

use SilverStripe\Security\Permission;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\PermissionCheckboxSetField;
use SilverStripe\Core\Config\Config;
Expand Down Expand Up @@ -163,4 +164,124 @@ public function testEmptyMemberFails()
$this->assertFalse(Permission::checkMember($member, 'ADMIN'));
$this->assertFalse(Permission::checkMember($member, 'CMS_ACCESS_LeftAndMain'));
}

public function testGrantPermission()
{
$group = $this->objFromFixture(Group::class, 'testpermissiongroup');
$id = $group->ID;

Permission::grant($id, 'CMS_ACCESS_CMSMain');
Permission::grant($id, 'CMS_ACCESS_AssetAdmin');
Permission::grant($id, 'CMS_ACCESS_ReportAdmin');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(0, $groupPermission->first()->Arg);
$this->assertEquals(1, $groupPermission->first()->Type);


Permission::grant($id, 'CMS_ACCESS_CMSMain', 'all');
Permission::grant($id, 'CMS_ACCESS_AssetAdmin', 'all');
Permission::grant($id, 'CMS_ACCESS_ReportAdmin', 'all');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(-1, $groupPermission->first()->Arg);
$this->assertEquals(1, $groupPermission->first()->Type);

Permission::grant($id, 'CMS_ACCESS_CMSMain', 'any');
Permission::grant($id, 'CMS_ACCESS_AssetAdmin', 'any');
Permission::grant($id, 'CMS_ACCESS_ReportAdmin', 'any');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(-1, $groupPermission->first()->Arg);
$this->assertEquals(1, $groupPermission->first()->Type);
}

public function testDenyPermission()
{
$group = $this->objFromFixture(Group::class, 'testpermissiongroup');
$id = $group->ID;

Permission::deny($id, 'CMS_ACCESS_CMSMain');
Permission::deny($id, 'CMS_ACCESS_AssetAdmin');
Permission::deny($id, 'CMS_ACCESS_ReportAdmin');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(0, $groupPermission->first()->Arg);
$this->assertEquals(-1, $groupPermission->first()->Type);

Permission::deny($id, 'CMS_ACCESS_CMSMain', 'all');
Permission::deny($id, 'CMS_ACCESS_AssetAdmin', 'all');
Permission::deny($id, 'CMS_ACCESS_ReportAdmin', 'all');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(-1, $groupPermission->first()->Arg);
$this->assertEquals(-1, $groupPermission->first()->Type);

Permission::deny($id, 'CMS_ACCESS_CMSMain', 'any');
Permission::deny($id, 'CMS_ACCESS_AssetAdmin', 'any');
Permission::deny($id, 'CMS_ACCESS_ReportAdmin', 'any');

$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(3, $groupPermission->count());
$this->assertEquals(-1, $groupPermission->first()->Arg);
$this->assertEquals(-1, $groupPermission->first()->Type);
}

public function testDenyThenGrantPermission()
{
$member = $this->objFromFixture(Member::class, 'testcmseditormember');
$group = $this->objFromFixture(Group::class, 'testcmseditorgroup');
$id = $group->ID;

$this->logInAs($member);

Permission::grant($id, 'TEST_CMS_EDITOR');
$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(1, $groupPermission->count());
$this->assertEquals(1, $groupPermission->first()->Type);
$this->assertTrue(Permission::check('TEST_CMS_EDITOR'));

Permission::deny($id, 'TEST_CMS_EDITOR');
$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(1, $groupPermission->count());
$this->assertEquals(-1, $groupPermission->last()->Type);
$this->assertFalse(Permission::check('TEST_CMS_EDITOR'));

Permission::grant($id, 'TEST_CMS_EDITOR');
$groupPermission = Permission::get()->filter(['GroupID' => $id]);

$this->assertEquals(1, $groupPermission->count());
$this->assertEquals(1, $groupPermission->first()->Type);
$this->assertTrue(Permission::check('TEST_CMS_EDITOR'));

Permission::grant($id, 'CMS_ACCESS_AssetAdmin');
$groupPermission = Permission::get()->filter(['GroupID' => $id]);
$this->assertEquals(2, $groupPermission->count());

$groupPermissionAssetAdmin = Permission::get()->filter(
[
'GroupID' => $id,
'Code' => 'CMS_ACCESS_AssetAdmin',
]
);
$this->assertEquals(1, $groupPermissionAssetAdmin->count());
$this->assertEquals(1, $groupPermissionAssetAdmin->first()->Type);

$this->assertTrue(Permission::check('CMS_ACCESS_AssetAdmin'));

$this->logOut();
}
}
18 changes: 18 additions & 0 deletions tests/php/Security/PermissionTest.yml
Expand Up @@ -33,6 +33,10 @@
FirstName: Left
Surname: AndMain
Email: leftandmain@example.com
testcmseditormember:
FirstName: CMS
Surname: Editor
Email: testcmseditor@example.com

'SilverStripe\Security\Group':
author:
Expand All @@ -50,6 +54,14 @@
leftandmain:
Title: LeftAndMain
Members: '=>SilverStripe\Security\Member.leftandmain'
cmsmaingroup:
Title: CMSMain
Members: '=>SilverStripe\Security\Member.testcmseditormember'
testpermissiongroup:
Title: TestPermissionGroup
testcmseditorgroup:
Title: TestCMSEditor
Members: '=>SilverStripe\Security\Member.testcmseditormember'

'SilverStripe\Security\Permission':
extra1:
Expand All @@ -61,3 +73,9 @@
leftandmain:
Code: CMS_ACCESS_LeftAndMain
Group: '=>SilverStripe\Security\Group.leftandmain'
cmsmain:
Code: CMS_ACCESS_CMSMain
Group: '=>SilverStripe\Security\Group.cmsmaingroup'
testcmseditor:
Code: TEST_CMS_EDITOR
Group: '=>SilverStripe\Security\Group.testcmseditorgroup'

0 comments on commit 70f1dc8

Please sign in to comment.