Skip to content

Add support for SameSite=X & __Secure- / __Host- prefixes#39

Open
geoffyoungs wants to merge 1 commit into
sparklemotion:masterfrom
livelink:add-same-site-attribute-and-cookie-prefixes
Open

Add support for SameSite=X & __Secure- / __Host- prefixes#39
geoffyoungs wants to merge 1 commit into
sparklemotion:masterfrom
livelink:add-same-site-attribute-and-cookie-prefixes

Conversation

@geoffyoungs
Copy link
Copy Markdown

Currently if a site specifies SameSite=None etc in the set-cookie header, it will be lost when HTTP::Cookie.parse parses it.

This PR adds support for parsing, preserving and restoring, via HTTP::Cookie#set_cookie_value the SameSite=X attribute.

It also respects the __Secure- and __Host- prefixes and rejects cookies that violate the spec.

Sources:

Currently if a site specifies SameSite=None in the cookie, it will be
lost when HTTP::Cookie.parse parses it.

This PR adds support for parsing, preserving and restoring, via
HTTP::Cookie#set_cookie_value the SameSite=X attribute.

It also respects the __Secure- and __Host- prefixes and rejects cookies
that violate the spec.

Sources:
 - https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#samesite_attribute
 - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes
 - https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes
Copy link
Copy Markdown
Member

@knu knu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your PR!

# RFC 6265 5.2.5, 5.2.6
avalue = true
when 'samesite'
avalue = avalue.downcase
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think SameSite values are normally capitalized.

Suggested change
avalue = avalue.downcase
avalue = avalue.capitalize

Comment thread lib/http/cookie.rb
attr_reader :same_site

def same_site=(value)
@same_site = value.downcase
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nil should be accepted, and strings should be capitalized.

Suggested change
@same_site = value.downcase
@same_site = value&.capitalize

Comment thread lib/http/cookie.rb
Comment on lines +586 to 597
when same_site.eql?('none')
secure? && (URI::HTTPS === @origin)
when secure_prefix?
secure? && (URI::HTTPS === @origin)
when host_prefix?
secure? && (URI::HTTPS === @origin) &&
@path == '/' &&
!for_domain?
when @origin.nil?
true
else
acceptable_from_uri?(@origin)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The acceptable_from_uri? check should not be omitted in those cases.

Suggested change
when same_site.eql?('none')
secure? && (URI::HTTPS === @origin)
when secure_prefix?
secure? && (URI::HTTPS === @origin)
when host_prefix?
secure? && (URI::HTTPS === @origin) &&
@path == '/' &&
!for_domain?
when @origin.nil?
true
else
acceptable_from_uri?(@origin)
when @origin.nil?
true
when !acceptable_from_uri?(@origin)
false
when same_site == 'None' || secure_prefix?
secure? && (URI::HTTPS === @origin)
when host_prefix?
secure? && (URI::HTTPS === @origin) &&
@path == '/' && !for_domain?
else
true

Comment thread test/test_http_cookie.rb
# Domain must not be set
url = URI 'https://www.example.com/'

tld_cookie1 = HTTP::Cookie.new(cookie_values(:name => '__Host-Foo', :path => '', :secure => true, :domain => 'www.example.com', :origin => url))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you mean :path => '/', and you may be missing a test case with for_domain? == true.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants