Skip to content

Instantly share code, notes, and snippets.

@kch
Created October 14, 2010 21:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kch/627078 to your computer and use it in GitHub Desktop.
Save kch/627078 to your computer and use it in GitHub Desktop.
QUIZZZZS validate an ip v6
#!/usr/bin/env ruby
# encoding: UTF-8
require 'yaml'
def ipv6?(s)
raise NotImplementedError
end
good, bad = YAML::load(DATA.read).values_at *%w[ GOOD BAD ]
results = []
check = lambda { |cond, m, s| print(cond ? "." : m[0, 1]); results << "FALSE #{m}: #{s}" unless cond }
good.each { |s| check[ ipv6?(s), "NEGATIVE", s] }
bad.each { |s| check[!ipv6?(s), "POSITIVE", s] }
puts
puts results
__END__
# values stolen from http://search.cpan.org/~salva/Regexp-IPv6-0.03/
GOOD:
- "::127.0.0.1"
- "::1"
- "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
- "2001:db8:85a3:0:0:8a2e:370:7334"
- "2001:db8:85a3::8a2e:370:7334"
- "2001:0db8:0000:0000:0000:0000:1428:57ab"
- "2001:0db8:0000:0000:0000::1428:57ab"
- "2001:0db8:0:0:0:0:1428:57ab"
- "2001:0db8:0:0::1428:57ab"
- "2001:0db8::1428:57ab"
- "2001:db8::1428:57ab"
- "::ffff:12.34.56.78"
- "::ffff:0c22:384e"
- "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff"
- "2001:0db8:1234:0000:0000:0000:0000:0000"
- "2001:db8:a::123"
- "fc00::"
- "::ffff:0:0"
- "2001::"
- "2001:10::"
- "2001:db8::"
- "2001:0000:1234:0000:0000:C1C0:ABCD:0876"
- "3ffe:0b00:0000:0000:0001:0000:0000:000a"
- "FF02:0000:0000:0000:0000:0000:0000:0001"
- "0000:0000:0000:0000:0000:0000:0000:0001"
- "0000:0000:0000:0000:0000:0000:0000:0000"
- "::ffff:192.168.1.26"
- "2::10"
- "ff02::1"
- "fe80::"
- "2002::"
- "2001:db8::"
- "2001:0db8:1234::"
- "::ffff:0:0"
- "::1"
- "::ffff:192.168.1.1"
- "1:2:3:4:5:6:7:8"
- "1:2:3:4:5:6::8"
- "1:2:3:4:5::8"
- "1:2:3:4::8"
- "1:2:3::8"
- "1:2::8"
- "1::8"
- "1::2:3:4:5:6:7"
- "1::2:3:4:5:6"
- "1::2:3:4:5"
- "1::2:3:4"
- "1::2:3"
- "1::8"
- "::2:3:4:5:6:7:8"
- "::2:3:4:5:6:7"
- "::2:3:4:5:6"
- "::2:3:4:5"
- "::2:3:4"
- "::2:3"
- "::8"
- "1:2:3:4:5:6::"
- "1:2:3:4:5::"
- "1:2:3:4::"
- "1:2:3::"
- "1:2::"
- "1::"
- "1:2:3:4:5::7:8"
- "2001:0000:1234:0000:0000:C1C0:ABCD:0876"
- "1:2:3:4::7:8"
- "1:2:3::7:8"
- "1:2::7:8"
- "1::7:8"
- "1:2:3:4:5:6:1.2.3.4"
- "1:2:3:4:5::1.2.3.4"
- "1:2:3:4::1.2.3.4"
- "1:2:3::1.2.3.4"
- "1:2::1.2.3.4"
- "1::1.2.3.4"
- "1:2:3:4::5:1.2.3.4"
- "1:2:3::5:1.2.3.4"
- "1:2::5:1.2.3.4"
- "1::5:1.2.3.4"
- "1::5:11.22.33.44"
- "fe80::217:f2ff:254.7.237.98"
- "fe80::217:f2ff:fe07:ed62"
- "2001:DB8:0:0:8:800:200C:417A" # unicast, full
- "FF01:0:0:0:0:0:0:101" # multicast, full
- "0:0:0:0:0:0:0:1" # loopback, full
- "0:0:0:0:0:0:0:0" # unspecified, full
- "2001:DB8::8:800:200C:417A" # unicast, compressed
- "FF01::101" # multicast, compressed
- "::1" # loopback, compressed, non-routable
- "0:0:0:0:0:0:13.1.68.3" # IPv4-compatible IPv6 address, full, deprecated
- "0:0:0:0:0:FFFF:129.144.52.38" # IPv4-mapped IPv6 address, full
- "::13.1.68.3" # IPv4-compatible IPv6 address, compressed, deprecated
- "::FFFF:129.144.52.38" # IPv4-mapped IPv6 address, compressed
- "fe80:0000:0000:0000:0204:61ff:fe9d:f156"
- "fe80:0:0:0:204:61ff:fe9d:f156"
- "fe80::204:61ff:fe9d:f156"
- "fe80:0:0:0:204:61ff:254.157.241.86"
- "fe80::204:61ff:254.157.241.86"
- "fe80::"
- "fe80::1"
- "0000:0000:0000:0000:0000:0000:0000:0001"
- "::1"
- "::ffff:192.0.2.128"
- "::ffff:c000:280"
- "::"
BAD:
- "127.0.0.1"
- ":"
- "2001:0000:1234:0000:0000:C1C0:ABCD:0876 0"
- "2001:0000:1234: 0000:0000:C1C0:ABCD:0876"
- "02001:0000:1234:0000:0000:C1C0:ABCD:0876" # extra 0 not allowed!
- "2001:0000:1234:0000:00001:C1C0:ABCD:0876" # extra 0 not allowed!
- "3ffe:0b00:0000:0001:0000:0000:000a"
- "FF02:0000:0000:0000:0000:0000:0000:0000:0001"
- "3ffe:b00::1::a"
- "::1111:2222:3333:4444:5555:6666::"
- "1:2:3::4:5::7:8"
- "12345::6:7:8"
- "1::5:400.2.3.4"
- "1::5:260.2.3.4"
- "1::5:256.2.3.4"
- "1::5:1.256.3.4"
- "1::5:1.2.256.4"
- "1::5:1.2.3.256"
- "1::5:300.2.3.4"
- "1::5:1.300.3.4"
- "1::5:1.2.300.4"
- "1::5:1.2.3.300"
- "1::5:900.2.3.4"
- "1::5:1.900.3.4"
- "1::5:1.2.900.4"
- "1::5:1.2.3.900"
- "1::5:300.300.300.300"
- "1::5:3000.30.30.30"
- "1::400.2.3.4"
- "1::260.2.3.4"
- "1::256.2.3.4"
- "1::1.256.3.4"
- "1::1.2.256.4"
- "1::1.2.3.256"
- "1::300.2.3.4"
- "1::1.300.3.4"
- "1::1.2.300.4"
- "1::1.2.3.300"
- "1::900.2.3.4"
- "1::1.900.3.4"
- "1::1.2.900.4"
- "1::1.2.3.900"
- "1::300.300.300.300"
- "1::3000.30.30.30"
- "::400.2.3.4"
- "::260.2.3.4"
- "::256.2.3.4"
- "::1.256.3.4"
- "::1.2.256.4"
- "::1.2.3.256"
- "::300.2.3.4"
- "::1.300.3.4"
- "::1.2.300.4"
- "::1.2.3.300"
- "::900.2.3.4"
- "::1.900.3.4"
- "::1.2.900.4"
- "::1.2.3.900"
- "::300.300.300.300"
- "::3000.30.30.30"
- "2001:DB8:0:0:8:800:200C:417A:221" # unicast, full
- "FF01::101::2" # multicast, compressed
- "1111:2222:3333:4444::5555:"
- "1111:2222:3333::5555:"
- "1111:2222::5555:"
- "1111::5555:"
- "::5555:"
- ":::"
- "1111:"
- ":"
- ":1111:2222:3333:4444::5555"
- ":1111:2222:3333::5555"
- ":1111:2222::5555"
- ":1111::5555"
- ":::5555"
- ":::"
- "1.2.3.4:1111:2222:3333:4444::5555"
- "1.2.3.4:1111:2222:3333::5555"
- "1.2.3.4:1111:2222::5555"
- "1.2.3.4:1111::5555"
- "1.2.3.4::5555"
- "1.2.3.4::"
- "123"
- "ldkfj"
- "2001::FFD3::57ab"
- "2001:db8:85a3::8a2e:37023:7334"
- "2001:db8:85a3::8a2e:370k:7334"
- "1:2:3:4:5:6:7:8:9"
- "1::2::3"
- "1:::3:4:5"
- "1:2:3::4:5:6:7:8:9"
- "::ffff:2.3.4"
- "::ffff:257.1.2.3"
- "1.2.3.4"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment