From a3e78a36778e98634e6ad37ebdbef494aeb6b1bc Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:18:52 +0200 Subject: [PATCH] fix(authorization): gate mutable Livewire controls by policy Disable unauthorized listbox inputs and hide application deploy actions, with updated disabled styling and coverage. --- resources/css/app.css | 8 +- .../components/database-status-info.blade.php | 4 +- .../views/components/forms/listbox.blade.php | 7 ++ .../livewire/notifications/discord.blade.php | 2 +- .../livewire/notifications/email.blade.php | 10 +-- .../project/application/domains.blade.php | 4 +- .../project/application/heading.blade.php | 4 + .../project/application/swarm.blade.php | 2 +- .../database/clickhouse/general.blade.php | 4 +- .../database/dragonfly/general.blade.php | 4 +- .../project/database/heading.blade.php | 4 + .../project/database/keydb/general.blade.php | 4 +- .../database/mariadb/general.blade.php | 4 +- .../database/mongodb/general.blade.php | 4 +- .../project/database/mysql/general.blade.php | 4 +- .../database/postgresql/general.blade.php | 4 +- .../project/database/redis/general.blade.php | 4 +- .../project/service/domains.blade.php | 4 +- .../project/service/heading.blade.php | 4 + .../project/service/stack-form.blade.php | 2 +- .../shared/scheduled-task/show.blade.php | 10 +-- .../storages/volume-backups/s3.blade.php | 4 +- .../livewire/server/log-drains.blade.php | 6 +- .../views/livewire/server/swarm.blade.php | 4 +- .../livewire/source/github/change.blade.php | 4 +- .../livewire/source/gitlab/change.blade.php | 2 +- resources/views/livewire/team/index.blade.php | 2 +- .../Feature/ListboxTriggerTruncationTest.php | 9 ++ ...bleLivewireComponentsAuthorizationTest.php | 83 +++++++++++++++++++ 29 files changed, 164 insertions(+), 47 deletions(-) diff --git a/resources/css/app.css b/resources/css/app.css index 95e0207ce..636cf2ce8 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1905,7 +1905,13 @@ .dark .listbox-trigger { .listbox-trigger:disabled { cursor: not-allowed; - opacity: 0.5; + background-color: var(--color-neutral-100); + color: var(--color-neutral-400); +} + +.dark .listbox-trigger:disabled { + background-color: color-mix(in oklab, var(--color-white) 3%, transparent); + color: var(--color-fg-faint); } .listbox-trigger:focus-visible { diff --git a/resources/views/components/database-status-info.blade.php b/resources/views/components/database-status-info.blade.php index 5e352c206..b9298e268 100644 --- a/resources/views/components/database-status-info.blade.php +++ b/resources/views/components/database-status-info.blade.php @@ -65,7 +65,7 @@ @endif
- @if ($sslModeOptions) - -
@if (isCloud())
-
@else
-
- placeholder="smtp.mailgun.org" label="Host" /> -
- -
@if ($isCompose && count($composeServices) > 0) - @if (!($application->build_pack === 'dockercompose' && is_null($application->docker_compose_raw))) + @can('deploy', $application)
@@ -149,6 +150,7 @@ class="listbox-panel top-full! left-0! right-0! mt-1! w-full! min-w-0!" role="me @endif
+ @endcan @endif + @can('deploy', $application)
@@ -279,6 +282,7 @@ class="listbox-panel top-full! right-0! left-auto! mt-1! w-60! min-w-0!" role="m @endif
+ @endcan @endif
diff --git a/resources/views/livewire/project/application/swarm.blade.php b/resources/views/livewire/project/application/swarm.blade.php index fc8112afb..6bd593b93 100644 --- a/resources/views/livewire/project/application/swarm.blade.php +++ b/resources/views/livewire/project/application/swarm.blade.php @@ -14,7 +14,7 @@
-
user()->can('update', $database)" canGate="update" :canResource="$database" :options="[ ['value' => false, 'label' => 'Private'], ['value' => true, 'label' => blank($publicPort) ? 'Public through TCP proxy (set public port first)' : 'Public through TCP proxy', 'disabled' => blank($publicPort)], ]" /> @@ -94,7 +94,7 @@ -
user()->can('update', $database)" canGate="update" :canResource="$database" :options="[ ['value' => false, 'label' => 'Private'], ['value' => true, 'label' => blank($publicPort) ? 'Public through TCP proxy (set public port first)' : 'Public through TCP proxy', 'disabled' => blank($publicPort)], ]" /> @@ -95,7 +95,7 @@ - @if ($database->destination->server->isFunctional()) + @can('manage', $database)
@@ -127,6 +128,7 @@ class="listbox-panel top-full! left-0! right-0! mt-1! w-full! min-w-0!" role="me @endif
+ @endcan @endif
@@ -137,6 +139,7 @@ class="listbox-panel top-full! left-0! right-0! mt-1! w-full! min-w-0!" role="me class="resource-heading-navbar application-heading-actions flex w-auto min-w-0 items-center justify-end gap-1 overflow-visible">
@if ($database->destination->server->isFunctional()) + @can('manage', $database)
@if (! $databaseStatus->startsWith('exited'))