From d96acdeafac452ba49673a8bce948f6e1b33c872 Mon Sep 17 00:00:00 2001
From: Neil Lalonde <neillalonde@gmail.com>
Date: Wed, 24 Sep 2014 12:05:29 -0400
Subject: [PATCH] FEATURE: screened IP address range can be entered like 192.*
 instead of 192.*.*.*

---
 app/models/screened_ip_address.rb       | 7 +++++--
 spec/models/screened_ip_address_spec.rb | 2 ++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/app/models/screened_ip_address.rb b/app/models/screened_ip_address.rb
index fdca1ab5560..a4eb6e148f8 100644
--- a/app/models/screened_ip_address.rb
+++ b/app/models/screened_ip_address.rb
@@ -29,12 +29,15 @@ class ScreenedIpAddress < ActiveRecord::Base
     if num_wildcards == 0
       write_attribute(:ip_address, val)
     else
-      v = val.gsub(/\/.*/, '')
+      v = val.gsub(/\/.*/, '') # strip ranges like "/16" from the end if present
       if v[v.index('*')..-1] =~ /[^\.\*]/
         self.errors.add(:ip_address, :invalid)
         return
       end
-      write_attribute(:ip_address, "#{v.gsub('*', '0')}/#{32 - (num_wildcards * 8)}")
+      parts = v.split('.')
+      (4 - parts.size).times { parts << '*' } # support strings like 192.*
+      v = parts.join('.')
+      write_attribute(:ip_address, "#{v.gsub('*', '0')}/#{32 - (v.count('*') * 8)}")
     end
 
   # this gets even messier, Ruby 1.9.2 raised a different exception to Ruby 2.0.0
diff --git a/spec/models/screened_ip_address_spec.rb b/spec/models/screened_ip_address_spec.rb
index b860419b618..eafa2d6ba76 100644
--- a/spec/models/screened_ip_address_spec.rb
+++ b/spec/models/screened_ip_address_spec.rb
@@ -76,6 +76,8 @@ describe ScreenedIpAddress do
       test_good_value("123.12.*.*",    "123.12.0.0/16")
       test_good_value("123.12.1.*",    "123.12.1.0/24")
       test_good_value("123.12.*.*/16", "123.12.0.0/16")
+      test_good_value("123.12.*",      "123.12.0.0/16")
+      test_good_value("123.*",         "123.0.0.0/8")
     end
 
     it "handles bad input" do