diff options
Diffstat (limited to 'lib/gitlab/application_rate_limiter.rb')
-rw-r--r-- | lib/gitlab/application_rate_limiter.rb | 29 |
1 files changed, 4 insertions, 25 deletions
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb index 12f1b15f820..d2a31938e89 100644 --- a/lib/gitlab/application_rate_limiter.rb +++ b/lib/gitlab/application_rate_limiter.rb @@ -1,37 +1,20 @@ # frozen_string_literal: true module Gitlab - # This class implements a simple rate limiter that can be used to throttle + # This module implements a simple rate limiter that can be used to throttle # certain actions. Unlike Rack Attack and Rack::Throttle, which operate at # the middleware level, this can be used at the controller or API level. # See CheckRateLimit concern for usage. - class ApplicationRateLimiter + module ApplicationRateLimiter InvalidKeyError = Class.new(StandardError) - def initialize(key, **options) - @key = key - @options = options - end - - def throttled? - self.class.throttled?(key, **options) - end - - def threshold_value - options[:threshold] || self.class.threshold(key) - end - - def interval_value - self.class.interval(key) - end - class << self # Application rate limits # # Threshold value can be either an Integer or a Proc # in order to not evaluate it's value every time this method is called # and only do that when it's needed. - def rate_limits + def rate_limits # rubocop:disable Metrics/AbcSize { issues_create: { threshold: -> { application_settings.issues_create_limit }, interval: 1.minute }, notes_create: { threshold: -> { application_settings.notes_create_limit }, interval: 1.minute }, @@ -49,7 +32,7 @@ module Gitlab group_testing_hook: { threshold: 5, interval: 1.minute }, profile_add_new_email: { threshold: 5, interval: 1.minute }, web_hook_calls: { interval: 1.minute }, - users_get_by_id: { threshold: 10, interval: 1.minute }, + users_get_by_id: { threshold: -> { application_settings.users_get_by_id_limit }, interval: 10.minutes }, username_exists: { threshold: 20, interval: 1.minute }, user_sign_up: { threshold: 20, interval: 1.minute }, profile_resend_email_confirmation: { threshold: 5, interval: 1.minute }, @@ -201,9 +184,5 @@ module Gitlab scoped_user.username.downcase.in?(users_allowlist) end end - - private - - attr_reader :key, :options end end |