package org.limewire.io; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.Arrays; import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton class NetworkInstanceUtilsImpl implements NetworkInstanceUtils { private final LocalSocketAddressProvider localSocketAddressProvider; private final IpPortForSelf ipPortForSelf; @Inject NetworkInstanceUtilsImpl(LocalSocketAddressProvider localSocketAddressProvider, IpPortForSelf ipPortForSelf) { this.localSocketAddressProvider = localSocketAddressProvider; this.ipPortForSelf = ipPortForSelf; } public boolean isMe(String host, int port) { try { return isMe(InetAddress.getByName(host).getAddress(), port); } catch (UnknownHostException e) { return false; } } public boolean isMe(byte[] address, int port) { //Don't allow connections to yourself. We have to special //case connections to "127.*.*.*" since //they are aliases this machine. if (NetworkUtils.isLoopbackAddress(address)) { return port == localSocketAddressProvider.getLocalPort(); } else { byte[] local = localSocketAddressProvider.getLocalAddress(); return port == localSocketAddressProvider.getLocalPort() && Arrays.equals(address, local); } } public boolean isMe(IpPort me) { if (me == ipPortForSelf) return true; return isMe(me.getInetAddress().getAddress(), me.getPort()); } public boolean isVeryCloseIP(byte[] addr0, byte[] addr1) { // if 0 is not a private address but 1 is, then the next // check will fail anyway, so this is okay. if (!isPrivateAddress(addr0) ) { return false; } else { return NetworkUtils.isVeryCloseIP(addr0, addr1); } } public boolean isVeryCloseIP(InetAddress addr) { return isVeryCloseIP(addr.getAddress()); } public boolean isVeryCloseIP(byte[] addr) { return isVeryCloseIP(localSocketAddressProvider.getLocalAddress(), addr); } public boolean isPrivate() { return isPrivateAddress(localSocketAddressProvider.getLocalAddress()); } public boolean isPrivateAddress(InetAddress address) { if(!localSocketAddressProvider.isLocalAddressPrivate()) { return false; } else { return NetworkUtils.isPrivateAddress(address); } } public boolean isPrivateAddress(byte[] address) { if(!localSocketAddressProvider.isLocalAddressPrivate()) { return false; } else { return NetworkUtils.isPrivateAddress(address); } } public boolean isPrivateAddress(String address) { try { return isPrivateAddress(InetAddress.getByName(address)); } catch(UnknownHostException uhe) { return true; } } public boolean isPrivateAddress(SocketAddress address) { return isPrivateAddress(((InetSocketAddress)address).getAddress()); } public boolean isValidExternalIpPort(IpPort addr) { return NetworkUtils.isValidExternalIpPort(addr) && !isPrivateAddress(addr.getInetAddress()); } }