Only allow server transfers to accessible nodes (#1951)

This commit is contained in:
Boy132 2025-12-02 08:26:19 +01:00 committed by GitHub
parent c312ef493f
commit 0fe8917668
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 4 additions and 4 deletions

View File

@ -12,7 +12,6 @@ use App\Filament\Components\StateCasts\ServerConditionStateCast;
use App\Filament\Server\Pages\Console; use App\Filament\Server\Pages\Console;
use App\Models\Allocation; use App\Models\Allocation;
use App\Models\Egg; use App\Models\Egg;
use App\Models\Node;
use App\Models\Server; use App\Models\Server;
use App\Models\User; use App\Models\User;
use App\Repositories\Daemon\DaemonServerRepository; use App\Repositories\Daemon\DaemonServerRepository;
@ -1008,7 +1007,7 @@ class EditServer extends EditRecord
Actions::make([ Actions::make([
Action::make('transfer') Action::make('transfer')
->label(trans('admin/server.transfer')) ->label(trans('admin/server.transfer'))
->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState()) ->disabled(fn (Server $server) => user()?->accessibleNodes()->count() <= 1 || $server->isInConflictState())
->modalHeading(trans('admin/server.transfer')) ->modalHeading(trans('admin/server.transfer'))
->schema($this->transferServer()) ->schema($this->transferServer())
->action(function (TransferServerService $transfer, Server $server, $data) { ->action(function (TransferServerService $transfer, Server $server, $data) {
@ -1080,10 +1079,10 @@ class EditServer extends EditRecord
->label(trans('admin/server.node')) ->label(trans('admin/server.node'))
->prefixIcon('tabler-server-2') ->prefixIcon('tabler-server-2')
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->default(fn (Server $server) => Node::whereNot('id', $server->node->id)->first()?->id) ->default(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->first()?->id)
->required() ->required()
->live() ->live()
->options(fn (Server $server) => Node::whereNot('id', $server->node->id)->pluck('name', 'id')->all()), ->options(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->pluck('name', 'id')->all()),
Select::make('allocation_id') Select::make('allocation_id')
->label(trans('admin/server.primary_allocation')) ->label(trans('admin/server.primary_allocation'))
->disabled(fn (Get $get, Server $server) => !$get('node_id') || !$server->allocation_id) ->disabled(fn (Get $get, Server $server) => !$get('node_id') || !$server->allocation_id)

View File

@ -291,6 +291,7 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac
->distinct('servers.id'); ->distinct('servers.id');
} }
/** @return Builder<Node> */
public function accessibleNodes(): Builder public function accessibleNodes(): Builder
{ {
// Root admins can access all nodes // Root admins can access all nodes