]> BookStack Code Mirror - bookstack/commitdiff
Made adjustments to fit copied work into dev branch
authorDan Brown <redacted>
Sat, 21 Jan 2023 13:03:47 +0000 (13:03 +0000)
committerDan Brown <redacted>
Sat, 21 Jan 2023 13:03:47 +0000 (13:03 +0000)
Ported non-compatible elements, Now all tests passing apart from some
specific permission scenario tests which are probably correctly failing.
Updates some tests to better avoid messing environment state.

dev/docs/permission-scenario-testing.md
tests/Commands/RegeneratePermissionsCommandTest.php
tests/Entity/BookShelfTest.php
tests/Helpers/PermissionsProvider.php
tests/Permissions/EntityPermissionsTest.php
tests/Permissions/Scenarios/EntityUserPermissionsTest.php [deleted file]
tests/TestCase.php
tests/Unit/FrameworkAssumptionTest.php

index 6d0935f09ae0befc79ee0cf7a8205d01bd205062..e738fe972596b08ace63707b874b56772546addf 100644 (file)
@@ -6,19 +6,16 @@ Test cases are written ability abstract, since all abilities should act the same
 
 Tests are categorised by the most specific element involved in the scenario, where the below list is most specific to least:
 
-- User entity permissions.
 - Role entity permissions.
 - Fallback entity permissions.
 - Role permissions.
 
-- TODO - Test fallback in the context of the above.
-
 ## General Permission Logical Rules
 
 The below are some general rules we follow to standardise the behaviour of permissions in the platform:
 
 - Most specific permission application (as above) take priority and can deny less specific permissions.
-- Parent user/role entity permissions that may be inherited, are considered to essentially be applied on the item they are inherited to unless a lower level has its own permission rule for an already specific role/user.
+- Parent role entity permissions that may be inherited, are considered to essentially be applied on the item they are inherited to unless a lower level has its own permission rule for an already specific role.
 - Where both grant and deny exist at the same specificity, we side towards grant.
 
 ## Cases
@@ -241,181 +238,3 @@ User denied page permission.
 - User has Role A & B.
 
 User denied page permission.
-
----
-
-### Entity User Permissions
-
-These are tests related to entity-level user-specific permission overrides.
-
-#### test_01_explicit_allow
-
-- Page permissions have inherit disabled.
-- User has entity allow page permission.
-
-User granted page permission.
-
-#### test_02_explicit_deny
-
-- Page permissions have inherit disabled.
-- User has entity deny page permission.
-
-User denied page permission.
-
-#### test_10_allow_inherit
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity allow chapter permission.
-
-User granted page permission.
-
-#### test_11_deny_inherit
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity deny chapter permission.
-
-User denied page permission.
-
-#### test_12_allow_inherit_override
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity deny chapter permission.
-- User has entity allow page permission.
-
-User granted page permission.
-
-#### test_13_deny_inherit_override
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity allow chapter permission.
-- User has entity deny page permission.
-
-User denied page permission.
-
-#### test_40_entity_role_override_allow
-
-- Page permissions have inherit disabled.
-- User has entity allow page permission.
-- Role A has entity deny page permission.
-- User has role A.
-
-User granted page permission.
-
-#### test_41_entity_role_override_deny
-
-- Page permissions have inherit disabled.
-- User has entity deny page permission.
-- Role A has entity allow page permission.
-- User has role A.
-
-User denied page permission.
-
-#### test_42_entity_role_override_allow_via_inherit
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity allow chapter permission.
-- Role A has entity deny page permission.
-- User has role A.
-
-User granted page permission.
-
-#### test_43_entity_role_override_deny_via_inherit
-
-- Page permissions have inherit enabled.
-- Chapter permissions have inherit disabled.
-- User has entity deny chapter permission.
-- Role A has entity allow page permission.
-- User has role A.
-
-User denied page permission.
-
-#### test_50_role_override_allow
-
-- Page permissions have inherit enabled.
-- Role A has no page role permission.
-- User has entity allow page permission.
-- User has Role A.
-
-User granted page permission.
-
-#### test_51_role_override_deny
-
-- Page permissions have inherit enabled.
-- Role A has all-page role permission.
-- User has entity deny page permission.
-- User has Role A.
-
-User denied page permission.
-
-#### test_60_inherited_role_override_allow
-
-- Page permissions have inherit enabled.
-- Role A has no page role permission.
-- User has entity allow chapter permission.
-- User has Role A.
-
-User granted page permission.
-
-#### test_61_inherited_role_override_deny
-
-- Page permissions have inherit enabled.
-- Role A has view-all page role permission.
-- User has entity deny chapter permission.
-- User has Role A.
-
-User denied page permission.
-
-#### test_61_inherited_role_override_deny_on_own
-
-- Page permissions have inherit enabled.
-- Role A has view-own page role permission.
-- User has entity deny chapter permission.
-- User has Role A.
-- User owns Page.
-
-User denied page permission.
-
-#### test_70_all_override_allow
-
-- Page permissions have inherit enabled.
-- Role A has no page role permission.
-- Role A has entity deny page permission.
-- User has entity allow page permission.
-- User has Role A.
-
-User granted page permission.
-
-#### test_71_all_override_deny
-
-- Page permissions have inherit enabled.
-- Role A has page-all role permission.
-- Role A has entity allow page permission.
-- User has entity deny page permission.
-- User has Role A.
-
-User denied page permission.
-
-#### test_80_inherited_all_override_allow
-
-- Page permissions have inherit enabled.
-- Role A has no page role permission.
-- Role A has entity deny chapter permission.
-- User has entity allow chapter permission.
-- User has Role A.
-
-User granted page permission.
-
-#### test_81_inherited_all_override_deny
-
-- Page permissions have inherit enabled.
-- Role A has view-all page role permission.
-- Role A has entity allow chapter permission.
-- User has entity deny chapter permission.
-- User has Role A.
-
-User denied page permission.
\ No newline at end of file
index cc53b460d890a2f7826d29bdd86e2bf3b313717a..b916a8060f84bdb4afa3082f22c773e0e1a5d02a 100644 (file)
@@ -3,6 +3,8 @@
 namespace Tests\Commands;
 
 use BookStack\Auth\Permissions\CollapsedPermission;
+use BookStack\Auth\Permissions\EntityPermission;
+use BookStack\Auth\Permissions\JointPermission;
 use Illuminate\Support\Facades\Artisan;
 use Illuminate\Support\Facades\DB;
 use Tests\TestCase;
@@ -14,21 +16,25 @@ class RegeneratePermissionsCommandTest extends TestCase
         DB::rollBack();
         $page = $this->entities->page();
         $editor = $this->users->editor();
-        $this->permissions->addEntityPermission($page, ['view'], null, $editor);
-        CollapsedPermission::query()->truncate();
+        $role = $editor->roles()->first();
+        $this->permissions->addEntityPermission($page, ['view'], $role);
+        JointPermission::query()->truncate();
 
-        $this->assertDatabaseMissing('entity_permissions_collapsed', ['entity_id' => $page->id]);
+        $this->assertDatabaseMissing('joint_permissions', ['entity_id' => $page->id]);
 
         $exitCode = Artisan::call('bookstack:regenerate-permissions');
         $this->assertTrue($exitCode === 0, 'Command executed successfully');
 
-        $this->assertDatabaseHas('entity_permissions_collapsed', [
+        $this->assertDatabaseHas('joint_permissions', [
             'entity_id' => $page->id,
-            'user_id' => $editor->id,
-            'view' => 1,
+            'entity_type' => 'page',
+            'role_id' => $role->id,
+            'has_permission' => 1,
         ]);
 
-        CollapsedPermission::query()->truncate();
+        $page->permissions()->delete();
+        $page->rebuildPermissions();
+
         DB::beginTransaction();
     }
 }
index 5c6489281720711c56c3ada7d1458eb634876488..d953f36924d3521571aec4319cc9a4ec67499867 100644 (file)
@@ -21,6 +21,7 @@ class BookShelfTest extends TestCase
         $this->withHtml($resp)->assertElementContains('header', 'Shelves');
 
         $viewer->roles()->delete();
+        $this->permissions->grantUserRolePermissions($viewer, []);
         $resp = $this->actingAs($viewer)->get('/');
         $this->withHtml($resp)->assertElementNotContains('header', 'Shelves');
 
index ac9a2a68a61f65a44d71a39c49a8eb76ea82f4f5..2cbfb1af583388afae693198006844a1bf83248b 100644 (file)
@@ -85,7 +85,7 @@ class PermissionsProvider
 
         if (!$inherit) {
             // Set default permissions to not allow actions so that only the provided role permissions are at play.
-            $permissions[] = ['role_id' => null, 'user_id' => null, 'view' => false, 'create' => false, 'update' => false, 'delete' => false];
+            $permissions[] = ['role_id' => 0, 'view' => false, 'create' => false, 'update' => false, 'delete' => false];
         }
 
         foreach ($roles as $role) {
@@ -95,9 +95,9 @@ class PermissionsProvider
         $this->addEntityPermissionEntries($entity, $permissions);
     }
 
-    public function addEntityPermission(Entity $entity, array $actionList, ?Role $role = null, ?User $user = null)
+    public function addEntityPermission(Entity $entity, array $actionList, Role $role)
     {
-        $permissionData = $this->actionListToEntityPermissionData($actionList, $role->id ?? null, $user->id ?? null);
+        $permissionData = $this->actionListToEntityPermissionData($actionList, $role->id);
         $this->addEntityPermissionEntries($entity, [$permissionData]);
     }
 
@@ -107,7 +107,7 @@ class PermissionsProvider
      */
     public function disableEntityInheritedPermissions(Entity $entity): void
     {
-        $entity->permissions()->whereNull(['user_id', 'role_id'])->delete();
+        $entity->permissions()->where('role_id', '=', 0)->delete();
         $fallback = $this->actionListToEntityPermissionData([]);
         $this->addEntityPermissionEntries($entity, [$fallback]);
     }
@@ -124,9 +124,9 @@ class PermissionsProvider
      * the format to entity permission data, where permission is granted if the action is in the
      * given actionList array.
      */
-    protected function actionListToEntityPermissionData(array $actionList, int $roleId = null, int $userId = null): array
+    protected function actionListToEntityPermissionData(array $actionList, int $roleId = 0): array
     {
-        $permissionData = ['role_id' => $roleId, 'user_id' => $userId];
+        $permissionData = ['role_id' => $roleId];
         foreach (EntityPermission::PERMISSIONS as $possibleAction) {
             $permissionData[$possibleAction] = in_array($possibleAction, $actionList);
         }
index 68a4ed2441c3a49e5e496a57a56184c202090cb8..ab8b1242df2db3c4871f773cb63289e1b5c28544 100644 (file)
@@ -379,19 +379,17 @@ class EntityPermissionsTest extends TestCase
 
         $this->put($modelInstance->getUrl('/permissions'), [
             'permissions' => [
-                'role' => [
-                    $roleId => [
-                        $permission => 'true',
-                    ],
+                $roleId => [
+                    $permission => 'true',
                 ],
             ],
         ]);
 
         $this->assertDatabaseHas('entity_permissions', [
-            'entity_id'   => $modelInstance->id,
-            'entity_type' => $modelInstance->getMorphClass(),
-            'role_id'           => $roleId,
-            $permission         => true,
+            'entity_id'      => $modelInstance->id,
+            'entity_type'    => $modelInstance->getMorphClass(),
+            'role_id'        => $roleId,
+            $permission => true,
         ]);
     }
 
diff --git a/tests/Permissions/Scenarios/EntityUserPermissionsTest.php b/tests/Permissions/Scenarios/EntityUserPermissionsTest.php
deleted file mode 100644 (file)
index 4fa8058..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-
-namespace Tests\Permissions\Scenarios;
-
-class EntityUserPermissionsTest extends PermissionScenarioTestCase
-{
-    public function test_01_explicit_allow()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->page();
-        $this->permissions->disableEntityInheritedPermissions($page);
-        $this->permissions->addEntityPermission($page, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_02_explicit_deny()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->page();
-        $this->permissions->disableEntityInheritedPermissions($page);
-        $this->permissions->addEntityPermission($page, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_10_allow_inherit()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_11_deny_inherit()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_12_allow_inherit_override()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-        $this->permissions->addEntityPermission($page, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_13_deny_inherit_override()
-    {
-        $user = $this->users->newUser();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, ['view'], null, $user);
-        $this->permissions->addEntityPermission($page, ['deny'], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_40_entity_role_override_allow()
-    {
-        [$user, $role] = $this->users->newUserWithRole();
-        $page = $this->entities->page();
-        $this->permissions->disableEntityInheritedPermissions($page);
-        $this->permissions->addEntityPermission($page, ['view'], null, $user);
-        $this->permissions->addEntityPermission($page, [], $role);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_41_entity_role_override_deny()
-    {
-        [$user, $role] = $this->users->newUserWithRole();
-        $page = $this->entities->page();
-        $this->permissions->disableEntityInheritedPermissions($page);
-        $this->permissions->addEntityPermission($page, [], null, $user);
-        $this->permissions->addEntityPermission($page, ['view'], $role);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_42_entity_role_override_allow_via_inherit()
-    {
-        [$user, $role] = $this->users->newUserWithRole();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, ['view'], null, $user);
-        $this->permissions->addEntityPermission($page, [], $role);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_43_entity_role_override_deny_via_inherit()
-    {
-        [$user, $role] = $this->users->newUserWithRole();
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->disableEntityInheritedPermissions($chapter);
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-        $this->permissions->addEntityPermission($page, ['view'], $role);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_50_role_override_allow()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole();
-        $page = $this->entities->page();
-        $this->permissions->addEntityPermission($page, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_51_role_override_deny()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], ['page-view-all']);
-        $page = $this->entities->page();
-        $this->permissions->addEntityPermission($page, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_60_inherited_role_override_allow()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], []);
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->addEntityPermission($chapter, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_61_inherited_role_override_deny()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], ['page-view-all']);
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_61_inherited_role_override_deny_on_own()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], ['page-view-own']);
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-        $this->permissions->changeEntityOwner($page, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_70_all_override_allow()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], []);
-        $page = $this->entities->page();
-        $this->permissions->addEntityPermission($page, [], $roleA, null);
-        $this->permissions->addEntityPermission($page, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_71_all_override_deny()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], ['page-view-all']);
-        $page = $this->entities->page();
-        $this->permissions->addEntityPermission($page, ['view'], $roleA, null);
-        $this->permissions->addEntityPermission($page, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-
-    public function test_80_inherited_all_override_allow()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], []);
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->addEntityPermission($chapter, [], $roleA, null);
-        $this->permissions->addEntityPermission($chapter, ['view'], null, $user);
-
-        $this->assertVisibleToUser($page, $user);
-    }
-
-    public function test_81_inherited_all_override_deny()
-    {
-        [$user, $roleA] = $this->users->newUserWithRole([], ['page-view-all']);
-        $page = $this->entities->pageWithinChapter();
-        $chapter = $page->chapter;
-        $this->permissions->addEntityPermission($chapter, ['view'], $roleA, null);
-        $this->permissions->addEntityPermission($chapter, [], null, $user);
-
-        $this->assertNotVisibleToUser($page, $user);
-    }
-}
index 70fd0da1d2719e90ead4389a51cde9d2db3794e9..a5d75655cb577dfb0eff09bff07d2c15e96e7f92 100644 (file)
@@ -153,9 +153,12 @@ abstract class TestCase extends BaseTestCase
 
         DB::purge();
         config()->set('database.connections.mysql_testing.database', $database);
+        DB::beginTransaction();
 
         $callback();
 
+        DB::rollBack();
+
         if (is_null($originalVal)) {
             unset($_SERVER[$name]);
         } else {
index d4feff60c9da66973019dec0596cd80a316f2845..54d315de94054c2765fa559b3e258a7adb4442c9 100644 (file)
@@ -25,7 +25,7 @@ class FrameworkAssumptionTest extends TestCase
         // Page has SoftDeletes trait by default, so we apply our custom scope and ensure
         // it stacks on the global scope to filter out deleted items.
         $query = Page::query()->scopes('visible')->toSql();
-        $this->assertStringContainsString('entity_permissions_collapsed', $query);
+        $this->assertStringContainsString('joint_permissions', $query);
         $this->assertStringContainsString('`deleted_at` is null', $query);
     }
 }