From fd39e0b0f1318d5dfa0c2617e10d825710b7dd01 Mon Sep 17 00:00:00 2001 From: Florian Rinke Date: Thu, 14 Oct 2021 17:05:42 +0200 Subject: refactor websocket package to network package --- src/main/java/de/torui/coflsky/CoflSky.java | 2 +- src/main/java/de/torui/coflsky/CoflSkyCommand.java | 8 +- .../java/de/torui/coflsky/QueryServerCommands.java | 103 -------------- .../java/de/torui/coflsky/WSCommandHandler.java | 2 +- .../minecraft_integration/PlayerDataProvider.java | 3 +- .../de/torui/coflsky/network/NaiveSSLContext.java | 125 +++++++++++++++++ .../torui/coflsky/network/QueryServerCommands.java | 105 ++++++++++++++ .../java/de/torui/coflsky/network/WSClient.java | 134 ++++++++++++++++++ .../de/torui/coflsky/network/WSClientWrapper.java | 152 +++++++++++++++++++++ .../torui/coflsky/websocket/NaiveSSLContext.java | 125 ----------------- .../java/de/torui/coflsky/websocket/WSClient.java | 134 ------------------ .../torui/coflsky/websocket/WSClientWrapper.java | 152 --------------------- 12 files changed, 524 insertions(+), 521 deletions(-) delete mode 100644 src/main/java/de/torui/coflsky/QueryServerCommands.java create mode 100644 src/main/java/de/torui/coflsky/network/NaiveSSLContext.java create mode 100644 src/main/java/de/torui/coflsky/network/QueryServerCommands.java create mode 100644 src/main/java/de/torui/coflsky/network/WSClient.java create mode 100644 src/main/java/de/torui/coflsky/network/WSClientWrapper.java delete mode 100644 src/main/java/de/torui/coflsky/websocket/NaiveSSLContext.java delete mode 100644 src/main/java/de/torui/coflsky/websocket/WSClient.java delete mode 100644 src/main/java/de/torui/coflsky/websocket/WSClientWrapper.java (limited to 'src/main/java') diff --git a/src/main/java/de/torui/coflsky/CoflSky.java b/src/main/java/de/torui/coflsky/CoflSky.java index d625238..8ec8493 100644 --- a/src/main/java/de/torui/coflsky/CoflSky.java +++ b/src/main/java/de/torui/coflsky/CoflSky.java @@ -6,7 +6,7 @@ import java.net.URISyntaxException; import org.lwjgl.input.Keyboard; -import de.torui.coflsky.websocket.WSClientWrapper; +import de.torui.coflsky.network.WSClientWrapper; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.MinecraftForge; diff --git a/src/main/java/de/torui/coflsky/CoflSkyCommand.java b/src/main/java/de/torui/coflsky/CoflSkyCommand.java index fa2dcf8..e48d131 100644 --- a/src/main/java/de/torui/coflsky/CoflSkyCommand.java +++ b/src/main/java/de/torui/coflsky/CoflSkyCommand.java @@ -9,8 +9,9 @@ import de.torui.coflsky.core.CommandType; import de.torui.coflsky.core.StringCommand; import de.torui.coflsky.minecraft_integration.CoflSessionManager; import de.torui.coflsky.minecraft_integration.CoflSessionManager.CoflSession; +import de.torui.coflsky.network.QueryServerCommands; +import de.torui.coflsky.network.WSClient; import de.torui.coflsky.minecraft_integration.PlayerDataProvider; -import de.torui.coflsky.websocket.WSClient; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; @@ -75,8 +76,9 @@ public class CoflSkyCommand extends CommandBase { break; case "debug": // WSCommandHandler.HandleCommand(new Command(CommandType.Execute, "/me hewwo"), sender.getCommandSenderEntity()); - // WSCommandHandler.HandleCommand(new Command(CommandType.WriteToChat, "{ \"text\": \"Clickable Texts are fun\", \"onClick\": \"me Hello World\"}"), sender.getCommandSenderEntity()); - WSCommandHandler.HandleCommand(new Command(CommandType.PlaySound, "{\"name\":\"random.orb\",\"pitch\":0.5}"), sender.getCommandSenderEntity()); + // WSCommandHandler.HandleCommand(new Command(CommandType.WriteToChat, " {\"type\":\"writeToChat\",\"data\":\"{\\\"text\\\":\\\"\\\\nFLIP: º9Goblin Eg\r\n" + // + "g º87,000 -> 13,999 ºg[BUY]\\\",\\\"onClick\\\":\\\"/viewauction f7d7295ca72f43e9876bf6da7424000c\\\",\\\"hover\\\":\\\"\\\"}\"}"), sender.getCommandSenderEntity()); + //WSCommandHandler.HandleCommand(new Command(CommandType.PlaySound, "{\"name\":\"random.orb\",\"pitch\":0.5}"), sender.getCommandSenderEntity()); break; case "callback": CallbackCommand(args); diff --git a/src/main/java/de/torui/coflsky/QueryServerCommands.java b/src/main/java/de/torui/coflsky/QueryServerCommands.java deleted file mode 100644 index a6a2f47..0000000 --- a/src/main/java/de/torui/coflsky/QueryServerCommands.java +++ /dev/null @@ -1,103 +0,0 @@ -package de.torui.coflsky; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Arrays; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class QueryServerCommands { - - private static Gson gson = new GsonBuilder().create(); - - public static String QueryCommands() { - - String queryResult = GetRequest(CoflSky.CommandUri); - - if(queryResult != null) { - CommandInfo[] commands = gson.fromJson(queryResult, CommandInfo[].class); - - System.out.println(">>> "+Arrays.toString(commands)); - - StringBuilder sb = new StringBuilder(); - - if(commands.length>0) { - for(CommandInfo cm : commands) { - sb.append(cm + "\n"); - } - } - return sb.toString().trim(); - - } - - return "§4ERROR: Could not connect to command server!"; - } - - private static class CommandInfo { - - public String subCommand; - public String description; - - public CommandInfo() {} - - public CommandInfo(String subCommand, String description) { - super(); - this.subCommand = subCommand; - this.description = description; - } - - @Override - public String toString() { - return subCommand + ": " + description; - } - - - - } - private static String GetRequest(String uri) { - - try { - System.out.println("Get request"); - URL url = new URL(uri); - HttpURLConnection con; - con = (HttpURLConnection) url.openConnection(); - con.setRequestMethod("GET"); - - //con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); - con.setRequestProperty("Accept", "application/json"); - con.setRequestProperty("User-Agent", "CoflMod"); - //con.setDoInput(true); - con.setDoInput(true); - - // ... - - /*OutputStream os = con.getOutputStream(); - byte[] bytes = ("[\"" + getUsername() + "\"]").getBytes("UTF-8"); - os.write(bytes); - os.close(); - */ - System.out.println("InputStream"); - InputStream in = new BufferedInputStream(con.getInputStream()); - ByteArrayOutputStream result = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - for (int length; (length = in.read(buffer)) != -1; ) { - result.write(buffer, 0, length); - } - // StandardCharsets.UTF_8.name() > JDK 7 - String resString = result.toString("UTF-8"); - - System.out.println("Result= " + resString); - return resString; - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - return null; - } -} diff --git a/src/main/java/de/torui/coflsky/WSCommandHandler.java b/src/main/java/de/torui/coflsky/WSCommandHandler.java index eb18dfd..abffdf2 100644 --- a/src/main/java/de/torui/coflsky/WSCommandHandler.java +++ b/src/main/java/de/torui/coflsky/WSCommandHandler.java @@ -3,7 +3,7 @@ package de.torui.coflsky; import de.torui.coflsky.core.Command; import de.torui.coflsky.core.SoundCommand; import de.torui.coflsky.core.WriteToChatCommand; -import de.torui.coflsky.websocket.WSClient; +import de.torui.coflsky.network.WSClient; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.PositionedSound; diff --git a/src/main/java/de/torui/coflsky/minecraft_integration/PlayerDataProvider.java b/src/main/java/de/torui/coflsky/minecraft_integration/PlayerDataProvider.java index 4c3c39b..ede60ce 100644 --- a/src/main/java/de/torui/coflsky/minecraft_integration/PlayerDataProvider.java +++ b/src/main/java/de/torui/coflsky/minecraft_integration/PlayerDataProvider.java @@ -9,8 +9,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; - -import de.torui.coflsky.websocket.WSClient; +import de.torui.coflsky.network.WSClient; import net.minecraft.client.Minecraft; public class PlayerDataProvider { diff --git a/src/main/java/de/torui/coflsky/network/NaiveSSLContext.java b/src/main/java/de/torui/coflsky/network/NaiveSSLContext.java new file mode 100644 index 0000000..e5f7a95 --- /dev/null +++ b/src/main/java/de/torui/coflsky/network/NaiveSSLContext.java @@ -0,0 +1,125 @@ +package de.torui.coflsky.network; +/* + * Copyright (C) 2015 Neo Visionaries Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Provider; +import java.security.cert.X509Certificate; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + + +/** + * A factory class which creates an {@link SSLContext} that + * naively accepts all certificates without verification. + * + *
+ * // Create an SSL context that naively accepts all certificates.
+ * SSLContext context = NaiveSSLContext.getInstance("TLS");
+ *
+ * // Create a socket factory from the SSL context.
+ * SSLSocketFactory factory = context.getSocketFactory();
+ *
+ * // Create a socket from the socket factory.
+ * SSLSocket socket = factory.createSocket("www.example.com", 443);
+ * 
+ * + * @author Takahiko Kawasaki + */ +public class NaiveSSLContext +{ + private NaiveSSLContext() + { + } + + + /** + * Get an SSLContext that implements the specified secure + * socket protocol and naively accepts all certificates + * without verification. + */ + public static SSLContext getInstance(String protocol) throws NoSuchAlgorithmException + { + return init(SSLContext.getInstance(protocol)); + } + + + /** + * Get an SSLContext that implements the specified secure + * socket protocol and naively accepts all certificates + * without verification. + */ + public static SSLContext getInstance(String protocol, Provider provider) throws NoSuchAlgorithmException + { + return init(SSLContext.getInstance(protocol, provider)); + } + + + /** + * Get an SSLContext that implements the specified secure + * socket protocol and naively accepts all certificates + * without verification. + */ + public static SSLContext getInstance(String protocol, String provider) throws NoSuchAlgorithmException, NoSuchProviderException + { + return init(SSLContext.getInstance(protocol, provider)); + } + + + /** + * Set NaiveTrustManager to the given context. + */ + private static SSLContext init(SSLContext context) + { + try + { + // Set NaiveTrustManager. + context.init(null, new TrustManager[] { new NaiveTrustManager() }, null); + } + catch (KeyManagementException e) + { + throw new RuntimeException("Failed to initialize an SSLContext.", e); + } + + return context; + } + + + /** + * A {@link TrustManager} which trusts all certificates naively. + */ + private static class NaiveTrustManager implements X509TrustManager + { + @Override + public X509Certificate[] getAcceptedIssuers() + { + return null; + } + + + public void checkClientTrusted(X509Certificate[] certs, String authType) + { + } + + + public void checkServerTrusted(X509Certificate[] certs, String authType) + { + } + } +} \ No newline at end of file diff --git a/src/main/java/de/torui/coflsky/network/QueryServerCommands.java b/src/main/java/de/torui/coflsky/network/QueryServerCommands.java new file mode 100644 index 0000000..0bf54a3 --- /dev/null +++ b/src/main/java/de/torui/coflsky/network/QueryServerCommands.java @@ -0,0 +1,105 @@ +package de.torui.coflsky.network; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Arrays; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import de.torui.coflsky.CoflSky; + +public class QueryServerCommands { + + private static Gson gson = new GsonBuilder().create(); + + public static String QueryCommands() { + + String queryResult = GetRequest(CoflSky.CommandUri); + + if(queryResult != null) { + CommandInfo[] commands = gson.fromJson(queryResult, CommandInfo[].class); + + System.out.println(">>> "+Arrays.toString(commands)); + + StringBuilder sb = new StringBuilder(); + + if(commands.length>0) { + for(CommandInfo cm : commands) { + sb.append(cm + "\n"); + } + } + return sb.toString().trim(); + + } + + return "§4ERROR: Could not connect to command server!"; + } + + private static class CommandInfo { + + public String subCommand; + public String description; + + public CommandInfo() {} + + public CommandInfo(String subCommand, String description) { + super(); + this.subCommand = subCommand; + this.description = description; + } + + @Override + public String toString() { + return subCommand + ": " + description; + } + + + + } + private static String GetRequest(String uri) { + + try { + System.out.println("Get request"); + URL url = new URL(uri); + HttpURLConnection con; + con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + //con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + con.setRequestProperty("Accept", "application/json"); + con.setRequestProperty("User-Agent", "CoflMod"); + //con.setDoInput(true); + con.setDoInput(true); + + // ... + + /*OutputStream os = con.getOutputStream(); + byte[] bytes = ("[\"" + getUsername() + "\"]").getBytes("UTF-8"); + os.write(bytes); + os.close(); + */ + System.out.println("InputStream"); + InputStream in = new BufferedInputStream(con.getInputStream()); + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + for (int length; (length = in.read(buffer)) != -1; ) { + result.write(buffer, 0, length); + } + // StandardCharsets.UTF_8.name() > JDK 7 + String resString = result.toString("UTF-8"); + + System.out.println("Result= " + resString); + return resString; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return null; + } +} diff --git a/src/main/java/de/torui/coflsky/network/WSClient.java b/src/main/java/de/torui/coflsky/network/WSClient.java new file mode 100644 index 0000000..529056b --- /dev/null +++ b/src/main/java/de/torui/coflsky/network/WSClient.java @@ -0,0 +1,134 @@ +package de.torui.coflsky.network; + +import java.io.IOException; +import java.net.URI; +import java.security.NoSuchAlgorithmException; + +import javax.net.ssl.SSLContext; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.neovisionaries.ws.client.WebSocket; +import com.neovisionaries.ws.client.WebSocketAdapter; +import com.neovisionaries.ws.client.WebSocketException; +import com.neovisionaries.ws.client.WebSocketFactory; +import com.neovisionaries.ws.client.WebSocketState; +import net.minecraft.client.Minecraft; +import de.torui.coflsky.CoflSky; +import de.torui.coflsky.WSCommandHandler; +import de.torui.coflsky.core.Command; +import de.torui.coflsky.core.StringCommand; + +public class WSClient extends WebSocketAdapter { + + + public static Gson gson; + + + static { + gson = new GsonBuilder()/*.setFieldNamingStrategy(new FieldNamingStrategy() { + @Override + public String translateName(Field f) { + + String name = f.getName(); + char firstChar = name.charAt(0); + return Character.toLowerCase(firstChar) + name.substring(1); + } + })*/.create(); + } + public URI uri; + public WebSocket socket; + public boolean shouldRun = false; + public WebSocketState currentState = WebSocketState.CLOSED; + + public WSClient(URI uri) { + this.uri = uri; + + } + + public void start() throws IOException, WebSocketException, NoSuchAlgorithmException { + WebSocketFactory factory = new WebSocketFactory(); + + /*// Create a custom SSL context. + SSLContext context = NaiveSSLContext.getInstance("TLS"); + + // Set the custom SSL context. + factory.setSSLContext(context); + + // Disable manual hostname verification for NaiveSSLContext. + // + // Manual hostname verification has been enabled since the + // version 2.1. Because the verification is executed manually + // after Socket.connect(SocketAddress, int) succeeds, the + // hostname verification is always executed even if you has + // passed an SSLContext which naively accepts any server + // certificate. However, this behavior is not desirable in + // some cases and you may want to disable the hostname + // verification. You can disable the hostname verification + // by calling WebSocketFactory.setVerifyHostname(false). + factory.setVerifyHostname(false); + factory.*/ + factory.setConnectionTimeout(10*1000); + this.socket = factory.createSocket(uri); + this.socket.addListener(this); + this.socket.connect(); + } + + public void stop() { + System.out.println("Closing Socket"); + // socket.sendClose(); + socket.clearListeners(); + + socket.disconnect(); + /*try { + socket.getConnectedSocket().close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (WebSocketException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }*/ + System.out.println("Socket closed"); + + } + + @Override + public void onStateChanged(WebSocket websocket, WebSocketState newState) throws Exception { + System.out.println("WebSocket Changed state to: " + newState); + currentState = newState; + + if(newState == WebSocketState.CLOSED && shouldRun) { + CoflSky.Wrapper.restartWebsocketConnection(); + } + + super.onStateChanged(websocket, newState); + } + + + + @Override + public void onTextMessage(WebSocket websocket, String text) throws Exception{ + + //super.onTextMessage(websocket, text); + System.out.println("Received: "+ text); + Command cmd = gson.fromJson(text, Command.class); + //System.out.println(cmd); + WSCommandHandler.HandleCommand(cmd, Minecraft.getMinecraft().thePlayer); + + } + + public void SendCommand(Command cmd) { + String json = gson.toJson(cmd); + this.socket.sendText(json); + } + + public void SendCommand(StringCommand sc) { + String json = gson.toJson(sc); + this.socket.sendText(json); + } + + + + +} \ No newline at end of file diff --git a/src/main/java/de/torui/coflsky/network/WSClientWrapper.java b/src/main/java/de/torui/coflsky/network/WSClientWrapper.java new file mode 100644 index 0000000..f30d0f9 --- /dev/null +++ b/src/main/java/de/torui/coflsky/network/WSClientWrapper.java @@ -0,0 +1,152 @@ +package de.torui.coflsky.network; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.NoSuchAlgorithmException; +import java.util.UUID; + +import com.neovisionaries.ws.client.WebSocketException; + +import de.torui.coflsky.CoflSky; +import de.torui.coflsky.core.Command; +import de.torui.coflsky.core.StringCommand; +import de.torui.coflsky.minecraft_integration.PlayerDataProvider; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ChatComponentText; +import de.torui.coflsky.minecraft_integration.CoflSessionManager; + + +public class WSClientWrapper { + public WSClient socket; + // public Thread thread; + public boolean isRunning; + + private String[] uris; + + + public WSClientWrapper(String[] uris) { + this.uris = uris; + } + + public void restartWebsocketConnection() { + socket.socket.clearListeners(); + socket.stop(); + + System.out.println("Sleeping..."); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Lost connection to Coflnet, trying to reestablish the connection in 2 Seconds...")); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + socket = new WSClient(socket.uri); + isRunning = false; + start(); + } + + + public boolean startConnection() { + + if(isRunning) + return false; + + for(String s : uris) { + + System.out.println("Trying connection with uri=" + s); + + if(initializeNewSocket(s)) { + return true; + } + } + + throw new Error("Could not connect to any websocket remote!"); + } + + + + private boolean initializeNewSocket(String uriPrefix) { + + + String uri = uriPrefix; + uri += "?version=" + CoflSky.VERSION; + + String username = PlayerDataProvider.getUsername(); + uri += "&player=" + username; + + //Generate a CoflSession + + try { + CoflSessionManager.UpdateCoflSessions(); + String coflSessionID = CoflSessionManager.GetCoflSession(username).SessionUUID; + + uri += "&SId=" + coflSessionID; + + socket = new WSClient(URI.create(uri)); + + boolean successfull = start(); + if(successfull) { + socket.shouldRun = true; + } + return successfull; + } catch(IOException e) { + e.printStackTrace(); + } + + return false; + + } + + private synchronized boolean start() { + if(!isRunning) { + try { + + socket.start(); + isRunning = true; + + return true; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (WebSocketException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return false; + } + return false; + } + + public synchronized void stop() { + if(isRunning) { + socket.shouldRun = false; + socket.stop(); + isRunning = false; + socket = null; + } + } + + public synchronized void SendMessage(Command cmd){ + if(this.isRunning) { + this.socket.SendCommand(cmd); + } else { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("tried sending a callback to coflnet but failed. the connection must be closed.")); + } + + } + + public void SendMessage(StringCommand sc) { + this.socket.SendCommand(sc); + } + + public String GetStatus() { + return "" + isRunning + " " + + (this.socket!=null ? this.socket.currentState.toString() : "NOT_INITIALIZED"); + } +} diff --git a/src/main/java/de/torui/coflsky/websocket/NaiveSSLContext.java b/src/main/java/de/torui/coflsky/websocket/NaiveSSLContext.java deleted file mode 100644 index aea65c8..0000000 --- a/src/main/java/de/torui/coflsky/websocket/NaiveSSLContext.java +++ /dev/null @@ -1,125 +0,0 @@ -package de.torui.coflsky.websocket; -/* - * Copyright (C) 2015 Neo Visionaries Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the specific - * language governing permissions and limitations under the - * License. - */ -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.Provider; -import java.security.cert.X509Certificate; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - - -/** - * A factory class which creates an {@link SSLContext} that - * naively accepts all certificates without verification. - * - *
- * // Create an SSL context that naively accepts all certificates.
- * SSLContext context = NaiveSSLContext.getInstance("TLS");
- *
- * // Create a socket factory from the SSL context.
- * SSLSocketFactory factory = context.getSocketFactory();
- *
- * // Create a socket from the socket factory.
- * SSLSocket socket = factory.createSocket("www.example.com", 443);
- * 
- * - * @author Takahiko Kawasaki - */ -public class NaiveSSLContext -{ - private NaiveSSLContext() - { - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol) throws NoSuchAlgorithmException - { - return init(SSLContext.getInstance(protocol)); - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol, Provider provider) throws NoSuchAlgorithmException - { - return init(SSLContext.getInstance(protocol, provider)); - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol, String provider) throws NoSuchAlgorithmException, NoSuchProviderException - { - return init(SSLContext.getInstance(protocol, provider)); - } - - - /** - * Set NaiveTrustManager to the given context. - */ - private static SSLContext init(SSLContext context) - { - try - { - // Set NaiveTrustManager. - context.init(null, new TrustManager[] { new NaiveTrustManager() }, null); - } - catch (KeyManagementException e) - { - throw new RuntimeException("Failed to initialize an SSLContext.", e); - } - - return context; - } - - - /** - * A {@link TrustManager} which trusts all certificates naively. - */ - private static class NaiveTrustManager implements X509TrustManager - { - @Override - public X509Certificate[] getAcceptedIssuers() - { - return null; - } - - - public void checkClientTrusted(X509Certificate[] certs, String authType) - { - } - - - public void checkServerTrusted(X509Certificate[] certs, String authType) - { - } - } -} \ No newline at end of file diff --git a/src/main/java/de/torui/coflsky/websocket/WSClient.java b/src/main/java/de/torui/coflsky/websocket/WSClient.java deleted file mode 100644 index 8adce9a..0000000 --- a/src/main/java/de/torui/coflsky/websocket/WSClient.java +++ /dev/null @@ -1,134 +0,0 @@ -package de.torui.coflsky.websocket; - -import java.io.IOException; -import java.net.URI; -import java.security.NoSuchAlgorithmException; - -import javax.net.ssl.SSLContext; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketAdapter; -import com.neovisionaries.ws.client.WebSocketException; -import com.neovisionaries.ws.client.WebSocketFactory; -import com.neovisionaries.ws.client.WebSocketState; -import net.minecraft.client.Minecraft; -import de.torui.coflsky.CoflSky; -import de.torui.coflsky.WSCommandHandler; -import de.torui.coflsky.core.Command; -import de.torui.coflsky.core.StringCommand; - -public class WSClient extends WebSocketAdapter { - - - public static Gson gson; - - - static { - gson = new GsonBuilder()/*.setFieldNamingStrategy(new FieldNamingStrategy() { - @Override - public String translateName(Field f) { - - String name = f.getName(); - char firstChar = name.charAt(0); - return Character.toLowerCase(firstChar) + name.substring(1); - } - })*/.create(); - } - public URI uri; - public WebSocket socket; - public boolean shouldRun = false; - public WebSocketState currentState = WebSocketState.CLOSED; - - public WSClient(URI uri) { - this.uri = uri; - - } - - public void start() throws IOException, WebSocketException, NoSuchAlgorithmException { - WebSocketFactory factory = new WebSocketFactory(); - - /*// Create a custom SSL context. - SSLContext context = NaiveSSLContext.getInstance("TLS"); - - // Set the custom SSL context. - factory.setSSLContext(context); - - // Disable manual hostname verification for NaiveSSLContext. - // - // Manual hostname verification has been enabled since the - // version 2.1. Because the verification is executed manually - // after Socket.connect(SocketAddress, int) succeeds, the - // hostname verification is always executed even if you has - // passed an SSLContext which naively accepts any server - // certificate. However, this behavior is not desirable in - // some cases and you may want to disable the hostname - // verification. You can disable the hostname verification - // by calling WebSocketFactory.setVerifyHostname(false). - factory.setVerifyHostname(false); - factory.*/ - factory.setConnectionTimeout(10*1000); - this.socket = factory.createSocket(uri); - this.socket.addListener(this); - this.socket.connect(); - } - - public void stop() { - System.out.println("Closing Socket"); - // socket.sendClose(); - socket.clearListeners(); - - socket.disconnect(); - /*try { - socket.getConnectedSocket().close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (WebSocketException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - }*/ - System.out.println("Socket closed"); - - } - - @Override - public void onStateChanged(WebSocket websocket, WebSocketState newState) throws Exception { - System.out.println("WebSocket Changed state to: " + newState); - currentState = newState; - - if(newState == WebSocketState.CLOSED && shouldRun) { - CoflSky.Wrapper.restartWebsocketConnection(); - } - - super.onStateChanged(websocket, newState); - } - - - - @Override - public void onTextMessage(WebSocket websocket, String text) throws Exception{ - - //super.onTextMessage(websocket, text); - System.out.println("Received: "+ text); - Command cmd = gson.fromJson(text, Command.class); - //System.out.println(cmd); - WSCommandHandler.HandleCommand(cmd, Minecraft.getMinecraft().thePlayer); - - } - - public void SendCommand(Command cmd) { - String json = gson.toJson(cmd); - this.socket.sendText(json); - } - - public void SendCommand(StringCommand sc) { - String json = gson.toJson(sc); - this.socket.sendText(json); - } - - - - -} \ No newline at end of file diff --git a/src/main/java/de/torui/coflsky/websocket/WSClientWrapper.java b/src/main/java/de/torui/coflsky/websocket/WSClientWrapper.java deleted file mode 100644 index 30e5bc8..0000000 --- a/src/main/java/de/torui/coflsky/websocket/WSClientWrapper.java +++ /dev/null @@ -1,152 +0,0 @@ -package de.torui.coflsky.websocket; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.NoSuchAlgorithmException; -import java.util.UUID; - -import com.neovisionaries.ws.client.WebSocketException; - -import de.torui.coflsky.CoflSky; -import de.torui.coflsky.core.Command; -import de.torui.coflsky.core.StringCommand; -import de.torui.coflsky.minecraft_integration.PlayerDataProvider; -import net.minecraft.client.Minecraft; -import net.minecraft.util.ChatComponentText; -import de.torui.coflsky.minecraft_integration.CoflSessionManager; - - -public class WSClientWrapper { - public WSClient socket; - // public Thread thread; - public boolean isRunning; - - private String[] uris; - - - public WSClientWrapper(String[] uris) { - this.uris = uris; - } - - public void restartWebsocketConnection() { - socket.socket.clearListeners(); - socket.stop(); - - System.out.println("Sleeping..."); - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Lost connection to Coflnet, trying to reestablish the connection in 2 Seconds...")); - - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - socket = new WSClient(socket.uri); - isRunning = false; - start(); - } - - - public boolean startConnection() { - - if(isRunning) - return false; - - for(String s : uris) { - - System.out.println("Trying connection with uri=" + s); - - if(initializeNewSocket(s)) { - return true; - } - } - - throw new Error("Could not connect to any websocket remote!"); - } - - - - private boolean initializeNewSocket(String uriPrefix) { - - - String uri = uriPrefix; - uri += "?version=" + CoflSky.VERSION; - - String username = PlayerDataProvider.getUsername(); - uri += "&player=" + username; - - //Generate a CoflSession - - try { - CoflSessionManager.UpdateCoflSessions(); - String coflSessionID = CoflSessionManager.GetCoflSession(username).SessionUUID; - - uri += "&SId=" + coflSessionID; - - socket = new WSClient(URI.create(uri)); - - boolean successfull = start(); - if(successfull) { - socket.shouldRun = true; - } - return successfull; - } catch(IOException e) { - e.printStackTrace(); - } - - return false; - - } - - private synchronized boolean start() { - if(!isRunning) { - try { - - socket.start(); - isRunning = true; - - return true; - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (WebSocketException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return false; - } - return false; - } - - public synchronized void stop() { - if(isRunning) { - socket.shouldRun = false; - socket.stop(); - isRunning = false; - socket = null; - } - } - - public synchronized void SendMessage(Command cmd){ - if(this.isRunning) { - this.socket.SendCommand(cmd); - } else { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("tried sending a callback to coflnet but failed. the connection must be closed.")); - } - - } - - public void SendMessage(StringCommand sc) { - this.socket.SendCommand(sc); - } - - public String GetStatus() { - return "" + isRunning + " " + - (this.socket!=null ? this.socket.currentState.toString() : "NOT_INITIALIZED"); - } -} -- cgit