fix error when spamclicking abort+connect

This commit is contained in:
sirjonasxx 2020-04-27 19:37:36 +02:00
parent 6e5bc39489
commit 44e343499c
2 changed files with 51 additions and 47 deletions

View File

@ -65,7 +65,8 @@ public class HConnection {
PREPARING, // DOMAIN AND PORT BEEN PASSED PREPARING, // DOMAIN AND PORT BEEN PASSED
PREPARED, // FOUND IP ADDRESS OF DOMAIN PREPARED, // FOUND IP ADDRESS OF DOMAIN
WAITING_FOR_CLIENT, // WAITING FOR CORRECT TCP CONNECTION TO BE SET UP WAITING_FOR_CLIENT, // WAITING FOR CORRECT TCP CONNECTION TO BE SET UP
CONNECTED // CONNECTED CONNECTED, // CONNECTED
ABORTING
} }
// checks if host is a raw IP instead of a domain // checks if host is a raw IP instead of a domain
@ -116,7 +117,7 @@ public class HConnection {
private static volatile ConnectionInfoOverrider connectionInfoOverrider; private static volatile ConnectionInfoOverrider connectionInfoOverrider;
public static volatile boolean DECRYPTPACKETS = true; public static volatile boolean DECRYPTPACKETS = true;
public static volatile boolean DEBUG = false; public static volatile boolean DEBUG = true;
private static final HostReplacer hostsReplacer = HostReplacerFactory.get(); private static final HostReplacer hostsReplacer = HostReplacerFactory.get();
private volatile boolean hostRedirected = false; private volatile boolean hostRedirected = false;
@ -220,10 +221,10 @@ public class HConnection {
potentialHost.add(domain+":"+port); potentialHost.add(domain+":"+port);
if (hostIsIpAddress(domain)) { if (hostIsIpAddress(domain)) {
setState(State.PREPARING); // state will not be prepared until the server-connection is initialized
rawIpMode = true; rawIpMode = true;
potentialProxies.clear(); potentialProxies.clear();
potentialProxies.add(new Proxy(domain, domain, port, port, "0.0.0.0")); potentialProxies.add(new Proxy(domain, domain, port, port, "0.0.0.0"));
setState(State.PREPARED);
} }
else { else {
prepare(potentialHost); prepare(potentialHost);
@ -285,18 +286,21 @@ public class HConnection {
setState(State.PREPARED); setState(State.PREPARED);
} }
private void startForRawIp() throws IOException { private void startForRawIp() {
new Thread(() -> { new Thread(() -> {
try { try {
Proxy proxy = potentialProxies.get(0); Proxy proxy = potentialProxies.get(0);
IpMapper ipMapper = IpMapperFactory.get();
ipMapper.deleteMapping(proxy.actual_domain); // just making sure
Queue<Socket> preConnectedServerConnections = new LinkedList<>(); Queue<Socket> preConnectedServerConnections = new LinkedList<>();
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
preConnectedServerConnections.add(new Socket(proxy.actual_domain, proxy.actual_port)); preConnectedServerConnections.add(new Socket(proxy.actual_domain, proxy.actual_port));
Thread.sleep(80); Thread.sleep(50);
} }
IpMapper ipMapper = IpMapperFactory.get();
ipMapper.enable(); ipMapper.enable();
ipMapper.addMapping(proxy.actual_domain); ipMapper.addMapping(proxy.actual_domain);
@ -308,6 +312,8 @@ public class HConnection {
Thread.sleep(30); Thread.sleep(30);
setState(State.WAITING_FOR_CLIENT);
while ((state == State.WAITING_FOR_CLIENT) && !proxy_server.isClosed()) { while ((state == State.WAITING_FOR_CLIENT) && !proxy_server.isClosed()) {
try { try {
if (DEBUG) System.out.println("try accept proxy"); if (DEBUG) System.out.println("try accept proxy");
@ -345,15 +351,15 @@ public class HConnection {
} }
public void start() throws IOException { public void start() throws IOException {
if (state == State.PREPARED) { if (state == State.PREPARING && rawIpMode) {
startForRawIp();
return;
}
if (state == State.PREPARED && !rawIpMode) {
setState(State.WAITING_FOR_CLIENT); setState(State.WAITING_FOR_CLIENT);
if (rawIpMode) {
startForRawIp();
return;
}
if (!hostRedirected && !connectionInfoOverrider.mustOverrideConnection()) { if (!hostRedirected && !connectionInfoOverrider.mustOverrideConnection()) {
addToHosts(); addToHosts();
} }
@ -516,21 +522,25 @@ public class HConnection {
removeFromHosts(); removeFromHosts();
} }
clearAllProxies(); if (!rawIpMode) {
clearAllProxies();
}
} }
public void abort() { public void abort() {
setState(State.ABORTING);
if (hostRedirected) { if (hostRedirected) {
removeFromHosts(); removeFromHosts();
} }
if (rawIpMode && actual_proxy != null) { if (rawIpMode && potentialProxies.size() == 1) {
IpMapperFactory.get().deleteMapping(actual_proxy.actual_domain); IpMapperFactory.get().deleteMapping(potentialProxies.get(0).actual_domain);
} }
actual_proxy = null; actual_proxy = null;
setState(State.NOT_CONNECTED);
clearAllProxies(); clearAllProxies();
setState(State.NOT_CONNECTED);
} }
private void clearAllProxies() { private void clearAllProxies() {
@ -540,9 +550,9 @@ public class HConnection {
private void closeAllProxies(Proxy except) { private void closeAllProxies(Proxy except) {
for (Proxy proxy : potentialProxies) { for (Proxy proxy : potentialProxies) {
if (except != proxy) { if (except != proxy) {
if (proxy.proxy_server != null && !proxy.proxy_server.isClosed()) { if (proxy.getProxy_server() != null && !proxy.getProxy_server().isClosed()) {
try { try {
proxy.proxy_server.close(); proxy.getProxy_server().close();
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();

View File

@ -55,10 +55,11 @@ public class ConnectionController extends SubForm {
} }
private void updateInputUI() { private void updateInputUI() {
if (cbx_autodetect.isSelected()) { txtfield_hotelversion.setText(getHConnection().getHotelVersion());
btnConnect.setDisable(false);
} System.out.println(getHConnection().getState());
else { btnConnect.setDisable(getHConnection().getState() == HConnection.State.PREPARING || getHConnection().getState() == HConnection.State.ABORTING);
if (!cbx_autodetect.isSelected() && !btnConnect.isDisable()) {
try { try {
int i = Integer.parseInt(inpPort.getEditor().getText()); int i = Integer.parseInt(inpPort.getEditor().getText());
btnConnect.setDisable(i < 0 || i >= 256 * 256); btnConnect.setDisable(i < 0 || i >= 256 * 256);
@ -74,29 +75,25 @@ public class ConnectionController extends SubForm {
public void onParentSet(){ public void onParentSet(){
getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> { getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> {
txtfield_hotelversion.setText(getHConnection().getHotelVersion()); updateInputUI();
Platform.runLater(() -> { if (newState == HConnection.State.NOT_CONNECTED) {
if (newState == HConnection.State.NOT_CONNECTED) { lblState.setText("Not connected");
updateInputUI(); btnConnect.setText("Connect");
lblState.setText("Not connected"); outHost.setText("");
btnConnect.setText("Connect"); outPort.setText("");
outHost.setText(""); }
outPort.setText(""); else if (oldState == HConnection.State.NOT_CONNECTED) {
} btnConnect.setText("Abort");
else if (oldState == HConnection.State.NOT_CONNECTED) { }
updateInputUI();
btnConnect.setText("Abort");
}
if (newState == HConnection.State.CONNECTED) { if (newState == HConnection.State.CONNECTED) {
lblState.setText("Connected"); lblState.setText("Connected");
outHost.setText(getHConnection().getDomain()); outHost.setText(getHConnection().getDomain());
outPort.setText(getHConnection().getServerPort()+""); outPort.setText(getHConnection().getServerPort()+"");
} }
if (newState == HConnection.State.WAITING_FOR_CLIENT) { if (newState == HConnection.State.WAITING_FOR_CLIENT) {
lblState.setText("Waiting for connection"); lblState.setText("Waiting for connection");
} }
});
})); }));
@ -113,10 +110,7 @@ public class ConnectionController extends SubForm {
else { else {
getHConnection().prepare(inpHost.getEditor().getText(), Integer.parseInt(inpPort.getEditor().getText())); getHConnection().prepare(inpHost.getEditor().getText(), Integer.parseInt(inpPort.getEditor().getText()));
} }
Platform.runLater(() -> btnConnect.setDisable(false));
if (HConnection.DEBUG) System.out.println("connecting"); if (HConnection.DEBUG) System.out.println("connecting");
try { try {
getHConnection().start(); getHConnection().start();
} catch (IOException e) { } catch (IOException e) {