Fix a potential bug with https ip fetching and enforce IPV6 support

This commit is contained in:
anthonyraymond 2017-08-09 22:57:30 +02:00
parent 9086bee610
commit 98aa521195
3 changed files with 51 additions and 46 deletions

View file

@ -21,6 +21,20 @@ Ask for it in GitHub issues or mail <a href="mailto:joal.contact@gmail.com">joal
[support-no]:readme-assets/cross-mark.png
[support-yes]:readme-assets/check-mark.png
# How to start
With UI :
`java -Djava.net.preferIPv6Addresses=true -jar .\jack-of-all-trades-2.0.0.jar --joal-conf="PATH_TO_CONF" --spring.main.web-environment=true --server.port=YOUR_PORT --joal.ui.path.prefix="SECRET_OBFUSCATION_PATH" --joal.ui.secret-token="SECRET_TOKEN"`
Without UI:
`java -Djava.net.preferIPv6Addresses=true -jar .\jack-of-all-trades-2.0.0.jar --joal-conf="PATH_TO_CONF" --spring.main.web-environment=false`
# Prepare configuration folder
You first need to get the configuration folder. Replace `<MY_CONFIG_FOLDER_PATH>` by whatever path you want.
```

View file

@ -1,18 +1,20 @@
package org.araymond.joal.core.ttorent.client;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.nio.channels.ServerSocketChannel;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
/**
@ -28,6 +30,14 @@ public class ConnectionHandler {
private ServerSocketChannel channel;
private InetAddress ipAddress;
private Thread ipFetcherThread;
private static final String[] IP_PROVIDERS = new String[] {
"http://ip.tyk.nu/",
"http://l2.io/ip",
"http://ident.me/",
"http://icanhazip.com/",
"http://bot.whatismyipaddress.com/",
"https://tnx.nl/ip"
};
public ConnectionHandler() {
@ -62,22 +72,31 @@ public class ConnectionHandler {
}
@VisibleForTesting
Optional<InetAddress> getWtfIsMyIp() {
final String ip;
try {
final URL url = new URL("https://wtfismyip.com/json");
Optional<InetAddress> tryToFetchFromProviders() {
final List<String> shuffledList = Lists.newArrayList(IP_PROVIDERS);
Collections.shuffle(shuffledList);
ip = new ObjectMapper().readValue(url, FuckingIpAddressPayload.class).getYourFuckingIPAddress();
return Optional.of(InetAddress.getByName(ip));
} catch (final IOException e) {
logger.warn("Failed to fetch Ip", e);
return Optional.empty();
for (final String ipProvider : shuffledList) {
final String ip;
try {
logger.info("Fetching ip from: " + ipProvider);
final URL url = new URL(ipProvider);
final BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
ip = in.readLine();
return Optional.of(InetAddress.getByName(ip));
} catch (final IOException e) {
logger.warn("Failed to fetch Ip from \"" + ipProvider + "\"", e);
}
}
return Optional.empty();
}
@VisibleForTesting
InetAddress fetchIp() throws UnknownHostException {
final Optional<InetAddress> ip = this.getWtfIsMyIp();
final Optional<InetAddress> ip = this.tryToFetchFromProviders();
if (ip.isPresent()) {
logger.info("Successfully fetch public IP address: {}", ip.get().getHostAddress());
return ip.get();
@ -133,32 +152,4 @@ public class ConnectionHandler {
logger.debug("ConnectionHandler closed.");
}
@SuppressWarnings("unused")
private static final class FuckingIpAddressPayload {
private final String yourFuckingIPAddress;
private final String yourFuckingLocation;
private final String yourFuckingHostname;
private final String yourFuckingISP;
private final String yourFuckingTorExit;
@JsonCreator
private FuckingIpAddressPayload(
@JsonProperty(value = "YourFuckingIPAddress", required = true) final String yourFuckingIPAddress,
@JsonProperty("YourFuckingLocation") final String yourFuckingLocation,
@JsonProperty("YourFuckingHostname") final String yourFuckingHostname,
@JsonProperty("YourFuckingISP") final String yourFuckingISP,
@JsonProperty("YourFuckingTorExit") final String yourFuckingTorExit) {
this.yourFuckingIPAddress = yourFuckingIPAddress;
this.yourFuckingLocation = yourFuckingLocation;
this.yourFuckingHostname = yourFuckingHostname;
this.yourFuckingISP = yourFuckingISP;
this.yourFuckingTorExit = yourFuckingTorExit;
}
public String getYourFuckingIPAddress() {
return yourFuckingIPAddress;
}
}
}

View file

@ -29,7 +29,7 @@ public class ConnectionHandlerTest {
final ServerSocketChannel channel = createMockedServerSocketChannel(49152);
final ConnectionHandler handler = Mockito.spy(new ConnectionHandler());
Mockito.doReturn(Optional.empty()).when(handler).getWtfIsMyIp();
Mockito.doReturn(Optional.empty()).when(handler).tryToFetchFromProviders();
Mockito.doReturn(channel).when(handler).bindToPort();
handler.init();
@ -44,11 +44,11 @@ public class ConnectionHandlerTest {
Mockito.doReturn(channel).when(handler).bindToPort();
// emulate successful call
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).getWtfIsMyIp();
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).tryToFetchFromProviders();
handler.init();
// emulate failed call
Mockito.doReturn(Optional.empty()).when(handler).getWtfIsMyIp();
Mockito.doReturn(Optional.empty()).when(handler).tryToFetchFromProviders();
handler.fetchIp();
assertThat(handler.getIpAddress().getHostAddress()).isEqualTo("168.168.168.168");
@ -59,7 +59,7 @@ public class ConnectionHandlerTest {
final ServerSocketChannel channel = createMockedServerSocketChannel(49152);
final ConnectionHandler handler = Mockito.spy(new ConnectionHandler());
Mockito.doReturn(channel).when(handler).bindToPort();
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).getWtfIsMyIp();
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).tryToFetchFromProviders();
handler.init();
@ -71,7 +71,7 @@ public class ConnectionHandlerTest {
final ServerSocketChannel channel = createMockedServerSocketChannel(65534);
final ConnectionHandler handler = Mockito.spy(new ConnectionHandler());
Mockito.doReturn(channel).when(handler).bindToPort();
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).getWtfIsMyIp();
Mockito.doReturn(Optional.of(InetAddress.getByName("168.168.168.168"))).when(handler).tryToFetchFromProviders();
handler.init();