]> BookStack Code Mirror - bookstack/commitdiff
Updated shelf menu item to show on custom permission
authorDan Brown <redacted>
Sat, 9 Mar 2019 21:15:45 +0000 (21:15 +0000)
committerDan Brown <redacted>
Sat, 9 Mar 2019 21:15:45 +0000 (21:15 +0000)
- Extended new 'userCanOnAny' helper to take a entity class for
filtering.

Closes #1201

app/Auth/Permissions/PermissionService.php
app/helpers.php
resources/views/base.blade.php
tests/Entity/BookShelfTest.php

index 33d2149637b98b40bc568ee67b105af6fe896b20..8fc70e916dbd5dec3c5e878222de11861dfd9b45 100644 (file)
@@ -558,28 +558,35 @@ class PermissionService
 
     /**
      * Checks if a user has the given permission for any items in the system.
+     * Can be passed an entity instance to filter on a specific type.
      * @param string $permission
+     * @param string $entityClass
      * @return bool
      */
-    public function checkUserHasPermissionOnAnything(string $permission)
+    public function checkUserHasPermissionOnAnything(string $permission, string $entityClass = null)
     {
         $userRoleIds = $this->currentUser()->roles()->select('id')->pluck('id')->toArray();
         $userId = $this->currentUser()->id;
 
-        $canCreatePage = $this->db->table('joint_permissions')
+        $permissionQuery = $this->db->table('joint_permissions')
             ->where('action', '=', $permission)
             ->whereIn('role_id', $userRoleIds)
             ->where(function ($query) use ($userId) {
                 $query->where('has_permission', '=', 1)
-                ->orWhere(function ($query2) use ($userId) {
-                    $query2->where('has_permission_own', '=', 1)
-                    ->where('created_by', '=', $userId);
-                });       
-            })
-            ->get()->count() > 0;
+                    ->orWhere(function ($query2) use ($userId) {
+                        $query2->where('has_permission_own', '=', 1)
+                            ->where('created_by', '=', $userId);
+                    });
+        }) ;
+
+        if (!is_null($entityClass)) {
+            $entityInstance = app()->make($entityClass);
+            $permissionQuery = $permissionQuery->where('entity_type', '=', $entityInstance->getMorphClass());
+        }
 
+        $hasPermission = $permissionQuery->count() > 0;
         $this->clean();
-        return $canCreatePage;
+        return $hasPermission;
     }
 
     /**
index 0825a2e4aff87fde91afe6eaf0f67e65ffe2f587..d9533645de6e31ae1c464b7466f1ee71a498a721 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use BookStack\Auth\Permissions\PermissionService;
+use BookStack\Entities\Entity;
 use BookStack\Ownable;
 
 /**
@@ -70,12 +71,13 @@ function userCan(string $permission, Ownable $ownable = null)
  * Check if the current user has the given permission
  * on any item in the system.
  * @param string $permission
+ * @param string|null $entityClass
  * @return bool
  */
-function userCanOnAny(string $permission)
+function userCanOnAny(string $permission, string $entityClass = null)
 {
     $permissionService = app(PermissionService::class);
-    return $permissionService->checkUserHasPermissionOnAnything($permission);
+    return $permissionService->checkUserHasPermissionOnAnything($permission, $entityClass);
 }
 
 /**
index c7a5acca80a0398fdfe5bb58fedf9c88f7bf4ef5..fdd248091d9dfcf29ddd3d819f27c75daa63d597 100644 (file)
@@ -48,7 +48,7 @@
                             </form>
                         </div>
                         <div class="links text-center">
-                            @if(userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
+                            @if(userCanOnAny('view', \BookStack\Entities\Bookshelf::class) || userCan('bookshelf-view-own'))
                                 <a href="{{ baseUrl('/shelves') }}">@icon('bookshelf'){{ trans('entities.shelves') }}</a>
                             @endif
                             <a href="{{ baseUrl('/books') }}">@icon('book'){{ trans('entities.books') }}</a>
index 5d71ec6f6a15f12c5c5e1cd7e057f70ccd5de6bb..bdba812d59a16593516e96f99e0a6a78e64393a8 100644 (file)
@@ -1,5 +1,7 @@
 <?php namespace Tests;
 
+use BookStack\Auth\Role;
+use BookStack\Auth\User;
 use BookStack\Entities\Book;
 use BookStack\Entities\Bookshelf;
 
@@ -27,6 +29,22 @@ class BookShelfTest extends TestCase
         $resp->assertElementContains('header', 'Shelves');
     }
 
+    public function test_shelves_shows_in_header_if_have_any_shelve_view_permission()
+    {
+        $user = factory(User::class)->create();
+        $this->giveUserPermissions($user, ['image-create-all']);
+        $shelf = Bookshelf::first();
+        $userRole = $user->roles()->first();
+
+        $resp = $this->actingAs($user)->get('/');
+        $resp->assertElementNotContains('header', 'Shelves');
+
+        $this->setEntityRestrictions($shelf, ['view'], [$userRole]);
+
+        $resp = $this->get('/');
+        $resp->assertElementContains('header', 'Shelves');
+    }
+
     public function test_shelves_page_contains_create_link()
     {
         $resp = $this->asEditor()->get('/shelves');