From 530d8cf7620d04daf27b6d13ce5f9e33865f52a9 Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 29 Sep 2022 03:52:34 -0500 Subject: [PATCH] searchable: fix searching for invalid IP addresses. Fix an ArgumentError exception when searching for an invalid IP address. Also allow searching for multiple subnets at once. --- app/logical/concerns/searchable.rb | 10 ++++++---- app/logical/danbooru/ip_address.rb | 6 ++++++ test/unit/concerns/searchable.rb | 18 +++++++++++++----- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/logical/concerns/searchable.rb b/app/logical/concerns/searchable.rb index 510e8803b..b4b7bdc32 100644 --- a/app/logical/concerns/searchable.rb +++ b/app/logical/concerns/searchable.rb @@ -71,11 +71,13 @@ module Searchable def where_inet_matches(attr, value) if value.match?(/[, ]/) - ips = value.split(/[, ]+/).map { |ip| Danbooru::IpAddress.new(ip).to_string } - where("#{qualified_column_for(attr)} = ANY(ARRAY[?]::inet[])", ips) + ips = value.split(/[, ]+/).map { |ip| Danbooru::IpAddress.parse(ip).to_s } + return none if ips.any?(&:blank?) + where("#{qualified_column_for(attr)} <<= ANY(ARRAY[?]::inet[])", ips) else - ip = Danbooru::IpAddress.new(value) - where("#{qualified_column_for(attr)} <<= ?", ip.to_string) + ip = Danbooru::IpAddress.parse(value) + return none if ip.nil? + where("#{qualified_column_for(attr)} <<= ?", ip.to_s) end end diff --git a/app/logical/danbooru/ip_address.rb b/app/logical/danbooru/ip_address.rb index 1fe36baa6..e90b0d538 100644 --- a/app/logical/danbooru/ip_address.rb +++ b/app/logical/danbooru/ip_address.rb @@ -9,6 +9,12 @@ module Danbooru delegate :ipv4?, :ipv6?, :loopback?, :link_local?, :unique_local?, :private?, :to_string, :network, :prefix, :multicast?, :unspecified?, to: :ip_address delegate :ip_info, :is_proxy?, to: :ip_lookup + def self.parse(string) + new(string) + rescue + nil + end + def initialize(string) @ip_address = ::IPAddress.parse(string.to_s.strip) end diff --git a/test/unit/concerns/searchable.rb b/test/unit/concerns/searchable.rb index 2e4024639..6713995d9 100644 --- a/test/unit/concerns/searchable.rb +++ b/test/unit/concerns/searchable.rb @@ -105,11 +105,19 @@ class SearchableTest < ActiveSupport::TestCase subject { UserSession } should "work" do - @us = create(:user_session, ip_addr: "10.0.0.1") - assert_search_equals(@us, ip_addr: "10.0.0.1") - assert_search_equals(@us, ip_addr: "10.0.0.1/24") - assert_search_equals(@us, ip_addr: "10.0.0.1,1.1.1.1") - assert_search_equals(@us, ip_addr: "10.0.0.1 1.1.1.1") + @us1 = create(:user_session, ip_addr: "10.0.0.1") + @us2 = create(:user_session, ip_addr: "11.0.0.1") + + assert_search_equals(@us1, ip_addr: "10.0.0.1") + assert_search_equals(@us1, ip_addr: "10.0.0.1/24") + assert_search_equals(@us1, ip_addr: "10.0.0.1,1.1.1.1") + assert_search_equals(@us1, ip_addr: "10.0.0.1 1.1.1.1") + + assert_search_equals([@us2, @us1], ip_addr: "10.1.0.0/8,11.1.0.0/8") + assert_search_equals([@us2, @us1], ip_addr: "10.1.0.0/8 11.1.0.0/8") + + assert_search_equals([], ip_addr: "10.0.0.x") + assert_search_equals([], ip_addr: "10.0.0.x 11.0.0.y") end end