From 2172daf14529520642f7a49f39a904b5edf91ea1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 21 Jan 2018 11:54:54 -0500 Subject: [PATCH] Implemented HTTPS checking for web multiplayer, fixed chat jamming all text fields --- .../anuke/mindustry/io/PlatformFunction.java | 7 ++- core/src/io/anuke/mindustry/net/Net.java | 2 +- .../mindustry/ui/fragments/ChatFragment.java | 2 +- .../mindustry/ui/fragments/MenuFragment.java | 2 +- .../anuke/mindustry/client/HtmlLauncher.java | 7 +++ .../mindustry/client/WebsocketClient.java | 61 ++++++++++--------- kryonet/src/io/anuke/kryonet/KryoServer.java | 4 +- 7 files changed, 52 insertions(+), 33 deletions(-) diff --git a/core/src/io/anuke/mindustry/io/PlatformFunction.java b/core/src/io/anuke/mindustry/io/PlatformFunction.java index bba3c1e087..649feb46b9 100644 --- a/core/src/io/anuke/mindustry/io/PlatformFunction.java +++ b/core/src/io/anuke/mindustry/io/PlatformFunction.java @@ -18,5 +18,10 @@ public abstract class PlatformFunction{ public void onGameExit(){} public void openDonations(){} public void requestWritePerms(){} - public String getLocaleName(Locale locale){return locale.toString();} + public String getLocaleName(Locale locale){ + return locale.toString(); + } + public boolean canJoinGame(){ + return true; + } } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 4dbba91cfa..49c0f991eb 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -20,7 +20,7 @@ import io.anuke.ucore.function.Consumer; import java.io.IOException; public class Net{ - public static final int version = 9; + public static final int version = 10; private static boolean server; private static boolean active; diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 001a9ed342..029797b088 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -49,7 +49,7 @@ public class ChatFragment extends Table implements Fragment{ //TODO put it in input? update(() -> { - if(!Net.active()){ + if(!Net.active() && chatOpen){ hide(); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 2ea09efec2..a8953b436e 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -28,7 +28,7 @@ public class MenuFragment implements Fragment{ add(new MenuButton("$text.play", group, ui.levels::show)); row(); - if(!Vars.gwt) { + if(Mindustry.platforms.canJoinGame()) { add(new MenuButton("$text.joingame", group, ui.join::show)); row(); } diff --git a/html/src/io/anuke/mindustry/client/HtmlLauncher.java b/html/src/io/anuke/mindustry/client/HtmlLauncher.java index 9209ab2c88..77a36cdde2 100644 --- a/html/src/io/anuke/mindustry/client/HtmlLauncher.java +++ b/html/src/io/anuke/mindustry/client/HtmlLauncher.java @@ -25,6 +25,7 @@ public class HtmlLauncher extends GwtApplication { static final int WIDTH = 800; static final int HEIGHT = 600; static HtmlLauncher instance; + boolean canJoin = true; @Override public PreloaderCallback getPreloaderCallback () { @@ -111,6 +112,12 @@ public class HtmlLauncher extends GwtApplication { public void openLink(String link){ Window.open(link, "_blank", ""); } + + @Override + public boolean canJoinGame(){ + String ref = Document.get().getReferrer(); + return !ref.startsWith("https") && !ref.contains("itch.io"); + } }; return new Mindustry(); diff --git a/html/src/io/anuke/mindustry/client/WebsocketClient.java b/html/src/io/anuke/mindustry/client/WebsocketClient.java index 62bbb31d95..9c865ead8b 100644 --- a/html/src/io/anuke/mindustry/client/WebsocketClient.java +++ b/html/src/io/anuke/mindustry/client/WebsocketClient.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.reflect.ClassReflection; import com.badlogic.gdx.utils.reflect.ReflectionException; import com.sksamuel.gwt.websockets.Websocket; import com.sksamuel.gwt.websockets.WebsocketListener; +import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.net.Host; import io.anuke.mindustry.net.Net; @@ -104,36 +105,40 @@ public class WebsocketClient implements ClientProvider { @Override public void pingHost(String address, int port, Consumer valid, Consumer failed) { - failed.accept(new IOException()); - Websocket socket = new Websocket("ws://" + address + ":" + Vars.webPort); - final boolean[] accepted = {false}; - socket.addListener(new WebsocketListener() { - @Override - public void onClose() { - if(!accepted[0]) failed.accept(new IOException("Failed to connect to host.")); - } + if(!Mindustry.platforms.canJoinGame()) { + failed.accept(new IOException()); + }else { + Websocket socket = new Websocket("ws://" + address + ":" + Vars.webPort); + final boolean[] accepted = {false}; + socket.addListener(new WebsocketListener() { + @Override + public void onClose() { + if (!accepted[0]) failed.accept(new IOException("Failed to connect to host.")); + } - @Override - public void onMessage(String msg) { - String[] text = msg.split("\\|"); - Host host = new Host(text[1], address, Strings.parseInt(text[0])); - valid.accept(host); - accepted[0] = true; - socket.close(); - } + @Override + public void onMessage(String msg) { + if(!msg.startsWith("---")) return; + String[] text = msg.substring(3).split("\\|"); + Host host = new Host(text[1], address, Strings.parseInt(text[0])); + valid.accept(host); + accepted[0] = true; + socket.close(); + } - @Override - public void onOpen() { - socket.send("_ping_"); - } - }); - socket.open(); - Timers.runTask(60f*5, () -> { - if(!accepted[0]){ - failed.accept(new IOException("Failed to connect to host.")); - socket.close(); - } - }); + @Override + public void onOpen() { + socket.send("_ping_"); + } + }); + socket.open(); + Timers.runTask(60f * 5, () -> { + if (!accepted[0]) { + failed.accept(new IOException("Failed to connect to host.")); + socket.close(); + } + }); + } } @Override diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 8a84cb0a09..c65b92f5f9 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -259,6 +259,7 @@ public class KryoServer implements ServerProvider { public void dispose(){ try { server.dispose(); + UCore.log("Disposing web server..."); if(webServer != null) webServer.stop(1); //kill them all for(Thread thread : Thread.getAllStackTraces().keySet()){ @@ -266,6 +267,7 @@ public class KryoServer implements ServerProvider { thread.interrupt(); } } + UCore.log("Killed web server."); }catch (Exception e){ throw new RuntimeException(e); } @@ -403,7 +405,7 @@ public class KryoServer implements ServerProvider { if (k == null) return; if(message.equals("_ping_")){ - conn.send(connections.size() + "|" + Vars.player.name); + conn.send("---" + connections.size() + "|" + Vars.player.name); connections.remove(k); }else { if (debug) UCore.log("Got message: " + message);