From a31f3063025840a93edf746fe0db955db72468a8 Mon Sep 17 00:00:00 2001 From: "Henrique F. Teixeira" Date: Tue, 24 Feb 2026 20:49:30 -0300 Subject: [PATCH 1/3] add easy csp header config removal --- lib/rackr/action.rb | 1 + lib/spec/rackr/action_spec.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/rackr/action.rb b/lib/rackr/action.rb index 69e893c..d6db77b 100644 --- a/lib/rackr/action.rb +++ b/lib/rackr/action.rb @@ -342,6 +342,7 @@ def content_security_policy @content_security_policy ||= DEFAULT_CSP_HEADERS .merge(config&.dig(:csp_headers) || {}) + .compact .map { |k, v| "#{k.to_s.tr('_', '-')} #{v}" } .join('; ') end diff --git a/lib/spec/rackr/action_spec.rb b/lib/spec/rackr/action_spec.rb index f69e576..0034c51 100644 --- a/lib/spec/rackr/action_spec.rb +++ b/lib/spec/rackr/action_spec.rb @@ -510,6 +510,32 @@ class SomeClass2 end end + context 'when removing csp_headers' do + let(:config) do + { + csp_headers: { + style_src: nil, + } + } + end + + let(:expected_csp) do + default = { + base_uri: "'self'", child_src: "'self'", connect_src: "'self'", + default_src: "'none'", font_src: "'self'", form_action: "'self'", + frame_ancestors: "'self'", frame_src: "'self'", + img_src: "'self' https: data:", media_src: "'self'", + object_src: "'none'", script_src: "'self'", + } + default.map { |k, v| "#{k.to_s.tr('_', '-')} #{v}" }.join('; ') + end + + it 'merges and overrides the default csp' do + result = subject.render(html: 'test') + expect(result[1]['content-security-policy']).to eq(expected_csp) + end + end + context 'with user-defined csp_headers' do let(:config) do { From e9b44407b8dcad3b19acc5c1c339275ea17e3af4 Mon Sep 17 00:00:00 2001 From: "Henrique F. Teixeira" Date: Tue, 24 Feb 2026 20:50:06 -0300 Subject: [PATCH 2/3] bump version --- lib/rackr.rb | 2 +- rackr-0.0.70.gem | Bin 14336 -> 0 bytes rackr-0.0.71.gem | Bin 0 -> 14336 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 rackr-0.0.70.gem create mode 100644 rackr-0.0.71.gem diff --git a/lib/rackr.rb b/lib/rackr.rb index f08756a..0715778 100644 --- a/lib/rackr.rb +++ b/lib/rackr.rb @@ -7,7 +7,7 @@ # Rackr is a simple router for Rack. class Rackr - VERSION = '0.0.70' + VERSION = '0.0.71' class NotFound < StandardError; end diff --git a/rackr-0.0.70.gem b/rackr-0.0.70.gem deleted file mode 100644 index 74a14da5cbd852369a2117aa87e219810583d263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14336 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 BfX4s; diff --git a/rackr-0.0.71.gem b/rackr-0.0.71.gem new file mode 100644 index 0000000000000000000000000000000000000000..b1632f5d2b05fd686d723874b805c0290c7e297a GIT binary patch literal 14336 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 Date: Tue, 24 Feb 2026 20:51:56 -0300 Subject: [PATCH 3/3] change rubocop max lenght --- .rubocop.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 7ec66ff..2942fec 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -44,8 +44,8 @@ Metrics/ParameterLists: Max: 7 Metrics/ClassLength: - Max: 300 + Max: 350 Metrics/ModuleLength: - Max: 300 + Max: 350