Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ Changes in 3.9.3:
- Bundle Java 21 with Windows and Mac builds
- Updated SWT for all platforms, improved loading of correct SWT library on Linux
- Add support for plugin jars containing their own messages.properties
- Recognition of FQDNs (with trailing dots and numbers in TLDs) in IP list files
- Recognition of IPv6 addresses in IP list files
- The UDP pinger now uses the same port as traceroute programs.
- Switch from the legacy Date API to Java's new Time API
- Time is now specified in 24-hour format in XML export
Expand Down
3 changes: 1 addition & 2 deletions src/net/azib/ipscan/util/InetAddressUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
public class InetAddressUtils {
static final Logger LOG = LoggerFactory.getLogger();

// Warning! IPv4 specific code
public static final Pattern HOSTNAME_REGEX = Pattern.compile("\\b((([a-z]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\\.)+([a-z]{2,})|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\b", CASE_INSENSITIVE);
public static final Pattern HOSTNAME_REGEX = Pattern.compile("(\\b(((?!25?[6-9])[12]\\d|[1-9])?\\d\\.?\\b){4}\\b)|(?<!(\\w|:))(([0-9a-f]{1,4}:){7,7}[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-f]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?!(\\w|:))|(\\b(([a-z]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\\.)+([a-z0-9]{2,})\\.?(?!(\\w|\\.)))", CASE_INSENSITIVE);

public static InetAddress startRangeByNetmask(InetAddress address, InetAddress netmask) {
byte[] addressBytes = address.getAddress();
Expand Down
28 changes: 27 additions & 1 deletion test/net/azib/ipscan/util/InetAddressUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,45 @@ public class InetAddressUtilsTest {
public void hostnameMatching() throws Exception {
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("127.0.0.1").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("192.168.245.345").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("255.255.255.255").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("0.0.0.0").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("8.8.8.8").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("::").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("::1").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("fe80::1234").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("fe80:1234::").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("::fe80:1234").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("::fe80").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("fe80::").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("::fe80").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("2001:db8::").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("2001:db8::1").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("8.8.8.8").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("a.bc").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("angryip.org").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("www.example.com").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("example.com.").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("example.dn42.").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("example.dn42").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("beta.wiki.dn42").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("A.B.CD").matches());
assertTrue(InetAddressUtils.HOSTNAME_REGEX.matcher("me.local").matches());

assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("3.5").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("3.5.1").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("127.0.0.256").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("256.256.255.1").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("a.b").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("abc").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("123").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("Hello world.").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("fe80:").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher(":fe80").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("2001:db8").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("2001:db8:").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher(":2001:db8:").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher(":2001:db8").matches());
assertFalse(InetAddressUtils.HOSTNAME_REGEX.matcher("fe80::g").matches());
}

@Test
Expand All @@ -49,7 +75,7 @@ public void findHostnames() throws Exception {
assertTrue(matcher.find());
assertEquals("angryip.org", matcher.group());
assertTrue(matcher.find());
assertEquals("www.angryziber.com", matcher.group());
assertEquals("www.angryziber.com.", matcher.group());
assertFalse(matcher.find());
}

Expand Down
Loading