From 6f54f881f5c17dad1f024cfd0819ec976dbcf845 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 20 Aug 2020 17:33:34 +0200 Subject: [PATCH] Fixed bit masking for network range checks (this affected isPrivate). Added unit tests --- src/dorkbox/netUtil/IPv4.kt | 17 +++++++---------- test/dorkbox/netUtil/NetUtilTest.kt | 8 ++++++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/dorkbox/netUtil/IPv4.kt b/src/dorkbox/netUtil/IPv4.kt index a84ff5e..7d108d7 100644 --- a/src/dorkbox/netUtil/IPv4.kt +++ b/src/dorkbox/netUtil/IPv4.kt @@ -581,10 +581,6 @@ object IPv4 { return pairs } - - /* Mask to convert unsigned int to a long (i.e. keep 32 bits) */ - private const val UNSIGNED_INT_MASK = 0x0FFFFFFFFL - /** * Check if the IP address is in the range of a specific IP/CIDR * @@ -596,6 +592,7 @@ object IPv4 { * * @return true if it is in range */ + @ExperimentalUnsignedTypes fun isInRange(address: Int, networkAddress: Int, networkPrefix: Int): Boolean { // System.err.println(" ip: " + IP.toString(address)); // System.err.println(" networkAddress: " + IP.toString(networkAddress)); @@ -607,15 +604,15 @@ object IPv4 { val netmask = ((1 shl 32 - networkPrefix) - 1).inv() // Calculate base network address - val network = (networkAddress and netmask and UNSIGNED_INT_MASK.toInt()).toLong() - // System.err.println(" network " + IP.toString(network)); + val network = (networkAddress and netmask).toUInt() +// System.err.println(" network " + IPv4.toString(network.toInt())) // Calculate broadcast address - val broadcast = network or netmask.inv().toLong() and UNSIGNED_INT_MASK - // System.err.println(" broadcast " + IP.toString(broadcast)); + val broadcast = network or netmask.inv().toUInt() +// System.err.println(" broadcast " + IPv4.toString(broadcast.toInt())) - val addressLong = (address and UNSIGNED_INT_MASK.toInt()).toLong() - return addressLong in network..broadcast +// val addressLong = (address.toLong() and UNSIGNED_INT_MASK) + return address.toUInt() in network..broadcast } diff --git a/test/dorkbox/netUtil/NetUtilTest.kt b/test/dorkbox/netUtil/NetUtilTest.kt index 1110fe4..f1a3fc3 100644 --- a/test/dorkbox/netUtil/NetUtilTest.kt +++ b/test/dorkbox/netUtil/NetUtilTest.kt @@ -745,6 +745,14 @@ class NetUtilTest { } } + @Test + fun testIsPrivate() { + assertTrue(IPv4.isPrivate("192.168.23.102")) + assertTrue(IPv4.isPrivate("10.10.234.102")) + assertTrue(IPv4.isPrivate("172.16.45.13")) + assertFalse(IPv4.isPrivate("72.66.83.240")) + } + @Test fun testIp4Range() { assertTrue("", IPv4.isInRange(IPv4.toInt("10.10.10.5"), IPv4.toInt("10.10.10.10"), 24))