diff --git a/app/Filament/Server/Resources/UserResource.php b/app/Filament/Server/Resources/UserResource.php index edfd2b83d..abad10e62 100644 --- a/app/Filament/Server/Resources/UserResource.php +++ b/app/Filament/Server/Resources/UserResource.php @@ -19,8 +19,8 @@ use Filament\Forms\Components\Tabs\Tab; use Filament\Forms\Components\TextInput; use Filament\Forms\Set; use Filament\Notifications\Notification; -use Filament\Tables\Actions\DeleteAction; use Filament\Resources\Resource; +use Filament\Tables\Actions\DeleteAction; use Filament\Tables\Actions\EditAction; use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\TextColumn; @@ -83,6 +83,35 @@ class UserResource extends Resource /** @var Server $server */ $server = Filament::getTenant(); + $tabs = []; + $permissionsArray = []; + + foreach (Permission::permissionData() as $data) { + $options = []; + $descriptions = []; + + foreach ($data['permissions'] as $permission) { + $options[$permission] = str($permission)->headline(); + $descriptions[$permission] = trans('server/users.permissions.' . $data['name'] . '_' . str($permission)->replace('-', '_')); + $permissionsArray[$data['name']][] = $permission; + } + + $tabs[] = Tab::make(str($data['name'])->headline()) + ->schema([ + Section::make() + ->description(trans('server/users.permissions.' . $data['name'] . '_desc')) + ->icon($data['icon']) + ->schema([ + CheckboxList::make($data['name']) + ->label('') + ->bulkToggleable() + ->columns(2) + ->options($options) + ->descriptions($descriptions), + ]), + ]); + } + return $table ->paginated(false) ->searchable(false) @@ -158,69 +187,8 @@ class UserResource extends Resource Actions::make([ Action::make('assignAll') ->label('Assign All') - ->action(function (Set $set) { - $permissions = [ - 'control' => [ - 'console', - 'start', - 'stop', - 'restart', - ], - 'user' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'file' => [ - 'read', - 'read-content', - 'create', - 'update', - 'delete', - 'archive', - 'sftp', - ], - 'backup' => [ - 'read', - 'create', - 'delete', - 'download', - 'restore', - ], - 'allocation' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'startup' => [ - 'read', - 'update', - 'docker-image', - ], - 'database' => [ - 'read', - 'create', - 'update', - 'delete', - 'view_password', - ], - 'schedule' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'settings' => [ - 'rename', - 'reinstall', - ], - 'activity' => [ - 'read', - ], - ]; - + ->action(function (Set $set) use ($permissionsArray) { + $permissions = $permissionsArray; foreach ($permissions as $key => $value) { $allValues = array_unique($value); $set($key, $allValues); @@ -235,264 +203,25 @@ class UserResource extends Resource ]), Tabs::make() ->columnSpanFull() - ->schema([ - Tab::make('Console') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.control_desc')) - ->icon('tabler-terminal-2') - ->schema([ - CheckboxList::make('control') - ->formatStateUsing(function (User $user, Set $set) use ($server) { - $permissionsArray = $server->subusers->where('user_id', $user->id)->first()->permissions; - - $transformedPermissions = []; - - foreach ($permissionsArray as $permission) { - [$group, $action] = explode('.', $permission, 2); - $transformedPermissions[$group][] = $action; - } - - foreach ($transformedPermissions as $key => $value) { - $set($key, $value); - } - - return $transformedPermissions['control'] ?? []; - }) - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'console' => 'Console', - 'start' => 'Start', - 'stop' => 'Stop', - 'restart' => 'Restart', - ]) - ->descriptions([ - 'console' => trans('server/users.permissions.control_console'), - 'start' => trans('server/users.permissions.control_start'), - 'stop' => trans('server/users.permissions.control_stop'), - 'restart' => trans('server/users.permissions.control_restart'), - ]), - ]), - ]), - Tab::make('User') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.user_desc')) - ->icon('tabler-users') - ->schema([ - CheckboxList::make('user') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.user_create'), - 'read' => trans('server/users.permissions.user_read'), - 'update' => trans('server/users.permissions.user_update'), - 'delete' => trans('server/users.permissions.user_delete'), - ]), - ]), - ]), - Tab::make('File') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.file_desc')) - ->icon('tabler-folders') - ->schema([ - CheckboxList::make('file') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'read-content' => 'Read Content', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - 'archive' => 'Archive', - 'sftp' => 'SFTP', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.file_create'), - 'read' => trans('server/users.permissions.file_read'), - 'read-content' => trans('server/users.permissions.file_read_content'), - 'update' => trans('server/users.permissions.file_update'), - 'delete' => trans('server/users.permissions.file_delete'), - 'archive' => trans('server/users.permissions.file_archive'), - 'sftp' => trans('server/users.permissions.file_sftp'), - ]), - ]), - ]), - Tab::make('Backup') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.backup_desc')) - ->icon('tabler-download') - ->schema([ - CheckboxList::make('backup') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'delete' => 'Delete', - 'download' => 'Download', - 'restore' => 'Restore', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.backup_create'), - 'read' => trans('server/users.permissions.backup_read'), - 'delete' => trans('server/users.permissions.backup_delete'), - 'download' => trans('server/users.permissions.backup_download'), - 'restore' => trans('server/users.permissions.backup_restore'), - ]), - ]), - ]), - Tab::make('Allocation') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.allocation_desc')) - ->icon('tabler-network') - ->schema([ - CheckboxList::make('allocation') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.allocation_read'), - 'create' => trans('server/users.permissions.allocation_create'), - 'update' => trans('server/users.permissions.allocation_update'), - 'delete' => trans('server/users.permissions.allocation_delete'), - ]), - ]), - ]), - Tab::make('Startup') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.startup_desc')) - ->icon('tabler-question-mark') - ->schema([ - CheckboxList::make('startup') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'update' => 'Update', - 'docker-image' => 'Docker Image', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.startup_read'), - 'update' => trans('server/users.permissions.startup_update'), - 'docker-image' => trans('server/users.permissions.startup_docker_image'), - ]), - ]), - ]), - Tab::make('Database') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.database_desc')) - ->icon('tabler-database') - ->schema([ - CheckboxList::make('database') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - 'view_password' => 'View Password', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.database_read'), - 'create' => trans('server/users.permissions.database_create'), - 'update' => trans('server/users.permissions.database_update'), - 'delete' => trans('server/users.permissions.database_delete'), - 'view_password' => trans('server/users.permissions.database_view_password'), - ]), - ]), - ]), - Tab::make('Schedule') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.schedule_desc')) - ->icon('tabler-clock') - ->schema([ - CheckboxList::make('schedule') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.schedule_read'), - 'create' => trans('server/users.permissions.schedule_create'), - 'update' => trans('server/users.permissions.schedule_update'), - 'delete' => trans('server/users.permissions.schedule_delete'), - ]), - ]), - ]), - Tab::make('Settings') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.settings_desc')) - ->icon('tabler-settings') - ->schema([ - CheckboxList::make('settings') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'rename' => 'Rename', - 'reinstall' => 'Reinstall', - ]) - ->descriptions([ - 'rename' => trans('server/users.permissions.setting_rename'), - 'reinstall' => trans('server/users.permissions.setting_reinstall'), - ]), - ]), - ]), - Tab::make('Activity') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.activity_desc')) - ->icon('tabler-stack') - ->schema([ - CheckboxList::make('activity') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.activity_read'), - ]), - ]), - ]), - ]), + ->schema($tabs), ]), - ]), + ]) + ->mutateRecordDataUsing(function ($data, User $user) use ($server) { + $permissionsArray = $server->subusers->where('user_id', $user->id)->first()->permissions; + + $transformedPermissions = []; + + foreach ($permissionsArray as $permission) { + [$group, $action] = explode('.', $permission, 2); + $transformedPermissions[$group][] = $action; + } + + foreach ($transformedPermissions as $key => $value) { + $data[$key] = $value; + } + + return $data; + }), ]); } diff --git a/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php b/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php index 3ec4611ce..ce0201e32 100644 --- a/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php +++ b/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php @@ -10,8 +10,8 @@ use App\Services\Subusers\SubuserCreationService; use Exception; use Filament\Actions; use Filament\Facades\Filament; -use Filament\Forms\Components\Actions as assignAll; use Filament\Forms\Components\Actions\Action; +use Filament\Forms\Components\Actions as assignAll; use Filament\Forms\Components\CheckboxList; use Filament\Forms\Components\Grid; use Filament\Forms\Components\Section; @@ -32,6 +32,35 @@ class ListUsers extends ListRecords /** @var Server $server */ $server = Filament::getTenant(); + $tabs = []; + $permissionsArray = []; + + foreach (Permission::permissionData() as $data) { + $options = []; + $descriptions = []; + + foreach ($data['permissions'] as $permission) { + $options[$permission] = str($permission)->headline(); + $descriptions[$permission] = trans('server/users.permissions.' . $data['name'] . '_' . str($permission)->replace('-', '_')); + $permissionsArray[$data['name']][] = $permission; + } + + $tabs[] = Tab::make(str($data['name'])->headline()) + ->schema([ + Section::make() + ->description(trans('server/users.permissions.' . $data['name'] . '_desc')) + ->icon($data['icon']) + ->schema([ + CheckboxList::make($data['name']) + ->label('') + ->bulkToggleable() + ->columns(2) + ->options($options) + ->descriptions($descriptions), + ]), + ]); + } + return [ Actions\CreateAction::make('invite') ->label('Invite User') @@ -60,72 +89,10 @@ class ListUsers extends ListRecords assignAll::make([ Action::make('assignAll') ->label('Assign All') - ->action(function (Set $set, Get $get) { - $permissions = [ - 'control' => [ - 'console', - 'start', - 'stop', - 'restart', - ], - 'user' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'file' => [ - 'read', - 'read-content', - 'create', - 'update', - 'delete', - 'archive', - 'sftp', - ], - 'backup' => [ - 'read', - 'create', - 'delete', - 'download', - 'restore', - ], - 'allocation' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'startup' => [ - 'read', - 'update', - 'docker-image', - ], - 'database' => [ - 'read', - 'create', - 'update', - 'delete', - 'view_password', - ], - 'schedule' => [ - 'read', - 'create', - 'update', - 'delete', - ], - 'settings' => [ - 'rename', - 'reinstall', - ], - 'activity' => [ - 'read', - ], - ]; - + ->action(function (Set $set, Get $get) use ($permissionsArray) { + $permissions = $permissionsArray; foreach ($permissions as $key => $value) { - $currentValues = $get($key) ?? []; - $allValues = array_unique(array_merge($currentValues, $value)); + $allValues = array_unique($value); $set($key, $allValues); } }), @@ -138,247 +105,7 @@ class ListUsers extends ListRecords ]), Tabs::make() ->columnSpanFull() - ->schema([ - Tab::make('Console') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.control_desc')) - ->icon('tabler-terminal-2') - ->schema([ - CheckboxList::make('control') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'console' => 'Console', - 'start' => 'Start', - 'stop' => 'Stop', - 'restart' => 'Restart', - ]) - ->descriptions([ - 'console' => trans('server/users.permissions.control_console'), - 'start' => trans('server/users.permissions.control_start'), - 'stop' => trans('server/users.permissions.control_stop'), - 'restart' => trans('server/users.permissions.control_restart'), - ]), - ]), - ]), - Tab::make('User') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.user_desc')) - ->icon('tabler-users') - ->schema([ - CheckboxList::make('user') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.user_create'), - 'read' => trans('server/users.permissions.user_read'), - 'update' => trans('server/users.permissions.user_update'), - 'delete' => trans('server/users.permissions.user_delete'), - ]), - ]), - ]), - Tab::make('File') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.file_desc')) - ->icon('tabler-folders') - ->schema([ - CheckboxList::make('file') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'read-content' => 'Read Content', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - 'archive' => 'Archive', - 'sftp' => 'SFTP', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.file_create'), - 'read' => trans('server/users.permissions.file_read'), - 'read-content' => trans('server/users.permissions.file_read_content'), - 'update' => trans('server/users.permissions.file_update'), - 'delete' => trans('server/users.permissions.file_delete'), - 'archive' => trans('server/users.permissions.file_archive'), - 'sftp' => trans('server/users.permissions.file_sftp'), - ]), - ]), - ]), - Tab::make('Backup') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.backup_desc')) - ->icon('tabler-download') - ->schema([ - CheckboxList::make('backup') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'delete' => 'Delete', - 'download' => 'Download', - 'restore' => 'Restore', - ]) - ->descriptions([ - 'create' => trans('server/users.permissions.backup_create'), - 'read' => trans('server/users.permissions.backup_read'), - 'delete' => trans('server/users.permissions.backup_delete'), - 'download' => trans('server/users.permissions.backup_download'), - 'restore' => trans('server/users.permissions.backup_restore'), - ]), - ]), - ]), - Tab::make('Allocation') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.allocation_desc')) - ->icon('tabler-network') - ->schema([ - CheckboxList::make('allocation') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.allocation_read'), - 'create' => trans('server/users.permissions.allocation_create'), - 'update' => trans('server/users.permissions.allocation_update'), - 'delete' => trans('server/users.permissions.allocation_delete'), - ]), - ]), - ]), - Tab::make('Startup') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.startup_desc')) - ->icon('tabler-question-mark') - ->schema([ - CheckboxList::make('startup') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'update' => 'Update', - 'docker-image' => 'Docker Image', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.startup_read'), - 'update' => trans('server/users.permissions.startup_update'), - 'docker-image' => trans('server/users.permissions.startup_docker_image'), - ]), - ]), - ]), - Tab::make('Database') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.database_desc')) - ->icon('tabler-database') - ->schema([ - CheckboxList::make('database') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - 'view_password' => 'View Password', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.database_read'), - 'create' => trans('server/users.permissions.database_create'), - 'update' => trans('server/users.permissions.database_update'), - 'delete' => trans('server/users.permissions.database_delete'), - 'view_password' => trans('server/users.permissions.database_view_password'), - ]), - ]), - ]), - Tab::make('Schedule') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.schedule_desc')) - ->icon('tabler-clock') - ->schema([ - CheckboxList::make('schedule') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.schedule_read'), - 'create' => trans('server/users.permissions.schedule_create'), - 'update' => trans('server/users.permissions.schedule_update'), - 'delete' => trans('server/users.permissions.schedule_delete'), - ]), - ]), - ]), - Tab::make('Settings') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.settings_desc')) - ->icon('tabler-settings') - ->schema([ - CheckboxList::make('settings') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'rename' => 'Rename', - 'reinstall' => 'Reinstall', - ]) - ->descriptions([ - 'rename' => trans('server/users.permissions.setting_rename'), - 'reinstall' => trans('server/users.permissions.setting_reinstall'), - ]), - ]), - ]), - Tab::make('Activity') - ->schema([ - Section::make() - ->description(trans('server/users.permissions.activity_desc')) - ->icon('tabler-stack') - ->schema([ - CheckboxList::make('activity') - ->bulkToggleable() - ->label('') - ->columns(2) - ->options([ - 'read' => 'Read', - ]) - ->descriptions([ - 'read' => trans('server/users.permissions.activity_read'), - ]), - ]), - ]), - ]), - + ->schema($tabs), ]), ]) ->modalHeading('Invite User') diff --git a/app/Models/Permission.php b/app/Models/Permission.php index 62d36e2c4..d9f489102 100644 --- a/app/Models/Permission.php +++ b/app/Models/Permission.php @@ -39,7 +39,7 @@ class Permission extends Model implements Validatable public const ACTION_DATABASE_DELETE = 'database.delete'; - public const ACTION_DATABASE_VIEW_PASSWORD = 'database.view_password'; + public const ACTION_DATABASE_VIEW_PASSWORD = 'database.view-password'; public const ACTION_SCHEDULE_READ = 'schedule.read'; @@ -114,127 +114,6 @@ class Permission extends Model implements Validatable 'permission' => ['required', 'string'], ]; - /** - * All the permissions available on the system. You should use self::permissions() - * to retrieve them, and not directly access this array as it is subject to change. - * - * @see Permission::permissions() - * - * @var array, - * }> - */ - protected static array $permissions = [ - 'websocket' => [ - 'description' => 'Allows the user to connect to the server websocket, giving them access to view console output and realtime server stats.', - 'keys' => [ - 'connect' => 'Allows a user to connect to the websocket instance for a server to stream the console.', - ], - ], - - 'control' => [ - 'description' => 'Permissions that control a user\'s ability to control the power state of a server, or send commands.', - 'keys' => [ - 'console' => 'Allows a user to send commands to the server instance via the console.', - 'start' => 'Allows a user to start the server if it is stopped.', - 'stop' => 'Allows a user to stop a server if it is running.', - 'restart' => 'Allows a user to perform a server restart. This allows them to start the server if it is offline, but not put the server in a completely stopped state.', - ], - ], - - 'user' => [ - 'description' => 'Permissions that allow a user to manage other subusers on a server. They will never be able to edit their own account, or assign permissions they do not have themselves.', - 'keys' => [ - 'create' => 'Allows a user to create new subusers for the server.', - 'read' => 'Allows the user to view subusers and their permissions for the server.', - 'update' => 'Allows a user to modify other subusers.', - 'delete' => 'Allows a user to delete a subuser from the server.', - ], - ], - - 'file' => [ - 'description' => 'Permissions that control a user\'s ability to modify the filesystem for this server.', - 'keys' => [ - 'create' => 'Allows a user to create additional files and folders via the Panel or direct upload.', - 'read' => 'Allows a user to view the contents of a directory, but not view the contents of or download files.', - 'read-content' => 'Allows a user to view the contents of a given file. This will also allow the user to download files.', - 'update' => 'Allows a user to update the contents of an existing file or directory.', - 'delete' => 'Allows a user to delete files or directories.', - 'archive' => 'Allows a user to archive the contents of a directory as well as decompress existing archives on the system.', - 'sftp' => 'Allows a user to connect to SFTP and manage server files using the other assigned file permissions.', - ], - ], - - 'backup' => [ - 'description' => 'Permissions that control a user\'s ability to generate and manage server backups.', - 'keys' => [ - 'create' => 'Allows a user to create new backups for this server.', - 'read' => 'Allows a user to view all backups that exist for this server.', - 'delete' => 'Allows a user to remove backups from the system.', - 'download' => 'Allows a user to download a backup for the server. Danger: this allows a user to access all files for the server in the backup.', - 'restore' => 'Allows a user to restore a backup for the server. Danger: this allows the user to delete all the server files in the process.', - ], - ], - - // Controls permissions for editing or viewing a server's allocations. - 'allocation' => [ - 'description' => 'Permissions that control a user\'s ability to modify the port allocations for this server.', - 'keys' => [ - 'read' => 'Allows a user to view all allocations currently assigned to this server. Users with any level of access to this server can always view the primary allocation.', - 'create' => 'Allows a user to assign additional allocations to the server.', - 'update' => 'Allows a user to change the primary server allocation and attach notes to each allocation.', - 'delete' => 'Allows a user to delete an allocation from the server.', - ], - ], - - // Controls permissions for editing or viewing a server's startup parameters. - 'startup' => [ - 'description' => 'Permissions that control a user\'s ability to view this server\'s startup parameters.', - 'keys' => [ - 'read' => 'Allows a user to view the startup variables for a server.', - 'update' => 'Allows a user to modify the startup variables for the server.', - 'docker-image' => 'Allows a user to modify the Docker image used when running the server.', - ], - ], - - 'database' => [ - 'description' => 'Permissions that control a user\'s access to the database management for this server.', - 'keys' => [ - 'create' => 'Allows a user to create a new database for this server.', - 'read' => 'Allows a user to view the database associated with this server.', - 'update' => 'Allows a user to rotate the password on a database instance. If the user does not have the view_password permission they will not see the updated password.', - 'delete' => 'Allows a user to remove a database instance from this server.', - 'view_password' => 'Allows a user to view the password associated with a database instance for this server.', - ], - ], - - 'schedule' => [ - 'description' => 'Permissions that control a user\'s access to the schedule management for this server.', - 'keys' => [ - 'create' => 'Allows a user to create new schedules for this server.', // task.create-schedule - 'read' => 'Allows a user to view schedules and the tasks associated with them for this server.', // task.view-schedule, task.list-schedules - 'update' => 'Allows a user to update schedules and schedule tasks for this server.', // task.edit-schedule, task.queue-schedule, task.toggle-schedule - 'delete' => 'Allows a user to delete schedules for this server.', // task.delete-schedule - ], - ], - - 'settings' => [ - 'description' => 'Permissions that control a user\'s access to the settings for this server.', - 'keys' => [ - 'rename' => 'Allows a user to rename this server and change the description of it.', - 'reinstall' => 'Allows a user to trigger a reinstall of this server.', - ], - ], - - 'activity' => [ - 'description' => 'Permissions that control a user\'s access to the server activity logs.', - 'keys' => [ - 'read' => 'Allows a user to view the activity logs for the server.', - ], - ], - ]; - protected function casts(): array { return [ @@ -242,11 +121,92 @@ class Permission extends Model implements Validatable ]; } + /** + * All the permissions available on the system. + * + * @return array + */ + public static function permissionData(): array + { + return [ + [ + 'name' => 'control', + 'icon' => 'tabler-terminal-2', + 'permissions' => ['console', 'start', 'stop', 'restart'], + ], + [ + 'name' => 'user', + 'icon' => 'tabler-users', + 'permissions' => ['read', 'create', 'update', 'delete'], + ], + [ + 'name' => 'file', + 'icon' => 'tabler-files', + 'permissions' => ['read', 'read-content', 'create', 'update', 'delete', 'archive', 'sftp'], + ], + [ + 'name' => 'backup', + 'icon' => 'tabler-file-zip', + 'permissions' => ['read', 'create', 'delete', 'download', 'restore'], + ], + [ + 'name' => 'allocation', + 'icon' => 'tabler-network', + 'permissions' => ['read', 'create', 'update', 'delete'], + ], + [ + 'name' => 'startup', + 'icon' => 'tabler-player-play', + 'permissions' => ['read', 'update', 'docker-image'], + ], + [ + 'name' => 'database', + 'icon' => 'tabler-database', + 'permissions' => ['read', 'create', 'update', 'delete', 'view-password'], + ], + [ + 'name' => 'schedule', + 'icon' => 'tabler-clock', + 'permissions' => ['read', 'create', 'update', 'delete'], + ], + [ + 'name' => 'settings', + 'icon' => 'tabler-settings', + 'permissions' => ['rename', 'reinstall'], + ], + [ + 'name' => 'activity', + 'icon' => 'tabler-stack', + 'permissions' => ['read'], + ], + ]; + } + /** * Returns all the permissions available on the system for a user to have when controlling a server. */ public static function permissions(): Collection { - return Collection::make(self::$permissions); + $permissions = [ + 'websocket' => [ + 'description' => 'Allows the user to connect to the server websocket, giving them access to view console output and realtime server stats.', + 'keys' => [ + 'connect' => 'Allows a user to connect to the websocket instance for a server to stream the console.', + ], + ], + ]; + + foreach (static::permissionData() as $data) { + $permissions[$data['name']] = [ + 'description' => trans('server/users.permissions.' . $data['name'] . '_desc'), + 'keys' => collect($data['permissions'])->mapWithKeys(fn ($key) => [$key => trans('server/users.permissions.' . $data['name'] . '_' . str($key)->replace('-', '_'))])->toArray(), + ]; + } + + return collect($permissions); } } diff --git a/lang/en/server/users.php b/lang/en/server/users.php index 77d90b370..cb570da58 100644 --- a/lang/en/server/users.php +++ b/lang/en/server/users.php @@ -15,8 +15,8 @@ return [ 'startup_read' => 'Allows a user to view the startup variables for a server.', 'startup_update' => 'Allows a user to modify the startup variables for the server.', 'startup_docker_image' => 'Allows a user to modify the Docker image used when running the server.', - 'setting_reinstall' => 'Allows a user to trigger a reinstall of this server.', - 'setting_rename' => 'Allows a user to rename this server and change the description of it.', + 'settings_reinstall' => 'Allows a user to trigger a reinstall of this server.', + 'settings_rename' => 'Allows a user to rename this server and change the description of it.', 'activity_read' => 'Allows a user to view the activity logs for the server.', 'websocket_*' => 'Allows a user access to the websocket for this server.', 'control_console' => 'Allows a user to send data to the server console.',