diff options
author | Nathan Hoad <nathan@getoffmalawn.com> | 2015-03-07 12:37:52 +1100 |
---|---|---|
committer | Nathan Hoad <nathan@getoffmalawn.com> | 2015-03-07 12:37:52 +1100 |
commit | 5978625c12c705a23ea4d2975162f55b160074ea (patch) | |
tree | c3cfc0184a564b297606187379e174c1f0a8bd57 | |
parent | d27f40d9b1cb2436f435e40cf952dbd19ed6d463 (diff) | |
download | Nim-5978625c12c705a23ea4d2975162f55b160074ea.tar.gz |
Make IP address checking more obvious, and add tests for the net module.
-rw-r--r-- | lib/pure/net.nim | 16 | ||||
-rw-r--r-- | tests/stdlib/tnet.nim | 47 |
2 files changed, 60 insertions, 3 deletions
diff --git a/lib/pure/net.nim b/lib/pure/net.nim index f7fcea06d..5361994f8 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -95,6 +95,7 @@ type address_v4*: array[0..3, uint8] ## Contains the IP address in bytes in ## case of IPv4 +proc isIpAddress*(address_str: string): bool proc parseIpAddress*(address_str: string): TIpAddress proc isDisconnectionError*(flags: set[SocketFlag], @@ -527,9 +528,8 @@ proc connect*(socket: Socket, address: string, port = Port(0), when defined(ssl): if socket.isSSL: - try: - discard parseIpAddress(address) - except ValueError: + # RFC3546 for SNI specifies that IP addresses are not allowed. + if not isIpAddress(address): # Discard result in case OpenSSL version doesn't support SNI, or we're # not using TLSv1+ discard SSL_set_tlsext_host_name(socket.sslHandle, address) @@ -1259,3 +1259,13 @@ proc parseIpAddress*(address_str: string): TIpAddress = return parseIPv6Address(address_str) else: return parseIPv4Address(address_str) + + +proc isIpAddress*(address_str: string): bool = + ## Checks if a string is an IP address + ## Returns true if it is, false otherwise + try: + discard parseIpAddress(address_str) + except ValueError: + return false + return true diff --git a/tests/stdlib/tnet.nim b/tests/stdlib/tnet.nim new file mode 100644 index 000000000..e8ada05e7 --- /dev/null +++ b/tests/stdlib/tnet.nim @@ -0,0 +1,47 @@ +import net +import unittest + +suite "isIpAddress tests": + test "127.0.0.1 is valid": + check isIpAddress("127.0.0.1") == true + + test "ipv6 localhost is valid": + check isIpAddress("::1") == true + + test "fqdn is not an ip address": + check isIpAddress("example.com") == false + + test "random string is not an ipaddress": + check isIpAddress("foo bar") == false + + test "5127.0.0.1 is invalid": + check isIpAddress("5127.0.0.1") == false + + test "ipv6 is valid": + check isIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652") == true + + test "invalid ipv6": + check isIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652") == false + + +suite "parseIpAddress tests": + test "127.0.0.1 is valid": + discard parseIpAddress("127.0.0.1") + + test "ipv6 localhost is valid": + discard parseIpAddress("::1") + + test "fqdn is not an ip address": + expect(ValueError): + discard parseIpAddress("example.com") + + test "random string is not an ipaddress": + expect(ValueError): + discard parseIpAddress("foo bar") + + test "ipv6 is valid": + discard parseIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652") + + test "invalid ipv6": + expect(ValueError): + discard parseIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652") |