mirror of
https://github.com/discourse/discourse.git
synced 2025-03-21 01:16:18 +08:00
FIX: Ensure anon-cached values are never returned for API requests (#20021)
Under some situations, we would inadvertently return a public (unauthenticated) result to an authenticated API request. This commit adds the `Api-Key` header to our anonymous cache bypass logic.
This commit is contained in:
parent
e717529d80
commit
798b4bb604
@ -66,6 +66,7 @@ module Middleware
|
|||||||
!@request.path.ends_with?("srv/status") &&
|
!@request.path.ends_with?("srv/status") &&
|
||||||
@request[Auth::DefaultCurrentUserProvider::API_KEY].nil? &&
|
@request[Auth::DefaultCurrentUserProvider::API_KEY].nil? &&
|
||||||
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY].nil? &&
|
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY].nil? &&
|
||||||
|
@env[Auth::DefaultCurrentUserProvider::HEADER_API_KEY].nil? &&
|
||||||
CrawlerDetection.is_blocked_crawler?(@env[USER_AGENT])
|
CrawlerDetection.is_blocked_crawler?(@env[USER_AGENT])
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -184,11 +185,13 @@ module Middleware
|
|||||||
request = Rack::Request.new(@env)
|
request = Rack::Request.new(@env)
|
||||||
request.cookies["_bypass_cache"].nil? && (request.path != "/srv/status") &&
|
request.cookies["_bypass_cache"].nil? && (request.path != "/srv/status") &&
|
||||||
request[Auth::DefaultCurrentUserProvider::API_KEY].nil? &&
|
request[Auth::DefaultCurrentUserProvider::API_KEY].nil? &&
|
||||||
|
@env[Auth::DefaultCurrentUserProvider::HEADER_API_KEY].nil? &&
|
||||||
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY].nil?
|
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY].nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def force_anonymous!
|
def force_anonymous!
|
||||||
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY] = nil
|
@env[Auth::DefaultCurrentUserProvider::USER_API_KEY] = nil
|
||||||
|
@env[Auth::DefaultCurrentUserProvider::HEADER_API_KEY] = nil
|
||||||
@env["HTTP_COOKIE"] = nil
|
@env["HTTP_COOKIE"] = nil
|
||||||
@env["HTTP_DISCOURSE_LOGGED_IN"] = nil
|
@env["HTTP_DISCOURSE_LOGGED_IN"] = nil
|
||||||
@env["rack.request.cookie.hash"] = {}
|
@env["rack.request.cookie.hash"] = {}
|
||||||
|
@ -4,7 +4,7 @@ RSpec.describe Middleware::AnonymousCache do
|
|||||||
let(:middleware) { Middleware::AnonymousCache.new(lambda { |_| [200, {}, []] }) }
|
let(:middleware) { Middleware::AnonymousCache.new(lambda { |_| [200, {}, []] }) }
|
||||||
|
|
||||||
def env(opts = {})
|
def env(opts = {})
|
||||||
create_request_env(path: "http://test.com/path?bla=1").merge(opts)
|
create_request_env(path: opts.delete(:path) || "http://test.com/path?bla=1").merge(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe Middleware::AnonymousCache::Helper do
|
describe Middleware::AnonymousCache::Helper do
|
||||||
@ -38,6 +38,18 @@ RSpec.describe Middleware::AnonymousCache do
|
|||||||
it "is false for srv/status routes" do
|
it "is false for srv/status routes" do
|
||||||
expect(new_helper("PATH_INFO" => "/srv/status").cacheable?).to eq(false)
|
expect(new_helper("PATH_INFO" => "/srv/status").cacheable?).to eq(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "is false for API requests using header" do
|
||||||
|
expect(new_helper("HTTP_API_KEY" => "abcde").cacheable?).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is false for API requests using parameter" do
|
||||||
|
expect(new_helper(path: "/path?api_key=abc").cacheable?).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is false for User API requests using header" do
|
||||||
|
expect(new_helper("HTTP_USER_API_KEY" => "abcde").cacheable?).to eq(false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "per theme cache" do
|
describe "per theme cache" do
|
||||||
@ -322,6 +334,9 @@ RSpec.describe Middleware::AnonymousCache do
|
|||||||
"QUERY_STRING" => "api_key=#{api_key.key}&api_username=system",
|
"QUERY_STRING" => "api_key=#{api_key.key}&api_username=system",
|
||||||
}
|
}
|
||||||
expect(@status).to eq(200)
|
expect(@status).to eq(200)
|
||||||
|
|
||||||
|
get "/latest", headers: { "HTTP_API_KEY" => api_key.key, "HTTP_API_USERNAME" => "system" }
|
||||||
|
expect(@status).to eq(200)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "applies blocked_crawler_user_agents correctly" do
|
it "applies blocked_crawler_user_agents correctly" do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user