Skip to content

Commit

Permalink
Merge pull request #143 from RST-J/fix_ip_formats
Browse files Browse the repository at this point in the history
Use IPAddr class to validate ip formats
  • Loading branch information
pd committed Oct 26, 2014
2 parents 3f89bf9 + c8d0265 commit 54b0d9b
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 26 deletions.
15 changes: 6 additions & 9 deletions lib/json-schema/attributes/formats/ip4.rb
@@ -1,20 +1,17 @@
require 'json-schema/attribute'
require 'uri'
require 'ipaddr'
module JSON
class Schema
class IP4Format < FormatAttribute
def self.validate(current_schema, data, fragments, processor, validator, options = {})
if data.is_a?(String)
error_message = "The property '#{build_fragment(fragments)}' must be a valid IPv4 address"
r = Regexp.new('^(\d+){1,3}\.(\d+){1,3}\.(\d+){1,3}\.(\d+){1,3}$')
if (m = r.match(data))
1.upto(4) do |x|
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[x].to_i > 255
end
else
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
begin
ip = IPAddr.new data
rescue ArgumentError => e
raise e unless e.message == 'invalid address'
end
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) unless ip && ip.ipv4?
end
end
end
Expand Down
23 changes: 6 additions & 17 deletions lib/json-schema/attributes/formats/ip6.rb
@@ -1,28 +1,17 @@
require 'json-schema/attribute'
require 'uri'
require 'ipaddr'
module JSON
class Schema
class IP6Format < FormatAttribute
def self.validate(current_schema, data, fragments, processor, validator, options = {})
if data.is_a?(String)
error_message = "The property '#{build_fragment(fragments)}' must be a valid IPv6 address"
r = Regexp.new('^[a-f0-9:]+$')
if (r.match(data))
# All characters are valid, now validate structure
parts = data.split(":")
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if parts.length > 8
condensed_zeros = false
parts.each do |part|
if part.length == 0
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if condensed_zeros
condensed_zeros = true
end
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if part.length > 4
end
else
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
begin
ip = IPAddr.new data
rescue ArgumentError => e
raise e unless e.message == 'invalid address'
end
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) unless ip && ip.ipv6?
end
end
end
Expand Down
2 changes: 2 additions & 0 deletions test/test_jsonschema_draft1.rb
Expand Up @@ -613,6 +613,8 @@ def test_format_ipv6
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema, {"a" => "::1"}, :version => :draft1), 'validate with shortcut')
assert(!JSON::Validator.validate(schema, {"a" => "42"}, :version => :draft1), 'not validate a simple number')
end

def test_format_time
Expand Down
2 changes: 2 additions & 0 deletions test/test_jsonschema_draft2.rb
Expand Up @@ -685,6 +685,8 @@ def test_format_ipv6
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema, {"a" => "::1"}, :version => :draft2), 'validate with shortcut')
assert(!JSON::Validator.validate(schema, {"a" => "42"}, :version => :draft2), 'not validate a simple number')
end

def test_format_time
Expand Down
2 changes: 2 additions & 0 deletions test/test_jsonschema_draft3.rb
Expand Up @@ -984,6 +984,8 @@ def test_format_ipv6
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema, {"a" => "::1"}), 'validate with shortcut')
assert(!JSON::Validator.validate(schema, {"a" => "42"}), 'not validate a simple number')
end

def test_format_time
Expand Down
2 changes: 2 additions & 0 deletions test/test_jsonschema_draft4.rb
Expand Up @@ -927,6 +927,8 @@ def test_format_ipv6
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema, {"a" => "::1"}), 'validate with shortcut')
assert(!JSON::Validator.validate(schema, {"a" => "42"}), 'not validate a simple number')
end


Expand Down

0 comments on commit 54b0d9b

Please sign in to comment.