Add a global rate limit for report generation
This commit is contained in:
@@ -11,6 +11,7 @@ module ::Hledger
|
||||
before_action :ensure_enabled
|
||||
before_action :find_topic
|
||||
before_action :enforce_rate_limit
|
||||
before_action :enforce_global_rate_limit
|
||||
|
||||
def show
|
||||
report_type = params[:report_type].to_s
|
||||
@@ -87,6 +88,13 @@ module ::Hledger
|
||||
).performed!
|
||||
end
|
||||
|
||||
def enforce_global_rate_limit
|
||||
max = SiteSetting.hledger_global_rate_limit_per_minute.to_i
|
||||
return if max <= 0
|
||||
|
||||
RateLimiter.new(nil, "hledger-reports-global", max, 60, global: true).performed!
|
||||
end
|
||||
|
||||
def parse_date(value)
|
||||
return nil if value.blank?
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ en:
|
||||
hledger_timeout_seconds: "Maximum number of seconds an hledger command may run"
|
||||
hledger_max_output_bytes: "Maximum number of bytes captured from hledger output"
|
||||
hledger_memory_limit_mb: "Maximum memory in megabytes the hledger process may use; set to 0 to disable the limit"
|
||||
hledger_global_rate_limit_per_minute: "Maximum number of hledger reports that may be generated per minute across all users; set to 0 to disable the limit"
|
||||
hledger:
|
||||
errors:
|
||||
unsupported_report: "Unsupported report type."
|
||||
|
||||
@@ -13,3 +13,6 @@ hledger:
|
||||
hledger_memory_limit_mb:
|
||||
default: 256
|
||||
min: 0
|
||||
hledger_global_rate_limit_per_minute:
|
||||
default: 120
|
||||
min: 0
|
||||
|
||||
@@ -175,4 +175,20 @@ RSpec.describe Hledger::ReportsController do
|
||||
|
||||
expect(response.status).to eq(404)
|
||||
end
|
||||
|
||||
it "enforces the global rate limit" do
|
||||
RateLimiter.enable
|
||||
RateLimiter.clear_all_global!
|
||||
SiteSetting.hledger_global_rate_limit_per_minute = 1
|
||||
|
||||
get_report("accounts")
|
||||
expect(response.status).to eq(200)
|
||||
|
||||
get_report("accounts")
|
||||
expect(response.status).to eq(429)
|
||||
ensure
|
||||
RateLimiter.disable
|
||||
RateLimiter.clear_all_global!
|
||||
SiteSetting.hledger_global_rate_limit_per_minute = 120
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user