diff --git a/app/Extensions/Features/FeatureSchemaInterface.php b/app/Extensions/Features/FeatureSchemaInterface.php index e0a35ded00..c0b57c3c9e 100644 --- a/app/Extensions/Features/FeatureSchemaInterface.php +++ b/app/Extensions/Features/FeatureSchemaInterface.php @@ -2,6 +2,8 @@ namespace App\Extensions\Features; +use App\Models\Server; +use App\Models\User; use Filament\Actions\Action; interface FeatureSchemaInterface @@ -11,5 +13,7 @@ public function getListeners(): array; public function getId(): string; + public function authorize(User $user, Server $server): bool; + public function getAction(): Action; } diff --git a/app/Extensions/Features/Schemas/GSLTokenSchema.php b/app/Extensions/Features/Schemas/GSLTokenSchema.php index 5eadb5e6c3..cf37d39a5d 100644 --- a/app/Extensions/Features/Schemas/GSLTokenSchema.php +++ b/app/Extensions/Features/Schemas/GSLTokenSchema.php @@ -8,6 +8,7 @@ use App\Facades\Activity; use App\Models\Server; use App\Models\ServerVariable; +use App\Models\User; use App\Repositories\Daemon\DaemonServerRepository; use Closure; use Exception; @@ -37,6 +38,11 @@ public function getId(): string return 'gsl_token'; } + public function authorize(User $user, Server $server): bool + { + return $user->can(SubuserPermission::StartupUpdate, $server); + } + /** * @throws Exception */ @@ -55,7 +61,6 @@ public function getAction(): Action ->modalHeading(trans('server/feature.gsl_token.heading')) ->modalDescription(trans('server/feature.gsl_token.description')) ->modalSubmitActionLabel(trans('server/feature.gsl_token.submit')) - ->disabledSchema(fn () => !user()?->can(SubuserPermission::StartupUpdate, $server)) ->schema([ TextEntry::make('info') ->label(new HtmlString(Blade::render(trans('server/feature.gsl_token.info')))), diff --git a/app/Extensions/Features/Schemas/JavaVersionSchema.php b/app/Extensions/Features/Schemas/JavaVersionSchema.php index 12e6de1019..e1f7f9c73c 100644 --- a/app/Extensions/Features/Schemas/JavaVersionSchema.php +++ b/app/Extensions/Features/Schemas/JavaVersionSchema.php @@ -6,6 +6,7 @@ use App\Extensions\Features\FeatureSchemaInterface; use App\Facades\Activity; use App\Models\Server; +use App\Models\User; use App\Repositories\Daemon\DaemonServerRepository; use Exception; use Filament\Actions\Action; @@ -34,6 +35,11 @@ public function getId(): string return 'java_version'; } + public function authorize(User $user, Server $server): bool + { + return $user->can(SubuserPermission::StartupDockerImage, $server); + } + public function getAction(): Action { /** @var Server $server */ @@ -44,7 +50,6 @@ public function getAction(): Action ->modalHeading(trans('server/feature.java_version.heading')) ->modalDescription(trans('server/feature.java_version.description')) ->modalSubmitActionLabel(trans('server/feature.java_version.submit')) - ->disabledSchema(fn () => !user()?->can(SubuserPermission::StartupDockerImage, $server)) ->schema([ TextEntry::make('java') ->label(trans('server/feature.java_version.select_version')), diff --git a/app/Extensions/Features/Schemas/MinecraftEulaSchema.php b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php index aa1db090ab..680881f9c6 100644 --- a/app/Extensions/Features/Schemas/MinecraftEulaSchema.php +++ b/app/Extensions/Features/Schemas/MinecraftEulaSchema.php @@ -2,8 +2,10 @@ namespace App\Extensions\Features\Schemas; +use App\Enums\SubuserPermission; use App\Extensions\Features\FeatureSchemaInterface; use App\Models\Server; +use App\Models\User; use App\Repositories\Daemon\DaemonFileRepository; use App\Repositories\Daemon\DaemonServerRepository; use Exception; @@ -28,6 +30,11 @@ public function getId(): string return 'eula'; } + public function authorize(User $user, Server $server): bool + { + return $user->can(SubuserPermission::FileUpdate, $server); + } + public function getAction(): Action { return Action::make($this->getId()) diff --git a/app/Extensions/Features/Schemas/PIDLimitSchema.php b/app/Extensions/Features/Schemas/PIDLimitSchema.php index 348e3419ad..9600c119a5 100644 --- a/app/Extensions/Features/Schemas/PIDLimitSchema.php +++ b/app/Extensions/Features/Schemas/PIDLimitSchema.php @@ -4,6 +4,8 @@ use App\Enums\TablerIcon; use App\Extensions\Features\FeatureSchemaInterface; +use App\Models\Server; +use App\Models\User; use Filament\Actions\Action; use Illuminate\Support\HtmlString; @@ -27,6 +29,11 @@ public function getId(): string return 'pid_limit'; } + public function authorize(User $user, Server $server): bool + { + return true; + } + public function getAction(): Action { return Action::make($this->getId()) diff --git a/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php b/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php index a967f7a979..495f838575 100644 --- a/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php +++ b/app/Extensions/Features/Schemas/SteamDiskSpaceSchema.php @@ -3,6 +3,8 @@ namespace App\Extensions\Features\Schemas; use App\Extensions\Features\FeatureSchemaInterface; +use App\Models\Server; +use App\Models\User; use Filament\Actions\Action; use Illuminate\Support\HtmlString; @@ -22,6 +24,11 @@ public function getId(): string return 'steam_disk_space'; } + public function authorize(User $user, Server $server): bool + { + return true; + } + public function getAction(): Action { return Action::make($this->getId()) diff --git a/app/Filament/Server/Pages/Console.php b/app/Filament/Server/Pages/Console.php index e5a35af2bb..137d2e2678 100644 --- a/app/Filament/Server/Pages/Console.php +++ b/app/Filament/Server/Pages/Console.php @@ -64,9 +64,15 @@ public function mount(): void public function boot(FeatureService $featureService): void { $this->featureService = $featureService; + /** @var Server $server */ $server = Filament::getTenant(); + foreach ($featureService->getActiveSchemas($server->egg->features) as $feature) { + if (!$feature->authorize(user(), $server)) { + continue; + } + $this->cacheAction($feature->getAction()); } } @@ -82,6 +88,13 @@ public function mountFeature(string $data): void return; } + /** @var Server $server */ + $server = Filament::getTenant(); + + if (!$feature->authorize(user(), $server)) { + return; + } + if ($this->getMountedAction()) { $this->replaceMountedAction($feature->getId()); } else {