Compare commits

...
Sign in to create a new pull request.

2 commits
dev ... main

Author SHA1 Message Date
Snider
4f09bfedd2 fix(csp): add nonce to all inline style and script tags
Some checks are pending
Code Style / Laravel Pint (push) Waiting to run
Code Style / PHP CodeSniffer (push) Waiting to run
Static Analysis / PHPStan (push) Waiting to run
Static Analysis / Psalm (push) Waiting to run
Static Analysis / Security Audit (push) Waiting to run
Static Analysis / PHP Syntax Check (push) Waiting to run
Tests / PHP 8.2 - Laravel 11.* (push) Waiting to run
Tests / PHP 8.3 - Laravel 11.* (push) Waiting to run
Tests / PHP 8.4 - Laravel 11.* (push) Waiting to run
Tests / PHP 8.3 - Laravel 12.* (push) Waiting to run
Tests / PHP 8.4 - Laravel 12.* (push) Waiting to run
Register CSP nonce with Vite::useCspNonce() so Livewire and Flux
inherit it automatically. Add @cspnonce directive to all inline
<style> and <script> blocks in layout templates to satisfy strict
style-src/script-src CSP in production.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-13 19:45:09 +00:00
Snider
feb47c8ea5 feat(menu): add agents group to AdminMenuRegistry
Top-level standalone group positioned right after dashboard,
giving the agentic system its own prominent section in the sidebar.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-08 20:10:22 +00:00
5 changed files with 19 additions and 7 deletions

View file

@ -61,6 +61,9 @@ class AdminMenuRegistry
'dashboard' => [
'standalone' => true,
],
'agents' => [
'standalone' => true,
],
'workspaces' => [
'label' => 'Workspaces',
'icon' => 'layer-group',

View file

@ -18,12 +18,12 @@
<title>{{ $title }}</title>
{{-- Critical CSS: Prevents white flash during page load/navigation --}}
<style>
<style @cspnonce>
html { background-color: #f3f4f6; }
html.dark { background-color: #111827; }
</style>
<script>
<script @cspnonce>
(function () {
var darkMode = localStorage.getItem('dark-mode');
if (darkMode === 'true') {
@ -56,7 +56,7 @@
x-init="$watch('sidebarExpanded', value => localStorage.setItem('sidebar-expanded', value))"
>
<script>
<script @cspnonce>
if (localStorage.getItem('sidebar-expanded') == 'true') {
document.querySelector('body').classList.add('sidebar-expanded');
} else {
@ -91,7 +91,7 @@
{{ $scripts ?? '' }}
<script>
<script @cspnonce>
// Light/Dark mode toggle (guarded for Livewire navigation)
(function() {
if (window.__lightSwitchInitialized) return;

View file

@ -1,5 +1,5 @@
{{-- Self-hosted Inter variable font --}}
<style>
<style @cspnonce>
@font-face {
font-family: 'Inter';
src: url('/fonts/InterVariable.woff2') format('woff2-variations');

View file

@ -16,7 +16,7 @@
<title>{{ $title }}</title>
{{-- Critical CSS: Prevents white flash during page load/navigation --}}
<style>
<style @cspnonce>
html { background-color: #ffffff; }
html.dark { background-color: #111827; }
</style>

View file

@ -11,6 +11,8 @@ declare(strict_types=1);
namespace Core\Headers;
use Illuminate\Support\Facades\Vite;
/**
* Service for generating and managing CSP nonces.
*
@ -84,10 +86,17 @@ class CspNonceService
/**
* Generate a cryptographically secure nonce.
*
* Also registers it with Vite so Livewire and Vite-generated tags
* automatically include the nonce attribute.
*/
protected function generateNonce(): string
{
return base64_encode(random_bytes($this->nonceLength));
$nonce = base64_encode(random_bytes($this->nonceLength));
Vite::useCspNonce($nonce);
return $nonce;
}
/**