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
 |