/**
* 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;
}
/**
<?php
use BookStack\Auth\Permissions\PermissionService;
+use BookStack\Entities\Entity;
use BookStack\Ownable;
/**
* 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);
}
/**
</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>
<?php namespace Tests;
+use BookStack\Auth\Role;
+use BookStack\Auth\User;
use BookStack\Entities\Book;
use BookStack\Entities\Bookshelf;
$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');