From 15ae0afe9823bc759b24e6d5c232d9f9215c88b5 Mon Sep 17 00:00:00 2001 From: MiBo Date: Sun, 8 Feb 2026 18:27:34 +0100 Subject: [PATCH 1/6] feat(CSP): API to configure and use CSP Nonce --- packages/panels/src/Facades/Filament.php | 2 ++ packages/panels/src/FilamentManager.php | 15 +++++++++++++++ packages/panels/src/helpers.php | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/packages/panels/src/Facades/Filament.php b/packages/panels/src/Facades/Filament.php index c5b8171c737..89c92bd591c 100644 --- a/packages/panels/src/Facades/Filament.php +++ b/packages/panels/src/Facades/Filament.php @@ -165,6 +165,8 @@ * @method static void setCurrentPanel(Panel | string | null $panel = null) * @method static void setServingStatus(bool $condition = true) * @method static void setTenant(Model | null $tenant = null, bool $isQuiet = false) + * @method static void setCspNonce(string|Closure|null $nonce) + * @method static string|null getCspNonce() * * @see FilamentManager */ diff --git a/packages/panels/src/FilamentManager.php b/packages/panels/src/FilamentManager.php index cdc9b4e4110..0f49e82fe34 100644 --- a/packages/panels/src/FilamentManager.php +++ b/packages/panels/src/FilamentManager.php @@ -51,6 +51,8 @@ class FilamentManager protected ?Model $tenant = null; + protected string|Closure|null $cspNonce = null; + public function auth(): Guard { return $this->getCurrentOrDefaultPanel()->auth(); @@ -1104,4 +1106,17 @@ public function getErrorNotifications(): array { return $this->getCurrentOrDefaultPanel()->getErrorNotifications(); } + + /** + * @param string|(\Closure(): string)|null $nonce + */ + public function useCspNonce(string|Closure|null $nonce): void + { + $this->cspNonce = $nonce; + } + + public function getCspNonce(): ?string + { + return value($this->cspNonce); + } } diff --git a/packages/panels/src/helpers.php b/packages/panels/src/helpers.php index ed1c1582bd1..23bac386ac9 100644 --- a/packages/panels/src/helpers.php +++ b/packages/panels/src/helpers.php @@ -95,3 +95,10 @@ function get_authorization_response(UnitEnum | string $action, Model | string $m return $response; } } + +if (!function_exists('Filament\csp_nonce')) { + function csp_nonce(): ?string + { + return Filament::getCspNonce(); + } +} From ded54f1c2f94e6450a6482ab741063f5298bdff3 Mon Sep 17 00:00:00 2001 From: MiBo Date: Sun, 8 Feb 2026 18:40:29 +0100 Subject: [PATCH 2/6] fix(CSP): CSP Nonce to each current HTML element --- .../views/database-notifications.blade.php | 2 +- .../resources/views/notifications.blade.php | 2 +- .../views/components/layout/base.blade.php | 14 +++++++------- .../views/components/page/index.blade.php | 6 +++--- .../unsaved-action-changes-alert.blade.php | 2 +- .../resources/views/livewire/sidebar.blade.php | 2 +- packages/support/resources/views/assets.blade.php | 4 ++-- packages/support/src/Assets/Js.php | 5 +++++ .../views/components/layouts/app.blade.php | 2 +- 9 files changed, 22 insertions(+), 17 deletions(-) diff --git a/packages/notifications/resources/views/database-notifications.blade.php b/packages/notifications/resources/views/database-notifications.blade.php index 90642b38d68..3c7a4e65b74 100644 --- a/packages/notifications/resources/views/database-notifications.blade.php +++ b/packages/notifications/resources/views/database-notifications.blade.php @@ -85,7 +85,7 @@ class="fi-no-database" @if ($broadcastChannel = $this->getBroadcastChannel()) @script - @elseif (filament()->hasDarkModeForced()) - @else - @endif diff --git a/packages/panels/resources/views/components/page/index.blade.php b/packages/panels/resources/views/components/page/index.blade.php index bd4119056f7..3714a2fab2b 100644 --- a/packages/panels/resources/views/components/page/index.blade.php +++ b/packages/panels/resources/views/components/page/index.blade.php @@ -150,7 +150,7 @@ class="fi-page-main-sub-navigation-mobile-menu-render-hook-ctn" @if (method_exists($this, 'hasUnsavedDataChangesAlert') && $this->hasUnsavedDataChangesAlert()) @if (\Filament\Support\Facades\FilamentView::hasSpaMode()) @script - @endscript @@ -169,7 +169,7 @@ class="fi-page-main-sub-navigation-mobile-menu-render-hook-ctn" @if (! app()->hasDebugModeEnabled()) @script - @endscript diff --git a/packages/panels/resources/views/components/unsaved-action-changes-alert.blade.php b/packages/panels/resources/views/components/unsaved-action-changes-alert.blade.php index fde861e1b12..82b34a45405 100644 --- a/packages/panels/resources/views/components/unsaved-action-changes-alert.blade.php +++ b/packages/panels/resources/views/components/unsaved-action-changes-alert.blade.php @@ -1,6 +1,6 @@ @if (filament()->hasUnsavedChangesAlerts()) @script - @endif @@ -10,7 +10,7 @@ @endif @endforeach -
@foreach ($this->getMountedActions() as $action) @if ((! $loop->last) || $this->mountedActionShouldOpenModal()) diff --git a/packages/forms/resources/views/components/textarea.blade.php b/packages/forms/resources/views/components/textarea.blade.php index 39f3d7f6fac..174f4ea853d 100644 --- a/packages/forms/resources/views/components/textarea.blade.php +++ b/packages/forms/resources/views/components/textarea.blade.php @@ -28,7 +28,10 @@ class="fi-fo-textarea-wrp" ]) " > -
+ +