From 827bd140b0e6d59cc4c23776b45a32e7f66fccbe Mon Sep 17 00:00:00 2001 From: Vishal Sadriya Date: Thu, 16 Apr 2026 10:41:28 +0530 Subject: [PATCH 01/16] feat(css): add CSP-compatible utility classes for state toggles --- .../stylesheet_generator.rb | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/app/services/solid_queue_monitor/stylesheet_generator.rb b/app/services/solid_queue_monitor/stylesheet_generator.rb index 862165c..af296f9 100644 --- a/app/services/solid_queue_monitor/stylesheet_generator.rb +++ b/app/services/solid_queue_monitor/stylesheet_generator.rb @@ -2017,6 +2017,51 @@ def generate grid-template-columns: 1fr; } } + + /* ===== CSP Phase 1 utility classes (replace runtime style mutations) ===== */ + + .is-hidden { + display: none !important; + } + + .countdown-paused { + opacity: 0.4; + } + + .is-expanded .collapse-icon { + transform: rotate(90deg); + } + + .collapse-icon { + transition: transform 150ms ease; + } + + .collapsible-content { + display: none; + } + + .is-expanded .collapsible-content { + display: block; + } + + .chart-tooltip { + display: none; + position: fixed; + pointer-events: none; + } + + .chart-tooltip.tooltip-visible { + display: block; + } + + #flash-message { + opacity: 1; + transition: opacity 500ms ease; + } + + #flash-message.is-fading { + opacity: 0; + } CSS end end From bd2666345faeef93c22b37f6ffad2f5873597bb9 Mon Sep 17 00:00:00 2001 From: Vishal Sadriya Date: Thu, 16 Apr 2026 11:36:03 +0530 Subject: [PATCH 02/16] feat(csp): thread nonce through HtmlGenerator and base controller --- .../solid_queue_monitor/base_controller.rb | 3 +- .../solid_queue_monitor/html_generator.rb | 19 +++++-- .../html_generator_spec.rb | 56 +++++++++++++++++++ 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 spec/services/solid_queue_monitor/html_generator_spec.rb diff --git a/app/controllers/solid_queue_monitor/base_controller.rb b/app/controllers/solid_queue_monitor/base_controller.rb index 7178aa7..e122422 100644 --- a/app/controllers/solid_queue_monitor/base_controller.rb +++ b/app/controllers/solid_queue_monitor/base_controller.rb @@ -28,7 +28,8 @@ def render_page(title, content, search_query: nil) content: content, message: message, message_type: message_type, - search_query: search_query + search_query: search_query, + nonce: content_security_policy_nonce ).generate render html: html.html_safe diff --git a/app/services/solid_queue_monitor/html_generator.rb b/app/services/solid_queue_monitor/html_generator.rb index 3a37d68..d6155c1 100644 --- a/app/services/solid_queue_monitor/html_generator.rb +++ b/app/services/solid_queue_monitor/html_generator.rb @@ -5,12 +5,13 @@ class HtmlGenerator include Rails.application.routes.url_helpers include SolidQueueMonitor::Engine.routes.url_helpers - def initialize(title:, content:, message: nil, message_type: nil, search_query: nil) + def initialize(title:, content:, message: nil, message_type: nil, search_query: nil, nonce: nil) @title = title @content = content @message = message @message_type = message_type @search_query = search_query + @nonce = nonce end def generate @@ -34,7 +35,7 @@ def generate_head <<-HTML - HTML @@ -62,7 +63,7 @@ def render_message class_name = @message_type == 'success' ? 'message-success' : 'message-error' <<-HTML
#{@message}
- " + "#{script_tag_open}#{auto_refresh_javascript}" end def auto_refresh_javascript @@ -270,7 +279,7 @@ def auto_refresh_init def generate_chart_script <<-HTML - diff --git a/spec/services/solid_queue_monitor/html_generator_spec.rb b/spec/services/solid_queue_monitor/html_generator_spec.rb new file mode 100644 index 0000000..ef957ee --- /dev/null +++ b/spec/services/solid_queue_monitor/html_generator_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe SolidQueueMonitor::HtmlGenerator do + describe '#generate' do + context 'when a nonce is supplied' do + subject(:html) do + described_class.new(title: 'Test', content: '

hello

', nonce: 'abc123').generate + end + + it 'stamps the nonce on the