mirror of
https://github.com/anthonyraymond/joal.git
synced 2024-09-20 07:16:26 +08:00
Fix a potential bug with https ip fetching and enforce IPV6 support
This commit is contained in:
parent
9086bee610
commit
98aa521195
14
README.md
14
README.md
|
@ -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.
|
||||
```
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue