Skip to content

Commit 623ac24

Browse files
committed
Add support for SameSite=None
Fixes #412
1 parent 1fa2083 commit 623ac24

File tree

4 files changed

+53
-6
lines changed

4 files changed

+53
-6
lines changed

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ end
1717

1818
group :guard do
1919
gem "growl"
20-
gem "guard-rspec", platforms: [:ruby_19, :ruby_20, :ruby_21, :ruby_22, :ruby_23, :ruby_24]
20+
gem "guard-rspec", platforms: [:ruby]
2121
gem "rb-fsevent"
2222
gem "terminal-notifier-guard"
2323
end

lib/secure_headers/headers/cookie.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,14 @@ def samesite_cookie
9494
"SameSite=Lax"
9595
elsif flag_samesite_strict?
9696
"SameSite=Strict"
97+
elsif flag_samesite_none?
98+
"SameSite=None"
9799
end
98100
end
99101

100102
def flag_samesite?
101103
return false if config == OPT_OUT || config[:samesite] == OPT_OUT
102-
flag_samesite_lax? || flag_samesite_strict?
104+
flag_samesite_lax? || flag_samesite_strict? || flag_samesite_none?
103105
end
104106

105107
def flag_samesite_lax?
@@ -110,6 +112,10 @@ def flag_samesite_strict?
110112
flag_samesite_enforcement?(:strict)
111113
end
112114

115+
def flag_samesite_none?
116+
flag_samesite_enforcement?(:none)
117+
end
118+
113119
def flag_samesite_enforcement?(mode)
114120
return unless config[:samesite]
115121

lib/secure_headers/utils/cookies_config.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ def validate_samesite_config!
4343

4444
# when configuring with booleans, only one enforcement is permitted
4545
def validate_samesite_boolean_config!
46-
if config[:samesite].key?(:lax) && config[:samesite][:lax].is_a?(TrueClass) && config[:samesite].key?(:strict)
47-
raise CookiesConfigError.new("samesite cookie config is invalid, combination use of booleans and Hash to configure lax and strict enforcement is not permitted.")
48-
elsif config[:samesite].key?(:strict) && config[:samesite][:strict].is_a?(TrueClass) && config[:samesite].key?(:lax)
49-
raise CookiesConfigError.new("samesite cookie config is invalid, combination use of booleans and Hash to configure lax and strict enforcement is not permitted.")
46+
if config[:samesite].key?(:lax) && config[:samesite][:lax].is_a?(TrueClass) && (config[:samesite].key?(:strict) || config[:samesite].key?(:none))
47+
raise CookiesConfigError.new("samesite cookie config is invalid, combination use of booleans and Hash to configure lax with strict or no enforcement is not permitted.")
48+
elsif config[:samesite].key?(:strict) && config[:samesite][:strict].is_a?(TrueClass) && (config[:samesite].key?(:lax) || config[:samesite].key?(:none))
49+
raise CookiesConfigError.new("samesite cookie config is invalid, combination use of booleans and Hash to configure strict with lax or no enforcement is not permitted.")
50+
elsif config[:samesite].key?(:none) && config[:samesite][:none].is_a?(TrueClass) && (config[:samesite].key?(:lax) || config[:samesite].key?(:strict))
51+
raise CookiesConfigError.new("samesite cookie config is invalid, combination use of booleans and Hash to configure no enforcement with lax or strict is not permitted.")
5052
end
5153
end
5254

spec/lib/secure_headers/headers/cookie_spec.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,21 @@ module SecureHeaders
9393
expect(cookie.to_s).to eq("_session=thisisatest")
9494
end
9595

96+
it "flags SameSite=None" do
97+
cookie = Cookie.new(raw_cookie, samesite: { none: { only: ["_session"] } }, secure: OPT_OUT, httponly: OPT_OUT)
98+
expect(cookie.to_s).to eq("_session=thisisatest; SameSite=None")
99+
end
100+
101+
it "flags SameSite=None when configured with a boolean" do
102+
cookie = Cookie.new(raw_cookie, samesite: { none: true}, secure: OPT_OUT, httponly: OPT_OUT)
103+
expect(cookie.to_s).to eq("_session=thisisatest; SameSite=None")
104+
end
105+
106+
it "does not flag cookies as SameSite=none when excluded" do
107+
cookie = Cookie.new(raw_cookie, samesite: { none: { except: ["_session"] } }, secure: OPT_OUT, httponly: OPT_OUT)
108+
expect(cookie.to_s).to eq("_session=thisisatest")
109+
end
110+
96111
it "flags SameSite=Strict when configured with a boolean" do
97112
cookie = Cookie.new(raw_cookie, {samesite: { strict: true}, secure: OPT_OUT, httponly: OPT_OUT})
98113
expect(cookie.to_s).to eq("_session=thisisatest; SameSite=Strict")
@@ -155,6 +170,30 @@ module SecureHeaders
155170
end.to raise_error(CookiesConfigError)
156171
end
157172

173+
it "raises an exception when SameSite lax and none enforcement modes are configured with booleans" do
174+
expect do
175+
Cookie.validate_config!(samesite: { lax: true, none: true})
176+
end.to raise_error(CookiesConfigError)
177+
end
178+
179+
it "raises an exception when SameSite strict and none enforcement modes are configured with booleans" do
180+
expect do
181+
Cookie.validate_config!(samesite: { strict: true, none: true})
182+
end.to raise_error(CookiesConfigError)
183+
end
184+
185+
it "raises an exception when SameSite none and lax enforcement modes are configured with booleans" do
186+
expect do
187+
Cookie.validate_config!(samesite: { none: true, lax: true})
188+
end.to raise_error(CookiesConfigError)
189+
end
190+
191+
it "raises an exception when SameSite none and strict enforcement modes are configured with booleans" do
192+
expect do
193+
Cookie.validate_config!(samesite: { none: true, strict: true})
194+
end.to raise_error(CookiesConfigError)
195+
end
196+
158197
it "raises an exception when SameSite lax and strict enforcement modes are configured with booleans" do
159198
expect do
160199
Cookie.validate_config!(samesite: { lax: true, strict: { only: ["_anything"] } })

0 commit comments

Comments
 (0)