Add a global rate limit for report generation

This commit is contained in:
2026-09-27 16:08:06 +02:00
parent df2bf37987
commit 1c02e62b2a
4 changed files with 28 additions and 0 deletions
@@ -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?
+1
View File
@@ -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."
+3
View File
@@ -13,3 +13,6 @@ hledger:
hledger_memory_limit_mb:
default: 256
min: 0
hledger_global_rate_limit_per_minute:
default: 120
min: 0
+16
View File
@@ -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