mirror of
https://github.com/discourse/discourse.git
synced 2025-05-25 00:32:52 +08:00
FIX: Correctly handle invalid auth cookies (#16995)
Previously it would blow up on invalid utf byte sequences. This was a source of spec flakiness.
This commit is contained in:
@ -77,8 +77,9 @@ class Auth::DefaultCurrentUserProvider
|
|||||||
]
|
]
|
||||||
|
|
||||||
def self.find_v0_auth_cookie(request)
|
def self.find_v0_auth_cookie(request)
|
||||||
cookie = request.cookies[TOKEN_COOKIE].presence
|
cookie = request.cookies[TOKEN_COOKIE]
|
||||||
if cookie && cookie.size == TOKEN_SIZE
|
|
||||||
|
if cookie&.valid_encoding? && cookie.present? && cookie.size == TOKEN_SIZE
|
||||||
cookie
|
cookie
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -88,8 +89,10 @@ class Auth::DefaultCurrentUserProvider
|
|||||||
|
|
||||||
env[DECRYPTED_AUTH_COOKIE] = begin
|
env[DECRYPTED_AUTH_COOKIE] = begin
|
||||||
request = ActionDispatch::Request.new(env)
|
request = ActionDispatch::Request.new(env)
|
||||||
|
cookie = request.cookies[TOKEN_COOKIE]
|
||||||
|
|
||||||
# don't even initialize a cookie jar if we don't have a cookie at all
|
# don't even initialize a cookie jar if we don't have a cookie at all
|
||||||
if request.cookies[TOKEN_COOKIE].present?
|
if cookie&.valid_encoding? && cookie.present?
|
||||||
request.cookie_jar.encrypted[TOKEN_COOKIE]&.with_indifferent_access
|
request.cookie_jar.encrypted[TOKEN_COOKIE]&.with_indifferent_access
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -29,6 +29,7 @@ describe Middleware::AnonymousCache do
|
|||||||
it "is true if it has an invalid auth cookie" do
|
it "is true if it has an invalid auth cookie" do
|
||||||
cookie = create_auth_cookie(token: SecureRandom.hex, issued_at: 5.minutes.ago)
|
cookie = create_auth_cookie(token: SecureRandom.hex, issued_at: 5.minutes.ago)
|
||||||
cookie = swap_2_different_characters(cookie)
|
cookie = swap_2_different_characters(cookie)
|
||||||
|
cookie.prepend("%a0%a1") # an invalid byte sequence
|
||||||
expect(new_helper("HTTP_COOKIE" => "jack=1; _t=#{cookie}; jill=2").cacheable?).to eq(true)
|
expect(new_helper("HTTP_COOKIE" => "jack=1; _t=#{cookie}; jill=2").cacheable?).to eq(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -376,5 +377,4 @@ describe Middleware::AnonymousCache do
|
|||||||
expect(@status).to eq(403)
|
expect(@status).to eq(403)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user