From b1e075da97dc297ebd37db249f80f5f2f4611862 Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Sun, 26 Mar 2017 00:49:04 -0500 Subject: [PATCH] Added SSL encryption --- .classpath | 2 +- lib/nanohttpd-2.3.1.jar | Bin 51191 -> 0 bytes lib/nanohttpd-2.3.2-SNAPSHOT.jar | Bin 0 -> 53208 bytes .../lightspeed/CommunicationService.java | 65 ++++++++++++++---- .../lightspeed_frontend/Frontend.java | 17 ++++- .../LightspeedFrontendText.java | 12 ++-- .../communication/FrontendCommunication.java | 13 ++-- .../communication/HttpClient.java | 43 +++++++++++- .../LinearTestFrontendCommunication.java | 65 ------------------ 9 files changed, 123 insertions(+), 94 deletions(-) delete mode 100644 lib/nanohttpd-2.3.1.jar create mode 100644 lib/nanohttpd-2.3.2-SNAPSHOT.jar delete mode 100644 test/com/projectswg/lightspeed/frontend/LinearTestFrontendCommunication.java diff --git a/.classpath b/.classpath index f8560c1..87e8f73 100644 --- a/.classpath +++ b/.classpath @@ -6,7 +6,6 @@ - @@ -29,5 +28,6 @@ + diff --git a/lib/nanohttpd-2.3.1.jar b/lib/nanohttpd-2.3.1.jar deleted file mode 100644 index 5f17a6925ed9369be912fdf957b50923a5dfa242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51191 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 g9 running; + private final List running; public BoundRunner(int threads) { if (threads <= 0) @@ -203,21 +240,21 @@ public class CommunicationService extends LightspeedService { public void closeAll() { // copy of the list for concurrency synchronized (running) { - for (NanoHTTPD.ClientHandler clientHandler : running) { + for (ClientHandler clientHandler : running) { clientHandler.close(); } } } @Override - public void closed(NanoHTTPD.ClientHandler clientHandler) { + public void closed(ClientHandler clientHandler) { synchronized (running) { running.remove(clientHandler); } } @Override - public void exec(NanoHTTPD.ClientHandler clientHandler) { + public void exec(ClientHandler clientHandler) { threadPool.execute(clientHandler); synchronized (running) { running.add(clientHandler); diff --git a/src/com/projectswg/lightspeed_frontend/Frontend.java b/src/com/projectswg/lightspeed_frontend/Frontend.java index c22f84d..87ce91a 100644 --- a/src/com/projectswg/lightspeed_frontend/Frontend.java +++ b/src/com/projectswg/lightspeed_frontend/Frontend.java @@ -27,6 +27,8 @@ ***********************************************************************************/ package com.projectswg.lightspeed_frontend; +import java.io.File; +import java.io.IOException; import java.net.InetSocketAddress; import java.util.List; @@ -35,6 +37,7 @@ import com.projectswg.common.concurrency.PswgThreadPool; import com.projectswg.common.data.TestDetails; import com.projectswg.common.debug.Assert; import com.projectswg.common.debug.Log; +import com.projectswg.common.info.Config; import com.projectswg.common.network.packets.Packet; import com.projectswg.common.network.packets.request.RequestBuildDetailedPacket; import com.projectswg.common.network.packets.request.RequestBuildListPacket; @@ -62,13 +65,19 @@ public class Frontend { private final PswgScheduledThreadPool scheduledUpdater; private final FrontendCommunication communication; private final FrontendData data; + private final Config config; public Frontend() { this.threadPool = new PswgThreadPool(10, "frontend-thread-pool"); this.scheduledUpdater = new PswgScheduledThreadPool(1, "frontend-updater"); - this.communication = new FrontendCommunication(); - this.communication.setCallback(packet -> process(packet)); this.data = new FrontendData(); + File data = new File("cfg"); + data.mkdirs(); + File cfgFile = new File(data, "frontend.cfg"); + try { cfgFile.createNewFile(); } catch (IOException e) { Log.e(e); } + this.config = new Config(cfgFile); + this.communication = new FrontendCommunication(config); + this.communication.setCallback(packet -> process(packet)); } public void setAddress(InetSocketAddress address) { @@ -97,6 +106,10 @@ public class Frontend { return data; } + public Config getConfig() { + return config; + } + public void send(Packet p, ResponseCallback callback) { threadPool.execute(() -> { Packet response = communication.send(p); diff --git a/src/com/projectswg/lightspeed_frontend/LightspeedFrontendText.java b/src/com/projectswg/lightspeed_frontend/LightspeedFrontendText.java index fda5d52..501e79d 100644 --- a/src/com/projectswg/lightspeed_frontend/LightspeedFrontendText.java +++ b/src/com/projectswg/lightspeed_frontend/LightspeedFrontendText.java @@ -49,16 +49,18 @@ import com.projectswg.lightspeed_frontend.data.SharedServerData; public class LightspeedFrontendText { + private final Frontend frontend; private final FrontendCommunication communication; private final Queue inbound; private boolean running; public LightspeedFrontendText() { - communication = new FrontendCommunication(); - inbound = new ArrayDeque<>(); - running = false; - communication.setAddress(new InetSocketAddress(InetAddress.getLoopbackAddress(), 44444)); - communication.setCallback(packet -> { + this.frontend = new Frontend(); + this.communication = frontend.getCommunication(); + this.inbound = new ArrayDeque<>(); + this.running = false; + this.communication.setAddress(new InetSocketAddress(InetAddress.getLoopbackAddress(), 44444)); + this.communication.setCallback(packet -> { synchronized (inbound) { inbound.add(packet); inbound.notify(); diff --git a/src/com/projectswg/lightspeed_frontend/communication/FrontendCommunication.java b/src/com/projectswg/lightspeed_frontend/communication/FrontendCommunication.java index 80d2483..82c3303 100644 --- a/src/com/projectswg/lightspeed_frontend/communication/FrontendCommunication.java +++ b/src/com/projectswg/lightspeed_frontend/communication/FrontendCommunication.java @@ -27,11 +27,13 @@ ***********************************************************************************/ package com.projectswg.lightspeed_frontend.communication; +import java.io.File; import java.net.InetSocketAddress; import java.util.concurrent.atomic.AtomicBoolean; import com.projectswg.common.debug.Assert; import com.projectswg.common.debug.Log; +import com.projectswg.common.info.Config; import com.projectswg.common.network.packets.Packet; public class FrontendCommunication { @@ -40,10 +42,13 @@ public class FrontendCommunication { private ResponseCallback callback; private InetSocketAddress address; - public FrontendCommunication() { - running = new AtomicBoolean(false); - callback = null; - address = null; + public FrontendCommunication(Config config) { + this.running = new AtomicBoolean(false); + this.callback = null; + this.address = null; + String keystore = config.getString("KEYSTORE", ""); + if (!keystore.isEmpty()) + HttpClient.setupSSL(new File(keystore), config.getString("KEYSTORE-PASS", "")); } public InetSocketAddress getAddress() { diff --git a/src/com/projectswg/lightspeed_frontend/communication/HttpClient.java b/src/com/projectswg/lightspeed_frontend/communication/HttpClient.java index 1acaef7..7d4c140 100644 --- a/src/com/projectswg/lightspeed_frontend/communication/HttpClient.java +++ b/src/com/projectswg/lightspeed_frontend/communication/HttpClient.java @@ -28,15 +28,24 @@ package com.projectswg.lightspeed_frontend.communication; import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.ConnectException; -import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.URL; import java.net.URLEncoder; +import java.security.KeyStore; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; import me.joshlarson.json.JSON; import me.joshlarson.json.JSONObject; @@ -49,7 +58,35 @@ import com.projectswg.common.network.packets.request.RequestPacket; public class HttpClient { + private static final AtomicBoolean SSL = new AtomicBoolean(false); + + public static void setupSSL(File keystoreFile, String password) { + try { + InputStream keystoreStream = new FileInputStream(keystoreFile); + char[] trustPassword = password.toCharArray(); + KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); + + keystore.load(keystoreStream, trustPassword); + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(keystore, trustPassword); + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(keystore); + SSLContext ctx = SSLContext.getInstance("TLS"); + ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); + SSLContext.setDefault(ctx); + HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); + SSL.set(true); + } catch (Exception e) { + Log.e(e); + SSL.set(false); + } + } + public static Packet requestPacket(InetSocketAddress address, Packet packet) { + if (!SSL.get()) { + Log.e("Cannot send packet - SSL not initialized yet!"); + return null; + } try { String str = requestString(address, packet); JSONObject obj = JSON.readObject(str, true); @@ -70,7 +107,7 @@ public class HttpClient { public static String requestString(InetSocketAddress address, Packet packet) throws IOException { URL url = new URL(generateURL(address, packet)); - HttpURLConnection con = (HttpURLConnection) url.openConnection(); + HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); con.setRequestMethod((packet instanceof PostPacket) ? "POST" : "GET"); con.setRequestProperty("User-Agent", "LightspeedFrontend"); @@ -90,7 +127,7 @@ public class HttpClient { } private static String generateURL(InetSocketAddress address, Packet packet) throws UnsupportedEncodingException { - StringBuilder url = new StringBuilder("http://"+address.getAddress().getHostAddress()+":"+address.getPort()+"/?"); + StringBuilder url = new StringBuilder("https://"+address.getAddress().getHostAddress()+":"+address.getPort()+"/?"); JSONObject obj = packet.getJSON(); if (packet instanceof PostPacket) url.append("type=" + ((PostPacket) packet).getType().name().replace("POST_", "") + '&'); diff --git a/test/com/projectswg/lightspeed/frontend/LinearTestFrontendCommunication.java b/test/com/projectswg/lightspeed/frontend/LinearTestFrontendCommunication.java deleted file mode 100644 index 819110a..0000000 --- a/test/com/projectswg/lightspeed/frontend/LinearTestFrontendCommunication.java +++ /dev/null @@ -1,65 +0,0 @@ -/*********************************************************************************** -* Copyright (c) 2015 /// Project SWG /// www.projectswg.com * -* * -* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * -* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * -* Our goal is to create an emulator which will provide a server for players to * -* continue playing a game similar to the one they used to play. We are basing * -* it on the final publish of the game prior to end-game events. * -* * -* This file is part of Holocore. * -* * -* -------------------------------------------------------------------------------- * -* * -* Holocore is free software: you can redistribute it and/or modify * -* it under the terms of the GNU Affero General Public License as * -* published by the Free Software Foundation, either version 3 of the * -* License, or (at your option) any later version. * -* * -* Holocore is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU Affero General Public License for more details. * -* * -* You should have received a copy of the GNU Affero General Public License * -* along with Holocore. If not, see . * -* * -***********************************************************************************/ -package com.projectswg.lightspeed.frontend; - -import java.util.concurrent.atomic.AtomicBoolean; - -import com.projectswg.lightspeed_frontend.communication.FrontendCommunication; - -public class LinearTestFrontendCommunication { - - private final FrontendCommunication communication; - private final AtomicBoolean connected; - - public LinearTestFrontendCommunication() { - communication = new FrontendCommunication(); - connected = new AtomicBoolean(false); - communication.start(); - } - - public void shutdown() { - communication.stop(); - } - - public boolean isConnected() { - return connected.get(); - } - - public boolean waitForConnectionState(boolean state, long timeout) { - while (connected.get() != state && timeout >= 0) { - try { - Thread.sleep(1); - } catch (InterruptedException e) { - return false; - } - timeout--; - } - return connected.get() == state; - } - -}