49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
# == Schema Information
 | 
						|
#
 | 
						|
# Table name: ip_blocks
 | 
						|
#
 | 
						|
#  id         :bigint(8)        not null, primary key
 | 
						|
#  created_at :datetime         not null
 | 
						|
#  updated_at :datetime         not null
 | 
						|
#  expires_at :datetime
 | 
						|
#  ip         :inet             default(#<IPAddr: IPv4:0.0.0.0/255.255.255.255>), not null
 | 
						|
#  severity   :integer          default(NULL), not null
 | 
						|
#  comment    :text             default(""), not null
 | 
						|
#
 | 
						|
 | 
						|
class IpBlock < ApplicationRecord
 | 
						|
  CACHE_KEY = 'blocked_ips'
 | 
						|
 | 
						|
  include Expireable
 | 
						|
  include Paginable
 | 
						|
 | 
						|
  enum severity: {
 | 
						|
    sign_up_requires_approval: 5000,
 | 
						|
    sign_up_block: 5500,
 | 
						|
    no_access: 9999,
 | 
						|
  }
 | 
						|
 | 
						|
  validates :ip, :severity, presence: true
 | 
						|
  validates :ip, uniqueness: true
 | 
						|
 | 
						|
  after_commit :reset_cache
 | 
						|
 | 
						|
  def to_log_human_identifier
 | 
						|
    "#{ip}/#{ip.prefix}"
 | 
						|
  end
 | 
						|
 | 
						|
  class << self
 | 
						|
    def blocked?(remote_ip)
 | 
						|
      blocked_ips_map = Rails.cache.fetch(CACHE_KEY) { FastIpMap.new(IpBlock.where(severity: :no_access).pluck(:ip)) }
 | 
						|
      blocked_ips_map.include?(remote_ip)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def reset_cache
 | 
						|
    Rails.cache.delete(CACHE_KEY)
 | 
						|
  end
 | 
						|
end
 |