diff --git a/app/Filament/Server/Resources/Activities/ActivityResource.php b/app/Filament/Server/Resources/Activities/ActivityResource.php index 30dd56bfd..3c5b0eaf7 100644 --- a/app/Filament/Server/Resources/Activities/ActivityResource.php +++ b/app/Filament/Server/Resources/Activities/ActivityResource.php @@ -6,7 +6,6 @@ use App\Filament\Admin\Resources\Users\Pages\EditUser; use App\Filament\Components\Tables\Columns\DateTimeColumn; use App\Filament\Server\Resources\Activities\Pages\ListActivities; use App\Models\ActivityLog; -use App\Models\Permission; use App\Models\Role; use App\Models\Server; use App\Models\User; @@ -164,11 +163,6 @@ class ActivityResource extends Resource }); } - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_ACTIVITY_READ, Filament::getTenant()); - } - /** @return array */ public static function getDefaultPages(): array { diff --git a/app/Filament/Server/Resources/Allocations/AllocationResource.php b/app/Filament/Server/Resources/Allocations/AllocationResource.php index 92e70c554..df57050d5 100644 --- a/app/Filament/Server/Resources/Allocations/AllocationResource.php +++ b/app/Filament/Server/Resources/Allocations/AllocationResource.php @@ -23,7 +23,6 @@ use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextInputColumn; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Model; class AllocationResource extends Resource { @@ -116,26 +115,6 @@ class AllocationResource extends Resource ]); } - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_ALLOCATION_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_ALLOCATION_CREATE, Filament::getTenant()); - } - - public static function canEdit(Model $record): bool - { - return user()?->can(Permission::ACTION_ALLOCATION_UPDATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_ALLOCATION_DELETE, Filament::getTenant()); - } - /** @return array */ public static function getDefaultPages(): array { diff --git a/app/Filament/Server/Resources/Backups/BackupResource.php b/app/Filament/Server/Resources/Backups/BackupResource.php index 7506675be..77ae72455 100644 --- a/app/Filament/Server/Resources/Backups/BackupResource.php +++ b/app/Filament/Server/Resources/Backups/BackupResource.php @@ -40,7 +40,6 @@ use Filament\Support\Enums\IconSize; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\HttpException; @@ -296,21 +295,6 @@ class BackupResource extends Resource ]); } - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_BACKUP_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_BACKUP_CREATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_BACKUP_DELETE, Filament::getTenant()); - } - /** @return array */ public static function getDefaultPages(): array { diff --git a/app/Filament/Server/Resources/Databases/DatabaseResource.php b/app/Filament/Server/Resources/Databases/DatabaseResource.php index b87efd9a5..ff0e61a86 100644 --- a/app/Filament/Server/Resources/Databases/DatabaseResource.php +++ b/app/Filament/Server/Resources/Databases/DatabaseResource.php @@ -31,7 +31,6 @@ use Filament\Schemas\Schema; use Filament\Support\Enums\IconSize; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class DatabaseResource extends Resource @@ -208,31 +207,6 @@ class DatabaseResource extends Resource ]); } - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_DATABASE_READ, Filament::getTenant()); - } - - public static function canView(Model $record): bool - { - return user()?->can(Permission::ACTION_DATABASE_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_DATABASE_CREATE, Filament::getTenant()); - } - - public static function canEdit(Model $record): bool - { - return user()?->can(Permission::ACTION_DATABASE_UPDATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_DATABASE_DELETE, Filament::getTenant()); - } - /** @return array */ public static function getDefaultPages(): array { diff --git a/app/Filament/Server/Resources/Files/FileResource.php b/app/Filament/Server/Resources/Files/FileResource.php index 281758113..2870ba565 100644 --- a/app/Filament/Server/Resources/Files/FileResource.php +++ b/app/Filament/Server/Resources/Files/FileResource.php @@ -7,14 +7,11 @@ use App\Filament\Server\Resources\Files\Pages\EditFiles; use App\Filament\Server\Resources\Files\Pages\ListFiles; use App\Filament\Server\Resources\Files\Pages\SearchFiles; use App\Models\File; -use App\Models\Permission; use App\Traits\Filament\BlockAccessInConflict; use App\Traits\Filament\CanCustomizePages; use App\Traits\Filament\CanCustomizeRelations; -use Filament\Facades\Filament; use Filament\Resources\Pages\PageRegistration; use Filament\Resources\Resource; -use Illuminate\Database\Eloquent\Model; class FileResource extends Resource { @@ -30,26 +27,6 @@ class FileResource extends Resource protected static bool $isScopedToTenant = false; - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_FILE_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_FILE_CREATE, Filament::getTenant()); - } - - public static function canEdit(Model $record): bool - { - return user()?->can(Permission::ACTION_FILE_UPDATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_FILE_DELETE, Filament::getTenant()); - } - /** @return array */ public static function getDefaultPages(): array { diff --git a/app/Filament/Server/Resources/Schedules/ScheduleResource.php b/app/Filament/Server/Resources/Schedules/ScheduleResource.php index ccb949705..a3db782ac 100644 --- a/app/Filament/Server/Resources/Schedules/ScheduleResource.php +++ b/app/Filament/Server/Resources/Schedules/ScheduleResource.php @@ -13,7 +13,6 @@ use App\Filament\Server\Resources\Schedules\Pages\ListSchedules; use App\Filament\Server\Resources\Schedules\Pages\ViewSchedule; use App\Filament\Server\Resources\Schedules\RelationManagers\TasksRelationManager; use App\Helpers\Utilities; -use App\Models\Permission; use App\Models\Schedule; use App\Traits\Filament\BlockAccessInConflict; use App\Traits\Filament\CanCustomizePages; @@ -26,7 +25,6 @@ use Filament\Actions\CreateAction; use Filament\Actions\DeleteAction; use Filament\Actions\EditAction; use Filament\Actions\ViewAction; -use Filament\Facades\Filament; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; @@ -46,7 +44,6 @@ use Filament\Support\Exceptions\Halt; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Model; use Illuminate\Support\HtmlString; use Throwable; @@ -64,26 +61,6 @@ class ScheduleResource extends Resource protected static string|\BackedEnum|null $navigationIcon = 'tabler-clock'; - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_SCHEDULE_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_SCHEDULE_CREATE, Filament::getTenant()); - } - - public static function canEdit(Model $record): bool - { - return user()?->can(Permission::ACTION_SCHEDULE_UPDATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_SCHEDULE_DELETE, Filament::getTenant()); - } - /** * @throws Exception */ @@ -358,7 +335,8 @@ class ScheduleResource extends Resource ->state(fn (Schedule $schedule) => $schedule->status === ScheduleStatus::Active ? $schedule->next_run_at : null), ]) ->recordActions([ - ViewAction::make(), + ViewAction::make() + ->hidden(fn ($record) => static::canEdit($record)), EditAction::make(), DeleteAction::make() ->after(function (Schedule $schedule) { diff --git a/app/Filament/Server/Resources/Users/UserResource.php b/app/Filament/Server/Resources/Users/UserResource.php index 4b5d98ff6..77a388cb8 100644 --- a/app/Filament/Server/Resources/Users/UserResource.php +++ b/app/Filament/Server/Resources/Users/UserResource.php @@ -37,7 +37,6 @@ use Filament\Support\Enums\IconSize; use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Model; class UserResource extends Resource { @@ -63,26 +62,6 @@ class UserResource extends Resource return $server->subusers->count(); } - public static function canViewAny(): bool - { - return user()?->can(Permission::ACTION_USER_READ, Filament::getTenant()); - } - - public static function canCreate(): bool - { - return user()?->can(Permission::ACTION_USER_CREATE, Filament::getTenant()); - } - - public static function canEdit(Model $record): bool - { - return user()?->can(Permission::ACTION_USER_UPDATE, Filament::getTenant()); - } - - public static function canDelete(Model $record): bool - { - return user()?->can(Permission::ACTION_USER_DELETE, Filament::getTenant()); - } - public static function defaultTable(Table $table): Table { /** @var Server $server */ diff --git a/app/Policies/ApiKeyPolicy.php b/app/Policies/Admin/ApiKeyPolicy.php similarity index 77% rename from app/Policies/ApiKeyPolicy.php rename to app/Policies/Admin/ApiKeyPolicy.php index 37aac9093..5c468162f 100644 --- a/app/Policies/ApiKeyPolicy.php +++ b/app/Policies/Admin/ApiKeyPolicy.php @@ -1,6 +1,6 @@ can(Permission::ACTION_ACTIVITY_READ, Filament::getTenant()); + } + + public static function view(): bool + { + return user()?->can(Permission::ACTION_ACTIVITY_READ, Filament::getTenant()); + } +} diff --git a/app/Policies/Server/AllocationPolicy.php b/app/Policies/Server/AllocationPolicy.php new file mode 100644 index 000000000..5ed31568c --- /dev/null +++ b/app/Policies/Server/AllocationPolicy.php @@ -0,0 +1,32 @@ +can(Permission::ACTION_ALLOCATION_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_ALLOCATION_CREATE, Filament::getTenant()); + } + + public static function edit(Model $record): bool + { + return user()?->can(Permission::ACTION_ALLOCATION_UPDATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_ALLOCATION_DELETE, Filament::getTenant()); + } +} diff --git a/app/Policies/Server/BackupPolicy.php b/app/Policies/Server/BackupPolicy.php new file mode 100644 index 000000000..3dd5bf081 --- /dev/null +++ b/app/Policies/Server/BackupPolicy.php @@ -0,0 +1,27 @@ +can(Permission::ACTION_BACKUP_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_BACKUP_CREATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_BACKUP_DELETE, Filament::getTenant()); + } +} diff --git a/app/Policies/Server/DatabasePolicy.php b/app/Policies/Server/DatabasePolicy.php new file mode 100644 index 000000000..cafd43113 --- /dev/null +++ b/app/Policies/Server/DatabasePolicy.php @@ -0,0 +1,37 @@ +can(Permission::ACTION_DATABASE_READ, Filament::getTenant()); + } + + public static function view(Model $record): bool + { + return user()?->can(Permission::ACTION_DATABASE_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_DATABASE_CREATE, Filament::getTenant()); + } + + public static function edit(Model $record): bool + { + return user()?->can(Permission::ACTION_DATABASE_UPDATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_DATABASE_DELETE, Filament::getTenant()); + } +} diff --git a/app/Policies/Server/DefaultPolicies.php b/app/Policies/Server/DefaultPolicies.php new file mode 100644 index 000000000..62b6c12f7 --- /dev/null +++ b/app/Policies/Server/DefaultPolicies.php @@ -0,0 +1,16 @@ +can(Permission::ACTION_FILE_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_FILE_CREATE, Filament::getTenant()); + } + + public static function edit(Model $record): bool + { + return user()?->can(Permission::ACTION_FILE_UPDATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_FILE_DELETE, Filament::getTenant()); + } +} diff --git a/app/Policies/Server/SchedulePolicy.php b/app/Policies/Server/SchedulePolicy.php new file mode 100644 index 000000000..a18807b71 --- /dev/null +++ b/app/Policies/Server/SchedulePolicy.php @@ -0,0 +1,32 @@ +can(Permission::ACTION_SCHEDULE_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_SCHEDULE_CREATE, Filament::getTenant()); + } + + public static function edit(Model $record): bool + { + return user()?->can(Permission::ACTION_SCHEDULE_UPDATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_SCHEDULE_DELETE, Filament::getTenant()); + } +} diff --git a/app/Policies/ServerPolicy.php b/app/Policies/Server/ServerPolicies.php similarity index 79% rename from app/Policies/ServerPolicy.php rename to app/Policies/Server/ServerPolicies.php index d032405d7..374aac84c 100644 --- a/app/Policies/ServerPolicy.php +++ b/app/Policies/Server/ServerPolicies.php @@ -1,6 +1,6 @@ can(Permission::ACTION_USER_READ, Filament::getTenant()); + } + + public static function create(): bool + { + return user()?->can(Permission::ACTION_USER_CREATE, Filament::getTenant()); + } + + public static function edit(Model $record): bool + { + return user()?->can(Permission::ACTION_USER_UPDATE, Filament::getTenant()); + } + + public static function delete(Model $record): bool + { + return user()?->can(Permission::ACTION_USER_DELETE, Filament::getTenant()); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 68b75514b..56064a87d 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -26,6 +26,7 @@ use App\Services\Helpers\SoftwareVersionService; use Dedoc\Scramble\Scramble; use Dedoc\Scramble\Support\Generator\OpenApi; use Dedoc\Scramble\Support\Generator\SecurityScheme; +use Filament\Facades\Filament; use Filament\Forms\Components\Field; use Filament\Forms\Components\TextInput\Actions\CopyAction; use Filament\Support\Colors\Color; @@ -169,8 +170,21 @@ class AppServiceProvider extends ServiceProvider ]); } - Gate::before(function (User $user, $ability) { - return $user->isRootAdmin() ? true : null; + Gate::before(fn (User $user, $ability) => $user->isRootAdmin() ? true : null); + + Gate::guessPolicyNamesUsing(function (string $modelClass) { + $panelId = mb_ucfirst(Filament::getCurrentOrDefaultPanel()->getId()); + + if ($panelId === 'App') { + return; + } + + $modelName = class_basename($modelClass); + $class = "App\\Policies\\{$panelId}\\{$modelName}Policy"; + + if (class_exists($class)) { + return $class; + } }); AboutCommand::add('Pelican', [