gitlab-org--gitlab-foss/lib/gitlab/auth/ip_rate_limiter.rb

60 lines
1.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2016-06-03 11:07:40 -04:00
module Gitlab
module Auth
class IpRateLimiter
include ::Gitlab::Utils::StrongMemoize
2016-06-03 11:07:40 -04:00
attr_reader :ip
def initialize(ip)
@ip = ip
@banned = false
end
def enabled?
config.enabled
end
2016-06-03 11:07:40 -04:00
def reset!
Rack::Attack::Allow2Ban.reset(ip, config)
end
2016-06-03 11:07:40 -04:00
def register_fail!
# Allow2Ban.filter will return false if this IP has not failed too often yet
@banned = Rack::Attack::Allow2Ban.filter(ip, config) do
# If we return false here, the failure for this IP is ignored by Allow2Ban
2016-06-03 11:14:13 -04:00
ip_can_be_banned?
2016-06-03 11:07:40 -04:00
end
end
2016-06-03 11:07:40 -04:00
def banned?
@banned
end
2016-06-03 11:07:40 -04:00
private
2016-06-03 11:07:40 -04:00
def config
Gitlab.config.rack_attack.git_basic_auth
end
2016-06-03 11:14:13 -04:00
def ip_can_be_banned?
!trusted_ip?
end
def trusted_ip?
trusted_ips.any? { |netmask| netmask.include?(ip) }
end
def trusted_ips
strong_memoize(:trusted_ips) do
config.ip_whitelist.map do |proxy|
IPAddr.new(proxy)
rescue IPAddr::InvalidAddressError
end.compact
end
2016-06-03 11:07:40 -04:00
end
end
end
end