Skip to content

Commit 54c7789

Browse files
committed
Merge pull request #214 from twitter/nil-handling
Directive values may be nil, so secure_headers should not 💥
2 parents 0d6a164 + f6ccdc4 commit 54c7789

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

lib/secure_headers/headers/content_security_policy.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def combine_policies(original, additions)
218218
# when each hash contains a value for a given key.
219219
original.merge(additions) do |directive, lhs, rhs|
220220
if source_list?(directive)
221-
(lhs.to_a + rhs).uniq.compact
221+
(lhs.to_a + rhs.to_a).compact.uniq
222222
else
223223
rhs
224224
end
@@ -343,6 +343,8 @@ def build_value
343343
#
344344
# Returns a string representing a directive.
345345
def build_directive(directive_name)
346+
return if @config[directive_name].nil?
347+
346348
source_list = @config[directive_name].compact
347349
return if source_list.empty?
348350

spec/lib/secure_headers/headers/content_security_policy_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ module SecureHeaders
155155
specify { expect(ContentSecurityPolicy.idempotent_additions?({script_src: %w(a.com b.com)}, script_src: %w())).to be true }
156156
specify { expect(ContentSecurityPolicy.idempotent_additions?({script_src: %w(a.com b.com)}, script_src: [nil])).to be true }
157157
specify { expect(ContentSecurityPolicy.idempotent_additions?({script_src: %w(a.com b.com)}, style_src: [nil])).to be true }
158+
specify { expect(ContentSecurityPolicy.idempotent_additions?({script_src: %w(a.com b.com)}, style_src: nil)).to be true }
158159
end
159160

160161
describe "#value" do
@@ -201,6 +202,11 @@ module SecureHeaders
201202
expect(csp.value).to eq("default-src example.org")
202203
end
203204

205+
it "does not add a directive if the value is nil" do
206+
csp = ContentSecurityPolicy.new(default_src: ["https://example.org"], script_src: nil)
207+
expect(csp.value).to eq("default-src example.org")
208+
end
209+
204210
it "deduplicates any source expressions" do
205211
csp = ContentSecurityPolicy.new(default_src: %w(example.org example.org example.org))
206212
expect(csp.value).to eq("default-src example.org")

0 commit comments

Comments
 (0)