From e89f8b1acdbee55a54faf8b5ed8aa8211d51cb14 Mon Sep 17 00:00:00 2001 From: David Kerr Date: Sun, 28 Jun 2020 22:50:17 -0400 Subject: [PATCH] Add GUI/ULA/LLA address groupings --- t/is-and-extract-ipv6.pl | 89 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/t/is-and-extract-ipv6.pl b/t/is-and-extract-ipv6.pl index bb33bc9..da1b462 100644 --- a/t/is-and-extract-ipv6.pl +++ b/t/is-and-extract-ipv6.pl @@ -5,6 +5,50 @@ SKIP: { eval { require Test::Warnings; } or skip($@, 1); } eval { require 'ddclient'; } or BAIL_OUT($@); +# Note, for GUA addresses we use 2001:DB8::/32 as that is reserved for +# documentation per RFC 3849 and so not routable on public internet. +# But we do have to add some others starting in 3xxx:: because they +# are also valid GUA. +my @valid_ipv6_gua = ( + "2000::", + "2001:DB8:4341:0781:1111:2222:3333:4444", + "2001:DB8:4341:0781::4444", + "2001:DB8:4341:0781:1111::", + "2001:DB8:4341:0781::100", + "2001:DB8:4341:0781::1", + "2001:DB8:4341:0781::0001", + "2fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "3000::", + "3001:DB8:4341:0781:1111:2222:3333:4444", + "3001:DB8:4341:0781::4444", + "3001:DB8:4341:0781:1111::", + "3001:DB8:4341:0781::100", + "3001:DB8:4341:0781::1", + "3001:DB8:4341:0781::0001", + "3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", +); + +# For ULA addresses we randomly generated a /48 prefix per RFC 4193 +# and are using subnet ID of 1 because why not. +my @valid_ipv6_ula = ( + "fd00::", + "fdb6:1d86:d9bd:1:1111:2222:3333:4444", + "fdb6:1d86:d9bd:1::4444", + "fdb6:1d86:d9bd:1:1111::", + "fdb6:1d86:d9bd:1::100", + "fdb6:1d86:d9bd:1::1", + "fdb6:1d86:d9bd:1::0001", + "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", +); + +my @valid_ipv6_lla = ( + "fe80::", + "fe80::1111:2222:3333:4444", + "fe80::4444", + "fe80::1111", + "febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff", +); + my @valid_ipv6 = ( "::abcd:efAB:CDEF", # case sensitivity "08:09:0a:0b:0c:0d:0e:0f", # leading zeros @@ -47,7 +91,10 @@ my @valid_ipv6 = ( "1111::3333:4444:5555:6666:7777:8888", "::3333:4444:5555:6666:7777:8888", "::2222:3333:4444:5555:6666:7777:8888", - # IPv4-mapped IPv6 addresses +); + +my @valid_mixed_ipv6_non_gua = ( + # with thanks to http://home.deds.nl/~aeron/regex/valid_ipv6.txt "1111:2222:3333:4444:5555:6666:0.0.0.0", "1111:2222:3333:4444:5555:6666:00.00.00.00", "1111:2222:3333:4444:5555:6666:000.000.000.000", @@ -75,6 +122,25 @@ my @valid_ipv6 = ( "::2222:3333:4444:5555:6666:123.123.123.123", ); +my @valid_mixed_ipv6_gua = ( + "2111:2222:3333:4444:5555:6666:123.123.123.123", + "2111:2222:3333:4444:5555::123.123.123.123", + "2111:2222:3333:4444::123.123.123.123", + "2111:2222:3333::123.123.123.123", + "2111:2222::123.123.123.123", + "2111::123.123.123.123", + "2111:2222:3333:4444::6666:123.123.123.123", + "2111:2222:3333::6666:123.123.123.123", + "2111:2222::6666:123.123.123.123", + "2111::6666:123.123.123.123", + "2111:2222:3333::5555:6666:123.123.123.123", + "2111:2222::5555:6666:123.123.123.123", + "2111::5555:6666:123.123.123.123", + "2111:2222::4444:5555:6666:123.123.123.123", + "2111::4444:5555:6666:123.123.123.123", + "2111::3333:4444:5555:6666:123.123.123.123", +); + my @invalid_ipv6 = ( # Empty string and bogus text undef, @@ -361,6 +427,21 @@ my @invalid_ipv6 = ( "::2222:3333:4444:5555:6666:7777:8888:", ); +my @all_valid_ipv6 = ( + @valid_ipv6_gua, + @valid_ipv6_ula, + @valid_ipv6_lla, + @valid_ipv6, + @valid_mixed_ipv6_non_gua, + @valid_mixed_ipv6_gua +); + +my @short_valid_ipv6 = ( + @valid_ipv6_gua, + @valid_ipv6_ula, + @valid_ipv6_lla, +); + my @if_samples = ( # Sample output from: # ip -6 -o addr show dev scope global @@ -417,7 +498,7 @@ EOF subtest "is_ipv6() with valid addresses" => sub { - foreach my $ip (@valid_ipv6) { + foreach my $ip (@all_valid_ipv6) { ok(ddclient::is_ipv6($ip), "is_ipv6('$ip')"); } }; @@ -431,7 +512,7 @@ subtest "is_ipv6() with invalid addresses" => sub { subtest "is_ipv6() with char adjacent to valid address" => sub { foreach my $ch (split(//, '/.,:z @$#&%!^*()_-+'), "\n") { subtest perlstring($ch) => sub { - foreach my $ip (@valid_ipv6) { + foreach my $ip (@short_valid_ipv6) { subtest $ip => sub { my $test = $ch . $ip; # insert at front ok(!ddclient::is_ipv6($test), "!is_ipv6('$test')"); @@ -465,7 +546,7 @@ subtest "extract_ipv6() of valid addr with adjacent non-word char" => sub { foreach my $wb (split(//, '/, @$#&%!^*()_-+'), "\n") { subtest perlstring($wb) => sub { my $test = ""; - foreach my $ip (@valid_ipv6) { + foreach my $ip (@short_valid_ipv6) { $test = "foo" . $wb . $ip . $wb . "bar"; # wrap front and end $ip =~ s/\b0+\B//g; ## remove embedded leading zeros for testing is(ddclient::extract_ipv6($test), $ip, perlstring($test));