Skip to content

Commit a23c6d5

Browse files
committed
feat: centralize view-users gate, apply middleware, add coverage
1 parent ba97286 commit a23c6d5

3 files changed

Lines changed: 76 additions & 7 deletions

File tree

ProcessMaker/Http/Controllers/Api/UserController.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,7 @@ class UserController extends Controller
8686
*/
8787
public function index(Request $request)
8888
{
89-
if (!(Auth::user()->can('view-users') ||
90-
Auth::user()->can('create-processes') ||
91-
Auth::user()->can('edit-processes') ||
92-
Auth::user()->can('create-projects') ||
93-
Auth::user()->can('view-projects'))) {
89+
if (Auth::user()->cannot('view-users')) {
9490
throw new AuthorizationException(__('Not authorized to view users.'));
9591
}
9692
$query = User::nonSystem();

ProcessMaker/Providers/AuthServiceProvider.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,13 @@ public function defineGates()
102102
});
103103
}
104104

105-
// Allow project managers to list users for membership without the full view-users permission.
105+
// Allow listing users when managing projects or processes without the full view-users permission.
106106
Gate::define('view-users', function ($user) {
107-
return $user->hasPermission('view-users') || $user->hasPermission('create-projects');
107+
return $user->hasPermission('view-users')
108+
|| $user->hasPermission('create-projects')
109+
|| $user->hasPermission('create-processes')
110+
|| $user->hasPermission('edit-processes')
111+
|| $user->hasPermission('view-projects');
108112
});
109113
} catch (\Exception $e) {
110114
Log::notice('Unable to register gates. Either no database connection or no permissions table exists.');
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace Tests\Feature\Api;
4+
5+
use Illuminate\Support\Facades\Cache;
6+
use ProcessMaker\Models\Permission;
7+
use Tests\Feature\Shared\RequestHelper;
8+
use Tests\TestCase;
9+
10+
class UserControllerTest extends TestCase
11+
{
12+
use RequestHelper {
13+
RequestHelper::setUp as requestHelperSetUp;
14+
}
15+
16+
public $withPermissions = true;
17+
18+
protected function setUp(): void
19+
{
20+
$this->requestHelperSetUp();
21+
22+
$this->user->is_administrator = false;
23+
$this->user->save();
24+
$this->user->permissions()->detach();
25+
Cache::forget("user_{$this->user->id}_manager");
26+
Cache::forget("user_{$this->user->id}_permissions");
27+
$this->user->invalidatePermissionCache();
28+
}
29+
30+
public function testUsersIndexRequiresPermission(): void
31+
{
32+
self::assertFalse($this->user->hasPermission('view-users'));
33+
34+
$response = $this->apiCall('GET', route('api.users.index'));
35+
36+
$response->assertStatus(403);
37+
}
38+
39+
public function testUsersIndexSucceedsWithPermission(): void
40+
{
41+
$this->user->permissions()->attach(Permission::byName('view-users'));
42+
$this->user->refresh();
43+
$this->user->invalidatePermissionCache();
44+
45+
$response = $this->apiCall('GET', route('api.users.index'));
46+
47+
$response->assertOk();
48+
}
49+
50+
public function testUsersTaskCountRequiresPermission(): void
51+
{
52+
self::assertFalse($this->user->hasPermission('view-users'));
53+
54+
$response = $this->apiCall('GET', route('api.users.users_task_count'));
55+
56+
$response->assertStatus(403);
57+
}
58+
59+
public function testUsersTaskCountSucceedsWithPermission(): void
60+
{
61+
$this->user->permissions()->attach(Permission::byName('view-users'));
62+
$this->user->refresh();
63+
$this->user->invalidatePermissionCache();
64+
65+
$response = $this->apiCall('GET', route('api.users.users_task_count'));
66+
67+
$response->assertOk();
68+
}
69+
}

0 commit comments

Comments
 (0)