mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2025-01-19 08:36:27 +01:00
refactor for socks
This commit is contained in:
parent
58e455142a
commit
2bbdcfaf28
@ -26,11 +26,13 @@ public class NormalProxyProvider extends ProxyProvider {
|
|||||||
private volatile List<HProxy> potentialProxies = new ArrayList<>();
|
private volatile List<HProxy> potentialProxies = new ArrayList<>();
|
||||||
private volatile HProxy proxy = null;
|
private volatile HProxy proxy = null;
|
||||||
|
|
||||||
|
private boolean useSocks;
|
||||||
|
|
||||||
|
|
||||||
public NormalProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, List<String> potentialHosts) {
|
public NormalProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, List<String> potentialHosts, boolean useSocks) {
|
||||||
super(proxySetter, stateSetter, hConnection);
|
super(proxySetter, stateSetter, hConnection);
|
||||||
this.potentialHosts = potentialHosts;
|
this.potentialHosts = potentialHosts;
|
||||||
|
this.useSocks = useSocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -107,9 +109,29 @@ public class NormalProxyProvider extends ProxyProvider {
|
|||||||
|
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
Socket server = new Socket(proxy.getActual_domain(), proxy.getActual_port());
|
Socket server;
|
||||||
|
if (!useSocks) {
|
||||||
|
server = new Socket(proxy.getActual_domain(), proxy.getActual_port());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SocksConfiguration configuration = ProxyProviderFactory.getSocksConfig();
|
||||||
|
if (configuration == null) {
|
||||||
|
showInvalidConnectionError();
|
||||||
|
abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
server = configuration.createSocket();
|
||||||
|
server.connect(new InetSocketAddress(proxy.getActual_domain(), proxy.getActual_port()), 1200);
|
||||||
|
}
|
||||||
|
|
||||||
startProxyThread(client, server, proxy);
|
startProxyThread(client, server, proxy);
|
||||||
} catch (InterruptedException | IOException e) {
|
} catch (SocketException | SocketTimeoutException e) {
|
||||||
|
// should only happen when SOCKS configured badly
|
||||||
|
showInvalidConnectionError();
|
||||||
|
abort();
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
catch (InterruptedException | IOException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,10 @@ import gearth.protocol.memory.Rc4Obtainer;
|
|||||||
import gearth.protocol.packethandler.IncomingPacketHandler;
|
import gearth.protocol.packethandler.IncomingPacketHandler;
|
||||||
import gearth.protocol.packethandler.OutgoingPacketHandler;
|
import gearth.protocol.packethandler.OutgoingPacketHandler;
|
||||||
import gearth.protocol.packethandler.PacketHandler;
|
import gearth.protocol.packethandler.PacketHandler;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.scene.control.Alert;
|
||||||
|
import javafx.scene.control.ButtonType;
|
||||||
|
import javafx.scene.layout.Region;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
@ -113,5 +117,13 @@ public abstract class ProxyProvider {
|
|||||||
stateSetter.setState(HState.NOT_CONNECTED);
|
stateSetter.setState(HState.NOT_CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void showInvalidConnectionError() {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
Alert alert = new Alert(Alert.AlertType.ERROR, "You entered invalid connection information, G-Earth could not connect", ButtonType.OK);
|
||||||
|
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
|
||||||
|
alert.setResizable(false);
|
||||||
|
alert.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,7 @@ import gearth.protocol.HConnection;
|
|||||||
import gearth.protocol.connection.HProxySetter;
|
import gearth.protocol.connection.HProxySetter;
|
||||||
import gearth.protocol.connection.HStateSetter;
|
import gearth.protocol.connection.HStateSetter;
|
||||||
import gearth.protocol.connection.proxy.unix.LinuxRawIpProxyProvider;
|
import gearth.protocol.connection.proxy.unix.LinuxRawIpProxyProvider;
|
||||||
import gearth.protocol.connection.proxy.unix.LinuxRawIpSocksProxyProvider;
|
|
||||||
import gearth.protocol.connection.proxy.windows.WindowsRawIpProxyProvider;
|
import gearth.protocol.connection.proxy.windows.WindowsRawIpProxyProvider;
|
||||||
import gearth.protocol.connection.proxy.windows.WindowsRawIpSocksProxyProvider;
|
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.scene.control.Alert;
|
import javafx.scene.control.Alert;
|
||||||
import javafx.scene.control.ButtonType;
|
import javafx.scene.control.ButtonType;
|
||||||
@ -95,11 +93,11 @@ public class ProxyProviderFactory {
|
|||||||
if (hostIsIpAddress(domain)) {
|
if (hostIsIpAddress(domain)) {
|
||||||
if (OSValidator.isWindows()) {
|
if (OSValidator.isWindows()) {
|
||||||
if (WindowsRawIpProxyProvider.isNoneConnected(domain) &&
|
if (WindowsRawIpProxyProvider.isNoneConnected(domain) &&
|
||||||
(!socksConfig.useSocks() || socksConfig.dontUseFirstTime()) ) {
|
(!socksConfig.useSocks() || socksConfig.onlyUseIfNeeded()) ) {
|
||||||
return new WindowsRawIpProxyProvider(proxySetter, stateSetter, hConnection, domain, port);
|
return new WindowsRawIpProxyProvider(proxySetter, stateSetter, hConnection, domain, port, false);
|
||||||
}
|
}
|
||||||
else if (socksConfig.useSocks()) {
|
else if (socksConfig.useSocks()) {
|
||||||
return new WindowsRawIpSocksProxyProvider(proxySetter, stateSetter, hConnection, domain, port);
|
return new WindowsRawIpProxyProvider(proxySetter, stateSetter, hConnection, domain, port, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
@ -114,12 +112,7 @@ public class ProxyProviderFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else if (OSValidator.isUnix()) {
|
else if (OSValidator.isUnix()) {
|
||||||
if (!socksConfig.useSocks() || socksConfig.dontUseFirstTime()) {
|
return new LinuxRawIpProxyProvider(proxySetter, stateSetter, hConnection, domain, port, socksConfig.useSocks() && !socksConfig.onlyUseIfNeeded());
|
||||||
return new LinuxRawIpProxyProvider(proxySetter, stateSetter, hConnection, domain, port);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return new LinuxRawIpSocksProxyProvider(proxySetter, stateSetter, hConnection, domain, port);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@ -132,7 +125,7 @@ public class ProxyProviderFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ProxyProvider provide(List<String> potentialHosts) {
|
private ProxyProvider provide(List<String> potentialHosts) {
|
||||||
return new NormalProxyProvider(proxySetter, stateSetter, hConnection, potentialHosts);
|
return new NormalProxyProvider(proxySetter, stateSetter, hConnection, potentialHosts, socksConfig.useSocks() && !socksConfig.onlyUseIfNeeded());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setSocksConfig(SocksConfiguration configuration) {
|
public static void setSocksConfig(SocksConfiguration configuration) {
|
||||||
|
@ -1,9 +1,23 @@
|
|||||||
package gearth.protocol.connection.proxy;
|
package gearth.protocol.connection.proxy;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketException;
|
||||||
|
|
||||||
public interface SocksConfiguration {
|
public interface SocksConfiguration {
|
||||||
boolean useSocks();
|
boolean useSocks();
|
||||||
|
|
||||||
int getSocksPort();
|
int getSocksPort();
|
||||||
String getSocksHost();
|
String getSocksHost();
|
||||||
boolean dontUseFirstTime();
|
boolean onlyUseIfNeeded();
|
||||||
|
|
||||||
|
|
||||||
|
default Socket createSocket() throws SocketException {
|
||||||
|
Proxy socks = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(getSocksHost(), getSocksPort()));
|
||||||
|
Socket server = new Socket(socks);
|
||||||
|
server.setSoTimeout(1200);
|
||||||
|
|
||||||
|
return server;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,13 @@ public class LinuxRawIpProxyProvider extends ProxyProvider {
|
|||||||
protected IpMapper ipMapper = IpMapperFactory.get();
|
protected IpMapper ipMapper = IpMapperFactory.get();
|
||||||
protected HProxy proxy = null;
|
protected HProxy proxy = null;
|
||||||
|
|
||||||
protected volatile boolean useSocks = false;
|
private boolean useSocks;
|
||||||
|
|
||||||
public LinuxRawIpProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port) {
|
public LinuxRawIpProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port, boolean useSocks) {
|
||||||
super(proxySetter, stateSetter, hConnection);
|
super(proxySetter, stateSetter, hConnection);
|
||||||
this.input_host = input_host;
|
this.input_host = input_host;
|
||||||
this.input_port = input_port;
|
this.input_port = input_port;
|
||||||
|
this.useSocks = useSocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -164,7 +165,7 @@ public class LinuxRawIpProxyProvider extends ProxyProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSocksProxyThread(Socket client) throws SocketException, InterruptedException {
|
private void createSocksProxyThread(Socket client) throws SocketException {
|
||||||
SocksConfiguration configuration = ProxyProviderFactory.getSocksConfig();
|
SocksConfiguration configuration = ProxyProviderFactory.getSocksConfig();
|
||||||
|
|
||||||
if (configuration == null) {
|
if (configuration == null) {
|
||||||
@ -174,33 +175,19 @@ public class LinuxRawIpProxyProvider extends ProxyProvider {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Proxy socks = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(configuration.getSocksHost(), configuration.getSocksPort()));
|
Socket server = configuration.createSocket();
|
||||||
Socket server = new Socket(socks);
|
|
||||||
server.setSoTimeout(1200);
|
|
||||||
try {
|
try {
|
||||||
server.connect(new InetSocketAddress(proxy.getActual_domain(), proxy.getActual_port()), 1200);
|
server.connect(new InetSocketAddress(proxy.getActual_domain(), proxy.getActual_port()), 1200);
|
||||||
startProxyThread(client, server, proxy);
|
startProxyThread(client, server, proxy);
|
||||||
}
|
}
|
||||||
catch (SocketTimeoutException e) {
|
catch (Exception e) {
|
||||||
maybeRemoveMapping();
|
maybeRemoveMapping();
|
||||||
stateSetter.setState(HState.NOT_CONNECTED);
|
stateSetter.setState(HState.NOT_CONNECTED);
|
||||||
showInvalidConnectionError();
|
showInvalidConnectionError();
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void showInvalidConnectionError() {
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
Alert alert = new Alert(Alert.AlertType.ERROR, "You entered invalid connection information, G-Earth could not connect", ButtonType.OK);
|
|
||||||
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
|
|
||||||
alert.setResizable(false);
|
|
||||||
alert.show();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void maybeAddMapping() {
|
protected void maybeAddMapping() {
|
||||||
ipMapper.enable();
|
ipMapper.enable();
|
||||||
ipMapper.addMapping(proxy.getActual_domain());
|
ipMapper.addMapping(proxy.getActual_domain());
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
package gearth.protocol.connection.proxy.unix;
|
|
||||||
|
|
||||||
import gearth.protocol.HConnection;
|
|
||||||
import gearth.protocol.connection.HProxySetter;
|
|
||||||
import gearth.protocol.connection.HStateSetter;
|
|
||||||
|
|
||||||
public class LinuxRawIpSocksProxyProvider extends LinuxRawIpProxyProvider {
|
|
||||||
public LinuxRawIpSocksProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port) {
|
|
||||||
super(proxySetter, stateSetter, hConnection, input_host, input_port);
|
|
||||||
useSocks = true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -29,8 +29,8 @@ public class WindowsRawIpProxyProvider extends LinuxRawIpProxyProvider {
|
|||||||
|
|
||||||
private boolean hasMapped = false;
|
private boolean hasMapped = false;
|
||||||
|
|
||||||
public WindowsRawIpProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port) {
|
public WindowsRawIpProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port, boolean useSocks) {
|
||||||
super(proxySetter, stateSetter, hConnection, input_host, input_port);
|
super(proxySetter, stateSetter, hConnection, input_host, input_port, useSocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package gearth.protocol.connection.proxy.windows;
|
|
||||||
|
|
||||||
import gearth.protocol.HConnection;
|
|
||||||
import gearth.protocol.connection.HProxySetter;
|
|
||||||
import gearth.protocol.connection.HState;
|
|
||||||
import gearth.protocol.connection.HStateSetter;
|
|
||||||
import gearth.protocol.connection.proxy.ProxyProviderFactory;
|
|
||||||
import gearth.protocol.connection.proxy.SocksConfiguration;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
import java.net.Proxy;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.net.SocketTimeoutException;
|
|
||||||
|
|
||||||
public class WindowsRawIpSocksProxyProvider extends WindowsRawIpProxyProvider {
|
|
||||||
|
|
||||||
public WindowsRawIpSocksProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection, String input_host, int input_port) {
|
|
||||||
super(proxySetter, stateSetter, hConnection, input_host, input_port);
|
|
||||||
useSocks = true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,7 +5,6 @@ import gearth.protocol.HConnection;
|
|||||||
import gearth.protocol.connection.HState;
|
import gearth.protocol.connection.HState;
|
||||||
import gearth.protocol.connection.proxy.ProxyProviderFactory;
|
import gearth.protocol.connection.proxy.ProxyProviderFactory;
|
||||||
import gearth.protocol.connection.proxy.SocksConfiguration;
|
import gearth.protocol.connection.proxy.SocksConfiguration;
|
||||||
import gearth.protocol.connection.proxy.windows.WindowsRawIpSocksProxyProvider;
|
|
||||||
import gearth.ui.SubForm;
|
import gearth.ui.SubForm;
|
||||||
import gearth.ui.info.InfoController;
|
import gearth.ui.info.InfoController;
|
||||||
import javafx.scene.control.*;
|
import javafx.scene.control.*;
|
||||||
@ -41,7 +40,7 @@ public class ExtraController extends SubForm implements SocksConfiguration {
|
|||||||
public GridPane grd_socksInfo;
|
public GridPane grd_socksInfo;
|
||||||
public TextField txt_socksPort;
|
public TextField txt_socksPort;
|
||||||
public TextField txt_socksIp;
|
public TextField txt_socksIp;
|
||||||
public CheckBox cbx_ignoreSocksOnce;
|
public CheckBox cbx_socksUseIfNeeded;
|
||||||
|
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
|
|
||||||
@ -57,7 +56,7 @@ public class ExtraController extends SubForm implements SocksConfiguration {
|
|||||||
JSONObject socksInitValue = Cacher.getCacheContents().getJSONObject(SOCKS_CACHE_KEY);
|
JSONObject socksInitValue = Cacher.getCacheContents().getJSONObject(SOCKS_CACHE_KEY);
|
||||||
txt_socksIp.setText(socksInitValue.getString(SOCKS_IP));
|
txt_socksIp.setText(socksInitValue.getString(SOCKS_IP));
|
||||||
txt_socksPort.setText(socksInitValue.getString(SOCKS_PORT));
|
txt_socksPort.setText(socksInitValue.getString(SOCKS_PORT));
|
||||||
cbx_ignoreSocksOnce.setSelected(socksInitValue.getBoolean(IGNORE_ONCE));
|
cbx_socksUseIfNeeded.setSelected(socksInitValue.getBoolean(IGNORE_ONCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
cbx_debug.selectedProperty().addListener(observable -> HConnection.DEBUG = cbx_debug.isSelected());
|
cbx_debug.selectedProperty().addListener(observable -> HConnection.DEBUG = cbx_debug.isSelected());
|
||||||
@ -93,7 +92,7 @@ public class ExtraController extends SubForm implements SocksConfiguration {
|
|||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put(SOCKS_IP, txt_socksIp.getText());
|
jsonObject.put(SOCKS_IP, txt_socksIp.getText());
|
||||||
jsonObject.put(SOCKS_PORT, txt_socksPort.getText());
|
jsonObject.put(SOCKS_PORT, txt_socksPort.getText());
|
||||||
jsonObject.put(IGNORE_ONCE, cbx_ignoreSocksOnce.isSelected());
|
jsonObject.put(IGNORE_ONCE, cbx_socksUseIfNeeded.isSelected());
|
||||||
Cacher.put(SOCKS_CACHE_KEY, jsonObject);
|
Cacher.put(SOCKS_CACHE_KEY, jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +126,7 @@ public class ExtraController extends SubForm implements SocksConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean dontUseFirstTime() {
|
public boolean onlyUseIfNeeded() {
|
||||||
return cbx_ignoreSocksOnce.isSelected();
|
return cbx_socksUseIfNeeded.isSelected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
<Insets left="5.0" />
|
<Insets left="5.0" />
|
||||||
</padding>
|
</padding>
|
||||||
<children>
|
<children>
|
||||||
<CheckBox fx:id="cbx_ignoreSocksOnce" mnemonicParsing="false" selected="true" text="Ignore for first connection" GridPane.rowIndex="1" />
|
<CheckBox fx:id="cbx_socksUseIfNeeded" mnemonicParsing="false" selected="true" text="Only use if needed" GridPane.rowIndex="1" />
|
||||||
<GridPane prefHeight="119.0" prefWidth="259.0">
|
<GridPane prefHeight="119.0" prefWidth="259.0">
|
||||||
<columnConstraints>
|
<columnConstraints>
|
||||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="159.0" minWidth="10.0" prefWidth="68.0" />
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="159.0" minWidth="10.0" prefWidth="68.0" />
|
||||||
|
Loading…
Reference in New Issue
Block a user