ip bans: allow full bans to overlap partial bans.
Allow full banning an IP that is part of a subnet that has already been partially banned.
This commit is contained in:
@@ -71,7 +71,7 @@ class IpBan < ApplicationRecord
|
|||||||
errors.add(:ip_addr, "may not have a subnet bigger than /64")
|
errors.add(:ip_addr, "may not have a subnet bigger than /64")
|
||||||
elsif partial_ban? && ip_addr.ipv6? && ip_addr.prefix < 20
|
elsif partial_ban? && ip_addr.ipv6? && ip_addr.prefix < 20
|
||||||
errors.add(:ip_addr, "may not have a subnet bigger than /20")
|
errors.add(:ip_addr, "may not have a subnet bigger than /20")
|
||||||
elsif new_record? && IpBan.active.ip_matches(subnetted_ip).exists?
|
elsif new_record? && IpBan.active.where(category: category).ip_matches(subnetted_ip).exists?
|
||||||
errors.add(:ip_addr, "is already banned")
|
errors.add(:ip_addr, "is already banned")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,13 @@ class IpBanTest < ActiveSupport::TestCase
|
|||||||
assert(IpBan.ip_matches("1.2.3.255").exists?)
|
assert(IpBan.ip_matches("1.2.3.255").exists?)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "allow a full ban to overlap a partial ban" do
|
||||||
|
@ip_ban1 = create(:ip_ban, ip_addr: "1.2.3.0/24", category: :partial)
|
||||||
|
@ip_ban2 = build(:ip_ban, ip_addr: "1.2.3.4", category: :full)
|
||||||
|
|
||||||
|
assert_equal(true, @ip_ban2.valid?)
|
||||||
|
end
|
||||||
|
|
||||||
context "validation" do
|
context "validation" do
|
||||||
setup { create(:ip_ban, ip_addr: "5.6.7.8") }
|
setup { create(:ip_ban, ip_addr: "5.6.7.8") }
|
||||||
subject { build(:ip_ban) }
|
subject { build(:ip_ban) }
|
||||||
|
|||||||
Reference in New Issue
Block a user