diff --git a/app/Auth/Permissions/PermissionService.php b/app/Auth/Permissions/PermissionService.php index bd4066936..d858a7c18 100644 --- a/app/Auth/Permissions/PermissionService.php +++ b/app/Auth/Permissions/PermissionService.php @@ -526,8 +526,10 @@ class PermissionService $action = end($explodedPermission); $this->currentAction = $action; + $nonJointPermissions = ['restrictions', 'image', 'attachment', 'comment']; + // Handle non entity specific jointPermissions - if (!($ownable instanceof Entity)) { + if (in_array($explodedPermission[0], $nonJointPermissions)) { $allPermission = $this->currentUser() && $this->currentUser()->can($permission . '-all'); $ownPermission = $this->currentUser() && $this->currentUser()->can($permission . '-own'); $this->currentAction = 'view'; diff --git a/app/Entities/Repos/BaseRepo.php b/app/Entities/Repos/BaseRepo.php index ff4fc635b..f93271430 100644 --- a/app/Entities/Repos/BaseRepo.php +++ b/app/Entities/Repos/BaseRepo.php @@ -34,6 +34,7 @@ class BaseRepo $entity->forceFill([ 'created_by' => user()->id, 'updated_by' => user()->id, + 'owned_by' => user()->id, ]); $entity->refreshSlug(); $entity->save(); diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index 153ef8575..f664d2126 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -130,6 +130,7 @@ class PageRepo $page = (new Page())->forceFill([ 'name' => trans('entities.pages_initial_name'), 'created_by' => user()->id, + 'owned_by' => user()->id, 'updated_by' => user()->id, 'draft' => true, ]); diff --git a/tests/BrowserKitTest.php b/tests/BrowserKitTest.php index bb5aaa031..a6c461c44 100644 --- a/tests/BrowserKitTest.php +++ b/tests/BrowserKitTest.php @@ -1,10 +1,16 @@ <?php namespace Tests; +use BookStack\Auth\User; +use BookStack\Entities\Models\Book; +use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Entity; use BookStack\Auth\Role; use BookStack\Auth\Permissions\PermissionService; +use BookStack\Entities\Models\Page; use BookStack\Settings\SettingService; +use DB; use Illuminate\Contracts\Console\Kernel; +use Illuminate\Foundation\Application; use Illuminate\Foundation\Testing\DatabaseTransactions; use Laravel\BrowserKitTesting\TestCase; use Symfony\Component\DomCrawler\Crawler; @@ -23,14 +29,14 @@ abstract class BrowserKitTest extends TestCase public function tearDown() : void { - \DB::disconnect(); + DB::disconnect(); parent::tearDown(); } /** * Creates the application. * - * @return \Illuminate\Foundation\Application + * @return Application */ public function createApplication() { @@ -47,7 +53,7 @@ abstract class BrowserKitTest extends TestCase */ public function getNormalUser() { - return \BookStack\Auth\User::where('system_name', '=', null)->get()->last(); + return User::where('system_name', '=', null)->get()->last(); } /** @@ -64,23 +70,21 @@ abstract class BrowserKitTest extends TestCase /** * Create a group of entities that belong to a specific user. - * @param $creatorUser - * @param $updaterUser - * @return array */ - protected function createEntityChainBelongingToUser($creatorUser, $updaterUser = false) + protected function createEntityChainBelongingToUser(User $creatorUser, ?User $updaterUser): array { - if ($updaterUser === false) $updaterUser = $creatorUser; - $book = factory(\BookStack\Entities\Models\Book::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]); - $chapter = factory(\BookStack\Entities\Models\Chapter::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id]); - $page = factory(\BookStack\Entities\Models\Page::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id, 'chapter_id' => $chapter->id]); + if (empty($updaterUser)) { + $updaterUser = $creatorUser; + } + + $userAttrs = ['created_by' => $creatorUser->id, 'owned_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]; + $book = factory(Book::class)->create($userAttrs); + $chapter = factory(Chapter::class)->create(array_merge(['book_id' => $book->id], $userAttrs)); + $page = factory(Page::class)->create(array_merge(['book_id' => $book->id, 'chapter_id' => $chapter->id], $userAttrs)); $restrictionService = $this->app[PermissionService::class]; $restrictionService->buildJointPermissionsForEntity($book); - return [ - 'book' => $book, - 'chapter' => $chapter, - 'page' => $page - ]; + + return compact('book', 'chapter', 'page'); } /** @@ -101,7 +105,7 @@ abstract class BrowserKitTest extends TestCase */ protected function getNewBlankUser($attributes = []) { - $user = factory(\BookStack\Auth\User::class)->create($attributes); + $user = factory(User::class)->create($attributes); return $user; } diff --git a/tests/Entity/SortTest.php b/tests/Entity/SortTest.php index bb67bfc3e..01f764b7b 100644 --- a/tests/Entity/SortTest.php +++ b/tests/Entity/SortTest.php @@ -287,7 +287,7 @@ class SortTest extends TestCase $resp = $this->actingAs($viewer)->get($page->getUrl()); $resp->assertDontSee($page->getUrl('/copy')); - $newBook->created_by = $viewer->id; + $newBook->owned_by = $viewer->id; $newBook->save(); $this->giveUserPermissions($viewer, ['page-create-own']); $this->regenEntityPermissions($newBook); diff --git a/tests/Permissions/RolesTest.php b/tests/Permissions/RolesTest.php index 9f32a9f49..3397ef429 100644 --- a/tests/Permissions/RolesTest.php +++ b/tests/Permissions/RolesTest.php @@ -289,7 +289,7 @@ class RolesTest extends BrowserKitTest { $otherShelf = Bookshelf::first(); $ownShelf = $this->newShelf(['name' => 'test-shelf', 'slug' => 'test-shelf']); - $ownShelf->forceFill(['created_by' => $this->user->id, 'updated_by' => $this->user->id])->save(); + $ownShelf->forceFill(['owned_by' => $this->user->id, 'updated_by' => $this->user->id])->save(); $this->regenEntityPermissions($ownShelf); $this->checkAccessPermission('bookshelf-update-own', [ @@ -319,7 +319,7 @@ class RolesTest extends BrowserKitTest $this->giveUserPermissions($this->user, ['bookshelf-update-all']); $otherShelf = Bookshelf::first(); $ownShelf = $this->newShelf(['name' => 'test-shelf', 'slug' => 'test-shelf']); - $ownShelf->forceFill(['created_by' => $this->user->id, 'updated_by' => $this->user->id])->save(); + $ownShelf->forceFill(['owned_by' => $this->user->id, 'updated_by' => $this->user->id])->save(); $this->regenEntityPermissions($ownShelf); $this->checkAccessPermission('bookshelf-delete-own', [