Refactor subuser permissions (#1961)

Co-authored-by: RMartinOscar <40749467+RMartinOscar@users.noreply.github.com>
This commit is contained in:
Boy132
2025-12-11 14:34:27 +01:00
committed by GitHub
parent 1ab4ddb07c
commit 760aaf9bfb
112 changed files with 610 additions and 668 deletions

View File

@@ -1,8 +1,8 @@
<?php
use App\Enums\ServerState;
use App\Enums\SubuserPermission;
use App\Http\Controllers\Api\Client\Servers\SettingsController;
use App\Models\Permission;
use App\Repositories\Daemon\DaemonServerRepository;
use Symfony\Component\HttpFoundation\Response;
@@ -11,7 +11,7 @@ pest()->group('API');
covers(SettingsController::class);
it('server name cannot be changed', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = generateTestAccount([SubuserPermission::WebsocketConnect]);
$originalName = $server->name;
$this->actingAs($user)
@@ -26,7 +26,7 @@ it('server name cannot be changed', function () {
});
it('server description can be changed', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_SETTINGS_DESCRIPTION]);
[$user, $server] = generateTestAccount([SubuserPermission::SettingsDescription]);
$originalDescription = $server->description;
$newDescription = 'Test Server Description';
@@ -45,7 +45,7 @@ it('server description can be changed', function () {
});
it('server description cannot be changed', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_SETTINGS_DESCRIPTION]);
[$user, $server] = generateTestAccount([SubuserPermission::SettingsDescription]);
Config::set('panel.editable_server_descriptions', false);
$originalDescription = $server->description;
@@ -61,7 +61,7 @@ it('server description cannot be changed', function () {
});
it('server name can be changed', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT, Permission::ACTION_SETTINGS_RENAME]);
[$user, $server] = generateTestAccount([SubuserPermission::WebsocketConnect, SubuserPermission::SettingsRename]);
$originalName = $server->name;
$this->actingAs($user)
@@ -76,7 +76,7 @@ it('server name can be changed', function () {
});
test('unauthorized user cannot change docker image in use by server', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = generateTestAccount([SubuserPermission::WebsocketConnect]);
$originalImage = $server->image;
$this->actingAs($user)
@@ -92,7 +92,7 @@ test('unauthorized user cannot change docker image in use by server', function (
test('cannot change docker image to image not allowed by egg', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_STARTUP_DOCKER_IMAGE]);
[$user, $server] = generateTestAccount([SubuserPermission::StartupDockerImage]);
$server->image = 'ghcr.io/pelican-eggs/yolks:java_17';
$server->save();
@@ -112,7 +112,7 @@ test('cannot change docker image to image not allowed by egg', function () {
});
test('can change docker image in use by server', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_STARTUP_DOCKER_IMAGE]);
[$user, $server] = generateTestAccount([SubuserPermission::StartupDockerImage]);
$oldImage = 'ghcr.io/pelican-eggs/yolks:java_17';
$server->image = $oldImage;
$server->save();
@@ -135,7 +135,7 @@ test('can change docker image in use by server', function () {
});
test('unable to change the docker image set by administrator', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_STARTUP_DOCKER_IMAGE]);
[$user, $server] = generateTestAccount([SubuserPermission::StartupDockerImage]);
$oldImage = 'ghcr.io/pelican-eggs/yolks:java_custom';
$server->image = $oldImage;
$server->save();
@@ -155,7 +155,7 @@ test('unable to change the docker image set by administrator', function () {
});
test('can be reinstalled', function () {
[$user, $server] = generateTestAccount([Permission::ACTION_SETTINGS_REINSTALL]);
[$user, $server] = generateTestAccount([SubuserPermission::SettingsReinstall]);
expect($server->isInstalled())->toBeTrue();
$service = \Mockery::mock(DaemonServerRepository::class);

View File

@@ -3,7 +3,6 @@
use App\Enums\RolePermissionModels;
use App\Filament\Admin\Resources\Eggs\Pages\ListEggs;
use App\Models\Egg;
use App\Models\Permission;
use App\Models\Role;
use function Pest\Livewire\livewire;

View File

@@ -3,7 +3,6 @@
use App\Enums\RolePermissionModels;
use App\Filament\Admin\Resources\Nodes\Pages\ListNodes;
use App\Models\Node;
use App\Models\Permission;
use App\Models\Role;
use App\Models\Server;
use Filament\Actions\CreateAction;

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client;
use App\Enums\SubuserPermission;
use App\Models\Allocation;
use App\Models\Permission;
use App\Models\Role;
use App\Models\Server;
use App\Models\Subuser;
@@ -158,7 +158,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
Subuser::query()->create([
'user_id' => $users[0]->id,
'server_id' => $servers[1]->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect->value],
]);
$response = $this->actingAs($users[0])->getJson('/api/client');
@@ -189,7 +189,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
Subuser::query()->create([
'user_id' => $users[0]->id,
'server_id' => $servers[1]->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect],
]);
$response = $this->actingAs($users[0])->getJson('/api/client?type=owner');
@@ -214,7 +214,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
->assertJson([
'object' => 'system_permissions',
'attributes' => [
'permissions' => Permission::permissions()->toArray(),
'permissions' => Subuser::allPermissionKeys(),
],
]);
}
@@ -239,7 +239,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
Subuser::query()->create([
'user_id' => $users[0]->id,
'server_id' => $servers[1]->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect->value],
]);
// Only servers 2 & 3 (0 indexed) should be returned by the API at this point. The user making
@@ -274,7 +274,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
Subuser::query()->create([
'user_id' => $users[0]->id,
'server_id' => $servers[1]->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect->value],
]);
// All servers should be returned.
@@ -311,7 +311,7 @@ class ClientControllerTest extends ClientApiIntegrationTestCase
public function test_only_primary_allocation_is_returned_to_subuser(): void
{
/** @var \App\Models\Server $server */
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$server->allocation->notes = 'Test notes';
$server->allocation->save();

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Allocation;
use App\Enums\SubuserPermission;
use App\Models\Allocation;
use App\Models\Permission;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
use PHPUnit\Framework\Attributes\DataProvider;
@@ -48,7 +48,7 @@ class CreateNewAllocationTest extends ClientApiIntegrationTestCase
public function test_allocation_cannot_be_created_if_user_does_not_have_permission(): void
{
/** @var \App\Models\Server $server */
[$user, $server] = $this->generateTestAccount([Permission::ACTION_ALLOCATION_UPDATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::AllocationUpdate]);
$server->update(['allocation_limit' => 2]);
$this->actingAs($user)->postJson($this->link($server, '/network/allocations'))->assertForbidden();
@@ -88,6 +88,6 @@ class CreateNewAllocationTest extends ClientApiIntegrationTestCase
public static function permissionDataProvider(): array
{
return [[[Permission::ACTION_ALLOCATION_CREATE]], [[]]];
return [[[SubuserPermission::AllocationCreate]], [[]]];
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Allocation;
use App\Enums\SubuserPermission;
use App\Models\Allocation;
use App\Models\Permission;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
use PHPUnit\Framework\Attributes\DataProvider;
@@ -56,7 +56,7 @@ class DeleteAllocationTest extends ClientApiIntegrationTestCase
public function test_error_is_returned_if_user_does_not_have_permission(): void
{
/** @var \App\Models\Server $server */
[$user, $server] = $this->generateTestAccount([Permission::ACTION_ALLOCATION_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::AllocationCreate]);
/** @var \App\Models\Allocation $allocation */
$allocation = Allocation::factory()->create([
@@ -101,6 +101,6 @@ class DeleteAllocationTest extends ClientApiIntegrationTestCase
public static function permissionDataProvider(): array
{
return [[[Permission::ACTION_ALLOCATION_DELETE]], [[]]];
return [[[SubuserPermission::AllocationDelete]], [[]]];
}
}

View File

@@ -2,9 +2,9 @@
namespace App\Tests\Integration\Api\Client\Server\Backup;
use App\Enums\SubuserPermission;
use App\Events\ActivityLogged;
use App\Models\Backup;
use App\Models\Permission;
use App\Repositories\Daemon\DaemonBackupRepository;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
@@ -24,7 +24,7 @@ class DeleteBackupTest extends ClientApiIntegrationTestCase
public function test_user_without_permission_cannot_delete_backup(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_BACKUP_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::BackupCreate]);
$backup = Backup::factory()->create(['server_id' => $server->id]);
@@ -41,7 +41,7 @@ class DeleteBackupTest extends ClientApiIntegrationTestCase
{
Event::fake([ActivityLogged::class]);
[$user, $server] = $this->generateTestAccount([Permission::ACTION_BACKUP_DELETE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::BackupDelete]);
/** @var \App\Models\Backup $backup */
$backup = Backup::factory()->create(['server_id' => $server->id]);

View File

@@ -2,9 +2,9 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Enums\SubuserPermission;
use App\Http\Controllers\Api\Client\Servers\CommandController;
use App\Http\Requests\Api\Client\Servers\SendCommandRequest;
use App\Models\Permission;
use App\Models\Server;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use GuzzleHttp\Exception\BadResponseException;
@@ -38,7 +38,7 @@ class CommandControllerTest extends ClientApiIntegrationTestCase
*/
public function test_subuser_without_permission_receives_error(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$response = $this->actingAs($user)->postJson("/api/client/servers/$server->uuid/command", [
'command' => 'say Test',
@@ -52,7 +52,7 @@ class CommandControllerTest extends ClientApiIntegrationTestCase
*/
public function test_command_can_send_to_server(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_CONTROL_CONSOLE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ControlConsole]);
$server = \Mockery::mock($server)->makePartial();

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Enums\SubuserPermission;
use App\Models\Allocation;
use App\Models\Permission;
use App\Models\User;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
@@ -41,7 +41,7 @@ class NetworkAllocationControllerTest extends ClientApiIntegrationTestCase
$this->actingAs($user)->getJson($this->link($server, '/network/allocations'))
->assertNotFound();
[$user, $server] = $this->generateTestAccount([Permission::ACTION_ALLOCATION_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::AllocationCreate]);
$this->actingAs($user)->getJson($this->link($server, '/network/allocations'))
->assertForbidden();
@@ -91,7 +91,7 @@ class NetworkAllocationControllerTest extends ClientApiIntegrationTestCase
$this->actingAs($user)->postJson($this->link($server->allocation))->assertNotFound();
[$user, $server] = $this->generateTestAccount([Permission::ACTION_ALLOCATION_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::AllocationCreate]);
$this->actingAs($user)->postJson($this->link($server->allocation))->assertForbidden();
}
@@ -125,7 +125,7 @@ class NetworkAllocationControllerTest extends ClientApiIntegrationTestCase
$this->actingAs($user)->postJson($this->link($server->allocation, '/primary'))
->assertNotFound();
[$user, $server] = $this->generateTestAccount([Permission::ACTION_ALLOCATION_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::AllocationCreate]);
$this->actingAs($user)->postJson($this->link($server->allocation, '/primary'))
->assertForbidden();
@@ -133,6 +133,6 @@ class NetworkAllocationControllerTest extends ClientApiIntegrationTestCase
public static function updatePermissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_ALLOCATION_UPDATE]]];
return [[[]], [[SubuserPermission::AllocationUpdate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Repositories\Daemon\DaemonServerRepository;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
@@ -15,7 +15,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase
* an error in response. This checks against the specific permission needed to send
* the command to the server.
*
* @param string[] $permissions
* @param array<string|SubuserPermission> $permissions
*/
#[DataProvider('invalidPermissionDataProvider')]
public function test_subuser_without_permissions_receives_error(string $action, array $permissions): void
@@ -47,7 +47,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase
* Test that sending a valid power actions works.
*/
#[DataProvider('validPowerActionDataProvider')]
public function test_action_can_be_sent_to_server(string $action, string $permission): void
public function test_action_can_be_sent_to_server(string $action, string|SubuserPermission $permission): void
{
$service = \Mockery::mock(DaemonServerRepository::class);
$this->app->instance(DaemonServerRepository::class, $service);
@@ -74,25 +74,25 @@ class PowerControllerTest extends ClientApiIntegrationTestCase
public static function invalidPermissionDataProvider(): array
{
return [
['start', [Permission::ACTION_CONTROL_STOP, Permission::ACTION_CONTROL_RESTART]],
['stop', [Permission::ACTION_CONTROL_START]],
['kill', [Permission::ACTION_CONTROL_START, Permission::ACTION_CONTROL_RESTART]],
['restart', [Permission::ACTION_CONTROL_STOP, Permission::ACTION_CONTROL_START]],
['random', [Permission::ACTION_CONTROL_START]],
['start', [SubuserPermission::ControlStop, SubuserPermission::ControlRestart]],
['stop', [SubuserPermission::ControlStart]],
['kill', [SubuserPermission::ControlStart, SubuserPermission::ControlRestart]],
['restart', [SubuserPermission::ControlStop, SubuserPermission::ControlStart]],
['random', [SubuserPermission::ControlStart]],
];
}
public static function validPowerActionDataProvider(): array
{
return [
['start', Permission::ACTION_CONTROL_START],
['stop', Permission::ACTION_CONTROL_STOP],
['restart', Permission::ACTION_CONTROL_RESTART],
['kill', Permission::ACTION_CONTROL_STOP],
['start', SubuserPermission::ControlStart],
['stop', SubuserPermission::ControlStop],
['restart', SubuserPermission::ControlRestart],
['kill', SubuserPermission::ControlStop],
// Yes, these spaces are intentional. You should be able to send values with or without
// a space on the start/end since we should be trimming the values.
[' restart', Permission::ACTION_CONTROL_RESTART],
['kill ', Permission::ACTION_CONTROL_STOP],
[' restart', SubuserPermission::ControlRestart],
['kill ', SubuserPermission::ControlStop],
];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Repositories\Daemon\DaemonServerRepository;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -16,7 +16,7 @@ class ResourceUtilizationControllerTest extends ClientApiIntegrationTestCase
$service = \Mockery::mock(DaemonServerRepository::class);
$this->app->instance(DaemonServerRepository::class, $service);
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$service->expects('setServer')->with(\Mockery::on(function ($value) use ($server) {
return $server->uuid === $value->uuid;

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Schedule;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Schedule;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
@@ -83,7 +83,7 @@ class CreateServerScheduleTest extends ClientApiIntegrationTestCase
*/
public function test_subuser_cannot_create_schedule_without_permissions(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_UPDATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleUpdate]);
$this->actingAs($user)
->postJson("/api/client/servers/$server->uuid/schedules", [])
@@ -92,6 +92,6 @@ class CreateServerScheduleTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SCHEDULE_CREATE]]];
return [[[]], [[SubuserPermission::ScheduleCreate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Schedule;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Schedule;
use App\Models\Task;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -66,7 +66,7 @@ class DeleteServerScheduleTest extends ClientApiIntegrationTestCase
*/
public function test_error_is_returned_if_subuser_does_not_have_required_permissions(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_UPDATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleUpdate]);
$schedule = Schedule::factory()->create(['server_id' => $server->id]);
@@ -79,6 +79,6 @@ class DeleteServerScheduleTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SCHEDULE_DELETE]]];
return [[[]], [[SubuserPermission::ScheduleDelete]]];
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Schedule;
use App\Enums\SubuserPermission;
use App\Jobs\Schedule\RunTaskJob;
use App\Models\Permission;
use App\Models\Schedule;
use App\Models\Task;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -56,7 +56,7 @@ class ExecuteScheduleTest extends ClientApiIntegrationTestCase
*/
public function test_user_without_schedule_update_permission_cannot_execute(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleCreate]);
/** @var \App\Models\Schedule $schedule */
$schedule = Schedule::factory()->create(['server_id' => $server->id]);
@@ -66,6 +66,6 @@ class ExecuteScheduleTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]];
return [[[]], [[SubuserPermission::ScheduleUpdate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Schedule;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Schedule;
use App\Models\Task;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -76,7 +76,7 @@ class GetServerSchedulesTest extends ClientApiIntegrationTestCase
*/
public function test_user_without_permission_cannot_view_schedules(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$this->actingAs($user)
->getJson("/api/client/servers/$server->uuid/schedules")
@@ -94,8 +94,8 @@ class GetServerSchedulesTest extends ClientApiIntegrationTestCase
return [
[[], false],
[[], true],
[[Permission::ACTION_SCHEDULE_READ], false],
[[Permission::ACTION_SCHEDULE_READ], true],
[[SubuserPermission::ScheduleRead], false],
[[SubuserPermission::ScheduleRead], true],
];
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Schedule;
use App\Enums\SubuserPermission;
use App\Helpers\Utilities;
use App\Models\Permission;
use App\Models\Schedule;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use PHPUnit\Framework\Attributes\DataProvider;
@@ -70,7 +70,7 @@ class UpdateServerScheduleTest extends ClientApiIntegrationTestCase
*/
public function test_error_is_returned_if_subuser_does_not_have_permission_to_modify_schedule(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleCreate]);
$schedule = Schedule::factory()->create(['server_id' => $server->id]);
@@ -109,6 +109,6 @@ class UpdateServerScheduleTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]];
return [[[]], [[SubuserPermission::ScheduleUpdate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\ScheduleTask;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Schedule;
use App\Models\Task;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -160,7 +160,7 @@ class CreateServerScheduleTaskTest extends ClientApiIntegrationTestCase
*/
public function test_error_is_returned_if_subuser_does_not_have_schedule_update_permissions(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleCreate]);
/** @var \App\Models\Schedule $schedule */
$schedule = Schedule::factory()->create(['server_id' => $server->id]);
@@ -172,6 +172,6 @@ class CreateServerScheduleTaskTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SCHEDULE_UPDATE]]];
return [[[]], [[SubuserPermission::ScheduleUpdate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\ScheduleTask;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Schedule;
use App\Models\Task;
use App\Models\User;
@@ -45,7 +45,7 @@ class DeleteScheduleTaskTest extends ClientApiIntegrationTestCase
*/
public function test_user_without_permission_returns_error(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_SCHEDULE_CREATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ScheduleCreate]);
$schedule = Schedule::factory()->create(['server_id' => $server->id]);
$task = Task::factory()->create(['schedule_id' => $schedule->id]);

View File

@@ -3,7 +3,7 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Enums\ServerState;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Server;
use App\Repositories\Daemon\DaemonServerRepository;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -48,7 +48,7 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase
*/
public function test_subuser_cannot_change_server_name_without_permission(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$originalName = $server->name;
$this->actingAs($user)
@@ -97,7 +97,7 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase
*/
public function test_subuser_cannot_reinstall_server_without_permission(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$this->actingAs($user)
->postJson("/api/client/servers/$server->uuid/settings/reinstall")
@@ -109,11 +109,11 @@ class SettingsControllerTest extends ClientApiIntegrationTestCase
public static function renamePermissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SETTINGS_RENAME]]];
return [[[]], [[SubuserPermission::SettingsRename]]];
}
public static function reinstallPermissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_SETTINGS_REINSTALL]]];
return [[[]], [[SubuserPermission::SettingsReinstall]]];
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Startup;
use App\Enums\SubuserPermission;
use App\Models\EggVariable;
use App\Models\Permission;
use App\Models\User;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use PHPUnit\Framework\Attributes\DataProvider;
@@ -51,7 +51,7 @@ class GetStartupAndVariablesTest extends ClientApiIntegrationTestCase
*/
public function test_startup_data_is_not_returned_without_permission(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$this->actingAs($user)->getJson($this->link($server) . '/startup')->assertForbidden();
$user2 = User::factory()->create();
@@ -60,6 +60,6 @@ class GetStartupAndVariablesTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_STARTUP_READ]]];
return [[[]], [[SubuserPermission::StartupRead]]];
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Tests\Integration\Api\Client\Server\Startup;
use App\Enums\SubuserPermission;
use App\Models\EggVariable;
use App\Models\Permission;
use App\Models\User;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Illuminate\Http\Response;
@@ -139,7 +139,7 @@ class UpdateStartupVariableTest extends ClientApiIntegrationTestCase
*/
public function test_startup_variable_cannot_be_updated_if_not_user_viewable(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$this->actingAs($user)->putJson($this->link($server) . '/startup/variable')->assertForbidden();
$user2 = User::factory()->create();
@@ -148,6 +148,6 @@ class UpdateStartupVariableTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_STARTUP_UPDATE]]];
return [[[]], [[SubuserPermission::StartupUpdate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Subuser;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Subuser;
use App\Models\User;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -26,7 +26,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email = $this->faker->email(),
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -38,8 +38,8 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response->assertJsonPath('object', Subuser::RESOURCE_NAME);
$response->assertJsonPath('attributes.uuid', $subuser->uuid);
$response->assertJsonPath('attributes.permissions', [
Permission::ACTION_USER_CREATE,
Permission::ACTION_WEBSOCKET_CONNECT,
SubuserPermission::UserCreate->value,
SubuserPermission::WebsocketConnect->value,
]);
$expected = $response->json('attributes');
@@ -55,16 +55,16 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
public function test_error_is_returned_if_assigning_permissions_not_assigned_to_self(): void
{
[$user, $server] = $this->generateTestAccount([
Permission::ACTION_USER_CREATE,
Permission::ACTION_USER_READ,
Permission::ACTION_CONTROL_CONSOLE,
SubuserPermission::UserCreate,
SubuserPermission::UserRead,
SubuserPermission::ControlConsole,
]);
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $this->faker->email(),
'permissions' => [
Permission::ACTION_USER_CREATE,
Permission::ACTION_USER_UPDATE, // This permission is not assigned to the subuser.
SubuserPermission::UserCreate->value,
SubuserPermission::UserUpdate->value, // This permission is not assigned to the subuser.
],
]);
@@ -85,7 +85,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email,
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -94,7 +94,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email . '.au',
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -117,7 +117,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $existing->email,
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -137,7 +137,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email = $this->faker->email(),
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -146,7 +146,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email,
'permissions' => [
Permission::ACTION_USER_CREATE,
SubuserPermission::UserCreate->value,
],
]);
@@ -157,6 +157,6 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
public static function permissionsDataProvider(): array
{
return [[[]], [[Permission::ACTION_USER_CREATE]]];
return [[[]], [[SubuserPermission::UserCreate]]];
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Subuser;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Subuser;
use App\Models\User;
use App\Repositories\Daemon\DaemonServerRepository;
@@ -39,7 +39,7 @@ class DeleteSubuserTest extends ClientApiIntegrationTestCase
Subuser::query()->forceCreate([
'user_id' => $subuser->id,
'server_id' => $server->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect],
]);
$mock->expects('setServer->revokeUserJTI')->with($subuser->id)->andReturnUndefined();
@@ -55,7 +55,7 @@ class DeleteSubuserTest extends ClientApiIntegrationTestCase
Subuser::query()->forceCreate([
'user_id' => $subuser->id,
'server_id' => $server->id,
'permissions' => [Permission::ACTION_WEBSOCKET_CONNECT],
'permissions' => [SubuserPermission::WebsocketConnect],
]);
$mock->expects('setServer->revokeUserJTI')->with($subuser->id)->andReturnUndefined();

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server\Subuser;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Models\Subuser;
use App\Models\User;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
@@ -43,9 +43,9 @@ class UpdateSubuserTest extends ClientApiIntegrationTestCase
$server->subusers()->where('user_id', $user->id)->update([
'permissions' => [
Permission::ACTION_USER_UPDATE,
Permission::ACTION_CONTROL_START,
Permission::ACTION_CONTROL_STOP,
SubuserPermission::UserUpdate,
SubuserPermission::ControlStart,
SubuserPermission::ControlStop,
],
]);
@@ -95,7 +95,7 @@ class UpdateSubuserTest extends ClientApiIntegrationTestCase
*/
public function test_user_cannot_assign_permissions_they_do_not_have(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::UserRead, SubuserPermission::UserUpdate]);
$subuser = Subuser::factory()
->for(User::factory()->create())
@@ -104,7 +104,7 @@ class UpdateSubuserTest extends ClientApiIntegrationTestCase
$this->actingAs($user)
->postJson("/api/client/servers/$server->uuid/users/{$subuser->user->uuid}", [
'permissions' => [Permission::ACTION_USER_READ, Permission::ACTION_CONTROL_CONSOLE],
'permissions' => [SubuserPermission::UserRead, SubuserPermission::ControlConsole],
])
->assertForbidden();
@@ -116,7 +116,7 @@ class UpdateSubuserTest extends ClientApiIntegrationTestCase
*/
public function test_user_cannot_update_self(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_USER_READ, Permission::ACTION_USER_UPDATE]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::UserRead, SubuserPermission::UserUpdate]);
$this->actingAs($user)
->postJson("/api/client/servers/$server->uuid/users/$user->uuid", [])

View File

@@ -2,7 +2,7 @@
namespace App\Tests\Integration\Api\Client\Server;
use App\Models\Permission;
use App\Enums\SubuserPermission;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use Carbon\CarbonImmutable;
use Illuminate\Http\Response;
@@ -16,7 +16,7 @@ class WebsocketControllerTest extends ClientApiIntegrationTestCase
{
public function test_subuser_without_websocket_permission_receives_error(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_CONTROL_RESTART]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::ControlRestart]);
$this->actingAs($user)->getJson("/api/client/servers/$server->uuid/websocket")
->assertStatus(Response::HTTP_FORBIDDEN)
@@ -29,8 +29,8 @@ class WebsocketControllerTest extends ClientApiIntegrationTestCase
*/
public function test_user_without_permission_for_server_receives_error(): void
{
[, $server] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[$user] = $this->generateTestAccount([Permission::ACTION_WEBSOCKET_CONNECT]);
[, $server] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
[$user] = $this->generateTestAccount([SubuserPermission::WebsocketConnect]);
$this->actingAs($user)->getJson("/api/client/servers/$server->uuid/websocket")
->assertStatus(Response::HTTP_NOT_FOUND);
@@ -86,7 +86,7 @@ class WebsocketControllerTest extends ClientApiIntegrationTestCase
public function test_jwt_is_configured_correctly_for_server_subuser(): void
{
$permissions = [Permission::ACTION_WEBSOCKET_CONNECT, Permission::ACTION_CONTROL_CONSOLE];
$permissions = [SubuserPermission::WebsocketConnect->value, SubuserPermission::ControlConsole->value];
/** @var \App\Models\User $user */
/** @var \App\Models\Server $server */

View File

@@ -3,8 +3,8 @@
namespace App\Tests\Integration\Api\Remote;
use App\Enums\ServerState;
use App\Enums\SubuserPermission;
use App\Models\Node;
use App\Models\Permission;
use App\Models\Role;
use App\Models\Server;
use App\Models\User;
@@ -135,7 +135,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
public function test_request_is_denied_if_user_lacks_sftp_permission(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_FILE_READ]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::FileRead]);
$user->update(['password' => password_hash('foobar', PASSWORD_DEFAULT)]);
@@ -163,7 +163,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
*/
public function test_user_permissions_are_returned_correctly(): void
{
[$user, $server] = $this->generateTestAccount([Permission::ACTION_FILE_READ, Permission::ACTION_FILE_SFTP]);
[$user, $server] = $this->generateTestAccount([SubuserPermission::FileRead, SubuserPermission::FileSftp]);
$user->update(['password' => password_hash('foobar', PASSWORD_DEFAULT)]);
@@ -176,7 +176,7 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
$this->postJson('/api/remote/sftp/auth', $data)
->assertOk()
->assertJsonPath('permissions', [Permission::ACTION_FILE_READ, Permission::ACTION_FILE_SFTP]);
->assertJsonPath('permissions', [SubuserPermission::FileRead->value, SubuserPermission::FileSftp->value]);
$user->syncRoles(Role::getRootAdmin());

View File

@@ -2,6 +2,7 @@
namespace App\Tests\Traits\Integration;
use App\Enums\SubuserPermission;
use App\Models\Allocation;
use App\Models\Egg;
use App\Models\Node;
@@ -65,7 +66,7 @@ trait CreatesTestModels
* Generates a user and a server for that user. If an array of permissions is passed it
* is assumed that the user is actually a subuser of the server.
*
* @param string[] $permissions
* @param array<string|SubuserPermission> $permissions
* @return array{\App\Models\User, \App\Models\Server}
*/
public function generateTestAccount(array $permissions = []): array
@@ -82,7 +83,7 @@ trait CreatesTestModels
Subuser::query()->create([
'user_id' => $user->id,
'server_id' => $server->id,
'permissions' => $permissions,
'permissions' => array_map(fn ($permission) => $permission instanceof SubuserPermission ? $permission->value : $permission, $permissions),
]);
return [$user, $server];