From 28f1ba5760370ad901fd37fdbf4d706e949317d8 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Mon, 16 Dec 2019 16:27:06 -0500 Subject: [PATCH] better localhost detection --- .../cobbzilla/util/network/NetworkUtil.java | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cobbzilla/util/network/NetworkUtil.java b/src/main/java/org/cobbzilla/util/network/NetworkUtil.java index be46e6c..73a7352 100644 --- a/src/main/java/org/cobbzilla/util/network/NetworkUtil.java +++ b/src/main/java/org/cobbzilla/util/network/NetworkUtil.java @@ -1,16 +1,20 @@ package org.cobbzilla.util.network; import com.sun.jna.Platform; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import static org.cobbzilla.util.daemon.ZillaRuntime.die; import static org.cobbzilla.util.daemon.ZillaRuntime.empty; +import static org.cobbzilla.util.http.HttpUtil.url2string; import static org.cobbzilla.util.string.ValidationRegexes.IPv4_PATTERN; @Slf4j @@ -27,14 +31,23 @@ public class NetworkUtil { return false; } + private static final Map localhostCache = new ConcurrentHashMap<>(); + public static boolean isLocalHost(String host) { + return localhostCache.computeIfAbsent(host, NetworkUtil::determineLocalHost); + } + + private static Boolean determineLocalHost(String host) { if (isLocalIpv4(host)) return true; + String hostAddress = null; try { - return isLocalIpv4(InetAddress.getByName(host).getHostAddress()); + hostAddress = InetAddress.getByName(host).getHostAddress(); + if (isLocalIpv4(hostAddress)) return true; } catch (Exception e) { log.warn("isLocalHost("+host+"): "+e); - return false; } + final String ex = getExternalIp(); + return ex != null && ex.equals(hostAddress != null ? hostAddress : host); } public static boolean isPublicIpv4(String addr) { @@ -127,6 +140,23 @@ public class NetworkUtil { } } + public static Set configuredIpsAndExternalIp() { + final Set ips = configuredIps(); + final String externalIp = getExternalIp(); + if (externalIp != null) ips.add(externalIp); + return ips; + } + + @Getter(lazy=true) private static final String externalIp = initExternalIp(); + private static String initExternalIp() { + try { + return url2string("http://checkip.amazonaws.com/").trim(); + } catch (Exception e) { + log.warn("initExternalIp: returning null due to: "+e); + return null; + } + } + public static String getFirstPublicIpv4() { try { final Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); @@ -140,7 +170,7 @@ public class NetworkUtil { } } } - log.warn("getFirstPublicIpv4: no public IPv4 address found"); + log.debug("getFirstPublicIpv4: no public IPv4 address found"); return null; } catch (Exception e) {