diff --git a/lib/spam_handler.rb b/lib/spam_handler.rb index a60a8cd5b5c..e6bfdf34193 100644 --- a/lib/spam_handler.rb +++ b/lib/spam_handler.rb @@ -3,6 +3,12 @@ class SpamHandler def self.should_prevent_registration_from_ip?(ip_address) return false if SiteSetting.max_new_accounts_per_registration_ip <= 0 + tl2_plus_accounts_with_same_ip = User.where("trust_level >= ?", TrustLevel[2]) + .where("ip_address = ?", ip_address.to_s) + .count + + return false if tl2_plus_accounts_with_same_ip > 0 + tl0_accounts_with_same_ip = User.unscoped .where(trust_level: TrustLevel[0]) .where("ip_address = ?", ip_address.to_s) diff --git a/lib/trust_level.rb b/lib/trust_level.rb index 5f8637b460f..6fba142eb3c 100644 --- a/lib/trust_level.rb +++ b/lib/trust_level.rb @@ -1,22 +1,20 @@ require_dependency 'enum' class InvalidTrustLevel < StandardError; end + class TrustLevel + attr_reader :id, :name class << self - def[](level) - if !valid?(level) - raise InvalidTrustLevel - end + def [](level) + raise InvalidTrustLevel if !valid?(level) level end def levels - @levels ||= Enum.new( - :newuser, :basic, :regular, :leader, :elder, start: 0 - ) + @levels ||= Enum.new(:newuser, :basic, :regular, :leader, :elder, start: 0) end def all @@ -26,16 +24,17 @@ class TrustLevel end def valid?(level) - valid_range === level + valid_range === level end def valid_range - (0..4) + (0..4) end def compare(current_level, level) (current_level || 0) >= level end + end def initialize(name_key, id) @@ -46,4 +45,5 @@ class TrustLevel def serializable_hash { id: @id, name: @name } end + end diff --git a/spec/components/spam_handler_spec.rb b/spec/components/spam_handler_spec.rb index 7154d45486b..532eda07237 100644 --- a/spec/components/spam_handler_spec.rb +++ b/spec/components/spam_handler_spec.rb @@ -22,6 +22,17 @@ describe SpamHandler do -> { Fabricate(:user, ip_address: "42.42.42.42", trust_level: TrustLevel[0]) }.should raise_error(ActiveRecord::RecordInvalid) end + it "only limit new registrations from an IP if *all* the users from that IP are TL1 or TL0" do + # setup + SiteSetting.stubs(:max_new_accounts_per_registration_ip).returns(0) + Fabricate(:user, ip_address: "42.42.42.42", trust_level: TrustLevel[0]) + Fabricate(:user, ip_address: "42.42.42.42", trust_level: TrustLevel[2]) + + # should not limit registrations since there is a TL2 user with that IP + SiteSetting.stubs(:max_new_accounts_per_registration_ip).returns(1) + Fabricate(:user, ip_address: "42.42.42.42", trust_level: TrustLevel[0]) + end + end end