Skip to content

Commit 3322927

Browse files
committed
Merge branch 'master' into 8.x
2 parents b692d0c + 22a6c81 commit 3322927

File tree

10 files changed

+138
-3
lines changed

10 files changed

+138
-3
lines changed

resources/views/panel/edit.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class="form-textarea mt-1 block w-full"
6363
class="form-checkbox h-4 w-4"
6464
name="permissions[]"
6565
value="{{$permission->getKey()}}"
66-
{!! $permission->assigned ? 'checked' : '' !!}
66+
{!! ($model && $permission->assigned) ? 'checked' : '' !!}
6767
>
6868
<span class="ml-2">{{$permission->display_name ?? $permission->name}}</span>
6969
</label>
@@ -101,4 +101,4 @@ class="btn btn-red mr-4"
101101
}
102102
}
103103
</script>
104-
@endsection
104+
@endsection

src/Laratrust.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@ public function hasPermission(
5151
return false;
5252
}
5353

54+
/**
55+
* Check if the current user does not have a permission by its name.
56+
*/
57+
public function doesntHavePermission(
58+
string|array|BackedEnum $permission,
59+
mixed $team = null,
60+
bool $requireAll = false
61+
): bool {
62+
return ! $this->hasPermission($permission, $team, $requireAll);
63+
}
64+
5465
/**
5566
* Check if the current user has a permission by its name.
5667
* Alias to hasPermission.
@@ -63,6 +74,18 @@ public function isAbleTo(
6374
return $this->hasPermission($permission, $team, $requireAll);
6475
}
6576

77+
/**
78+
* Check if the current user does not have a permission by its name.
79+
* Alias to doesntHavePermission.
80+
*/
81+
public function isNotAbleTo(
82+
string|array|BackedEnum $permission,
83+
mixed $team = null,
84+
bool $requireAll = false
85+
): bool {
86+
return $this->doesntHavePermission($permission, $team, $requireAll);
87+
}
88+
6689
/**
6790
* Check if the current user has a role or permission by its name.
6891
*

src/Models/Role.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ public function hasPermission(string|array|BackedEnum $permission, bool $require
106106
->currentRoleHasPermission($permission, $requireAll);
107107
}
108108

109+
public function doesntHavePermission(string|array|BackedEnum $permission, bool $requireAll = false): bool
110+
{
111+
return ! $this->hasPermission($permission, $requireAll);
112+
}
113+
109114
public function syncPermissions(iterable $permissions): static
110115
{
111116
$mappedPermissions = [];

src/Traits/HasRolesAndPermissions.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,17 @@ public function hasPermission(
195195
);
196196
}
197197

198+
/**
199+
* Check if user does not have a permission by its name.
200+
*/
201+
public function doesntHavePermission(
202+
string|array|BackedEnum $permission,
203+
mixed $team = null,
204+
bool $requireAll = false
205+
): bool {
206+
return ! $this->hasPermission($permission, $team, $requireAll);
207+
}
208+
198209
/**
199210
* Check if user has a permission by its name.
200211
*/
@@ -206,6 +217,17 @@ public function isAbleTo(
206217
return $this->hasPermission($permission, $team, $requireAll);
207218
}
208219

220+
/**
221+
* Check if user does not have a permission by its name.
222+
*/
223+
public function isNotAbleTo(
224+
string|array|BackedEnum $permission,
225+
mixed $team = null,
226+
bool $requireAll = false
227+
): bool {
228+
return ! $this->isAbleTo($permission, $team, $requireAll);
229+
}
230+
209231
/**
210232
* Checks role(s) and permission(s).
211233
*

tests/Checkers/Role/DefaultCheckerTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,18 @@ public function testHasPermission()
3434
$this->assertTrue($this->role->hasPermission('permission_b'));
3535
$this->assertFalse($this->role->hasPermission('permission_c'));
3636

37+
$this->assertFalse($this->role->doesntHavePermission(EnumsPermission::PERM_A));
38+
$this->assertFalse($this->role->doesntHavePermission('permission_b'));
39+
$this->assertTrue($this->role->doesntHavePermission('permission_c'));
40+
3741
$this->assertTrue($this->role->hasPermission([EnumsPermission::PERM_A, 'permission_b']));
3842
$this->assertTrue($this->role->hasPermission(['permission_a', 'permission_c']));
3943
$this->assertFalse($this->role->hasPermission([EnumsPermission::PERM_A, 'permission_c'], true));
4044
$this->assertFalse($this->role->hasPermission(['permission_c', 'permission_d']));
45+
46+
$this->assertFalse($this->role->doesntHavePermission([EnumsPermission::PERM_A, 'permission_b']));
47+
$this->assertFalse($this->role->doesntHavePermission(['permission_a', 'permission_c']));
48+
$this->assertTrue($this->role->doesntHavePermission([EnumsPermission::PERM_A, 'permission_c'], true));
49+
$this->assertTrue($this->role->doesntHavePermission(['permission_c', 'permission_d']));
4150
}
4251
}

tests/Checkers/Role/LaratrustRoleCustomCheckerTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,18 @@ public function testHasPermission()
4444
$this->assertTrue($this->role->hasPermission('permission_b'));
4545
$this->assertFalse($this->role->hasPermission('permission_c'));
4646

47+
$this->assertFalse($this->role->doesntHavePermission(EnumsPermission::PERM_A));
48+
$this->assertFalse($this->role->doesntHavePermission('permission_b'));
49+
$this->assertTrue($this->role->doesntHavePermission('permission_c'));
50+
4751
$this->assertTrue($this->role->hasPermission(['permission_a', 'permission_b']));
4852
$this->assertTrue($this->role->hasPermission(['permission_a', 'permission_c']));
4953
$this->assertFalse($this->role->hasPermission([EnumsPermission::PERM_A, 'permission_c'], true));
5054
$this->assertFalse($this->role->hasPermission(['permission_c', 'permission_d']));
55+
56+
$this->assertFalse($this->role->doesntHavePermission(['permission_a', 'permission_b']));
57+
$this->assertFalse($this->role->doesntHavePermission(['permission_a', 'permission_c']));
58+
$this->assertTrue($this->role->doesntHavePermission([EnumsPermission::PERM_A, 'permission_c'], true));
59+
$this->assertTrue($this->role->doesntHavePermission(['permission_c', 'permission_d']));
5160
}
5261
}

tests/Checkers/Role/QueryCheckerTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,18 @@ public function testHasPermission()
3434
$this->assertTrue($this->role->hasPermission('permission_b'));
3535
$this->assertFalse($this->role->hasPermission('permission_c'));
3636

37+
$this->assertFalse($this->role->doesntHavePermission(EnumsPermission::PERM_A));
38+
$this->assertFalse($this->role->doesntHavePermission('permission_b'));
39+
$this->assertTrue($this->role->doesntHavePermission('permission_c'));
40+
3741
$this->assertTrue($this->role->hasPermission(['permission_a', 'permission_b']));
3842
$this->assertTrue($this->role->hasPermission(['permission_a', 'permission_c']));
3943
$this->assertFalse($this->role->hasPermission([EnumsPermission::PERM_A, 'permission_c'], true));
4044
$this->assertFalse($this->role->hasPermission(['permission_c', 'permission_d']));
45+
46+
$this->assertFalse($this->role->doesntHavePermission(['permission_a', 'permission_b']));
47+
$this->assertFalse($this->role->doesntHavePermission(['permission_a', 'permission_c']));
48+
$this->assertTrue($this->role->doesntHavePermission([EnumsPermission::PERM_A, 'permission_c'], true));
49+
$this->assertTrue($this->role->doesntHavePermission(['permission_c', 'permission_d']));
4150
}
4251
}

tests/Checkers/User/CheckerTestCase.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,23 @@ protected function hasPermissionAssertions()
145145
$this->assertTrue($this->user->hasPermission(EnumsPermission::PERM_A));
146146
$this->assertTrue($this->user->hasPermission('permission_b', 'team_a'));
147147
$this->assertTrue($this->user->hasPermission('permission_b', $team));
148+
$this->assertFalse($this->user->doesntHavePermission(EnumsPermission::PERM_A));
149+
$this->assertFalse($this->user->doesntHavePermission('permission_b', 'team_a'));
150+
$this->assertFalse($this->user->doesntHavePermission('permission_b', $team));
148151
$this->app['config']->set('laratrust.teams.strict_check', true);
149152
$this->assertFalse($this->user->hasPermission('permission_c'));
153+
$this->assertTrue($this->user->doesntHavePermission('permission_c'));
150154
$this->app['config']->set('laratrust.teams.strict_check', false);
151155
$this->assertTrue($this->user->hasPermission('permission_c'));
152156
$this->assertTrue($this->user->hasPermission('permission_c', 'team_a'));
153157
$this->assertTrue($this->user->hasPermission('permission_c', $team));
154158
$this->assertTrue($this->user->hasPermission('permission_d'));
155159
$this->assertFalse($this->user->hasPermission('permission_e'));
160+
$this->assertFalse($this->user->doesntHavePermission('permission_c'));
161+
$this->assertFalse($this->user->doesntHavePermission('permission_c', 'team_a'));
162+
$this->assertFalse($this->user->doesntHavePermission('permission_c', $team));
163+
$this->assertFalse($this->user->doesntHavePermission('permission_d'));
164+
$this->assertTrue($this->user->doesntHavePermission('permission_e'));
156165

157166
$this->assertTrue($this->user->hasPermission([EnumsPermission::PERM_A, 'permission_b', 'permission_c', 'permission_d', 'permission_e']));
158167
$this->assertTrue($this->user->hasPermission('permission_a|permission_b|permission_c|permission_d|permission_e'));
@@ -163,13 +172,26 @@ protected function hasPermissionAssertions()
163172
$this->assertFalse($this->user->hasPermission(['permission_a', 'permission_b', 'permission_e'], requireAll: true));
164173
$this->assertFalse($this->user->hasPermission(['permission_e', 'permission_f']));
165174

175+
$this->assertFalse($this->user->doesntHavePermission([EnumsPermission::PERM_A, 'permission_b', 'permission_c', 'permission_d', 'permission_e']));
176+
$this->assertFalse($this->user->doesntHavePermission('permission_a|permission_b|permission_c|permission_d|permission_e'));
177+
$this->assertFalse($this->user->doesntHavePermission(['permission_a', 'permission_d'], requireAll: true));
178+
$this->assertFalse($this->user->doesntHavePermission(['permission_a', 'permission_b', 'permission_d'], requireAll: true));
179+
$this->assertTrue($this->user->doesntHavePermission([EnumsPermission::PERM_A, 'permission_b', 'permission_d'], 'team_a', true));
180+
$this->assertTrue($this->user->doesntHavePermission(['permission_a', 'permission_b', 'permission_d'], $team, true));
181+
$this->assertTrue($this->user->doesntHavePermission(['permission_a', 'permission_b', 'permission_e'], requireAll: true));
182+
$this->assertTrue($this->user->doesntHavePermission(['permission_e', 'permission_f']));
183+
166184
$this->app['config']->set('laratrust.teams.enabled', false);
167185
$this->assertTrue($this->user->hasPermission(['permission_a', 'permission_b', 'permission_d'], 'team_a', true));
168186
$this->assertTrue($this->user->hasPermission(['permission_a', 'permission_b', 'permission_d'], $team, true));
187+
$this->assertFalse($this->user->doesntHavePermission(['permission_a', 'permission_b', 'permission_d'], 'team_a', true));
188+
$this->assertFalse($this->user->doesntHavePermission(['permission_a', 'permission_b', 'permission_d'], $team, true));
169189

170190
$this->app['config']->set('laratrust.cache.enabled', false);
171191
$this->assertTrue($this->user->hasPermission('permission_b', 'team_a'));
172192
$this->assertTrue($this->user->hasPermission('permission_c', 'team_a'));
193+
$this->assertFalse($this->user->doesntHavePermission('permission_b', 'team_a'));
194+
$this->assertFalse($this->user->doesntHavePermission('permission_c', 'team_a'));
173195
}
174196

175197
protected function hasPermissionWithPlaceholderSupportAssertions()
@@ -205,11 +227,22 @@ protected function hasPermissionWithPlaceholderSupportAssertions()
205227
$this->assertTrue($this->user->hasPermission('admin.users'));
206228
$this->assertFalse($this->user->hasPermission('admin.config', 'team_a'));
207229

230+
$this->assertFalse($this->user->doesntHavePermission('admin.posts'));
231+
$this->assertFalse($this->user->doesntHavePermission('admin.pages'));
232+
$this->assertFalse($this->user->doesntHavePermission('admin.users'));
233+
$this->assertTrue($this->user->doesntHavePermission('admin.config', 'team_a'));
234+
208235
$this->assertTrue($this->user->hasPermission(['admin.*']));
209236
$this->assertTrue($this->user->hasPermission(['admin.*']));
210237
$this->assertTrue($this->user->hasPermission(['config.*'], 'team_a'));
211238
$this->assertTrue($this->user->hasPermission(['config.*']));
212239
$this->assertFalse($this->user->hasPermission(['site.*']));
240+
241+
$this->assertFalse($this->user->doesntHavePermission(['admin.*']));
242+
$this->assertFalse($this->user->doesntHavePermission(['admin.*']));
243+
$this->assertFalse($this->user->doesntHavePermission(['config.*'], 'team_a'));
244+
$this->assertFalse($this->user->doesntHavePermission(['config.*']));
245+
$this->assertTrue($this->user->doesntHavePermission(['site.*']));
213246
}
214247

215248
public function userDisableTheRolesAndPermissionsCachingAssertions()

tests/LaratrustFacadeTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ public function testHasPermission()
4646
$this->assertFalse($this->laratrust->hasPermission('any_permission'));
4747
}
4848

49+
public function testDoesntHavePermission()
50+
{
51+
$this->laratrust->shouldReceive('user')->andReturn($this->user)->twice()->ordered();
52+
$this->laratrust->shouldReceive('user')->andReturn(null)->once()->ordered();
53+
$this->user->shouldReceive('hasPermission')->with('user_can', null, false)->andReturn(true)->once();
54+
$this->user->shouldReceive('hasPermission')->with('user_cannot', null, false)->andReturn(false)->once();
55+
56+
$this->assertFalse($this->laratrust->doesntHavePermission('user_can'));
57+
$this->assertTrue($this->laratrust->doesntHavePermission('user_cannot'));
58+
$this->assertTrue($this->laratrust->doesntHavePermission('any_permission'));
59+
}
60+
4961
public function testIsAbleTo()
5062
{
5163
$this->laratrust->shouldReceive('user')->andReturn($this->user)->twice()->ordered();
@@ -58,6 +70,18 @@ public function testIsAbleTo()
5870
$this->assertFalse($this->laratrust->isAbleTo('any_permission'));
5971
}
6072

73+
public function testIsNotAbleTo()
74+
{
75+
$this->laratrust->shouldReceive('user')->andReturn($this->user)->twice()->ordered();
76+
$this->laratrust->shouldReceive('user')->andReturn(null)->once()->ordered();
77+
$this->user->shouldReceive('hasPermission')->with('user_can', null, false)->andReturn(true)->once();
78+
$this->user->shouldReceive('hasPermission')->with('user_cannot', null, false)->andReturn(false)->once();
79+
80+
$this->assertFalse($this->laratrust->isNotAbleTo('user_can'));
81+
$this->assertTrue($this->laratrust->isNotAbleTo('user_cannot'));
82+
$this->assertTrue($this->laratrust->isNotAbleTo('any_permission'));
83+
}
84+
6185
public function testAbility()
6286
{
6387
$this->laratrust->shouldReceive('user')->andReturn($this->user)->twice()->ordered();

tests/UserTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,15 @@ public function testIsAbleTo()
149149
| Expectation
150150
|------------------------------------------------------------
151151
*/
152-
$user->shouldReceive('hasPermission')->with('manage_user', null, false)->andReturn(true)->once();
152+
$user->shouldReceive('hasPermission')->with('manage_user', null, false)->andReturn(true)->twice();
153153

154154
/*
155155
|------------------------------------------------------------
156156
| Assertion
157157
|------------------------------------------------------------
158158
*/
159159
$this->assertTrue($user->isAbleTo('manage_user'));
160+
$this->assertFalse($user->isNotAbleTo('manage_user'));
160161
}
161162

162163
public function testAddRole()

0 commit comments

Comments
 (0)