From eace65ad53027f1d7957dedff47bbac18b0cd41c Mon Sep 17 00:00:00 2001 From: Francois G Date: Wed, 22 Feb 2023 14:45:51 +0100 Subject: [PATCH] Add HTTPS support to API (mandatory for domain name in .dev) --- .../peeratcode/Configuration.java | 23 ++++++ src/be/jeffcheasey88/peeratcode/Main.java | 78 +++++++++++++------ .../peeratcode/webserver/Client.java | 2 +- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/Configuration.java b/src/be/jeffcheasey88/peeratcode/Configuration.java index bad96e0..e86e356 100644 --- a/src/be/jeffcheasey88/peeratcode/Configuration.java +++ b/src/be/jeffcheasey88/peeratcode/Configuration.java @@ -15,6 +15,13 @@ public class Configuration { private String db_database; private String db_password; + private String tcp_port; + private String use_ssl; + private String ssl_keystore; + private String ssl_keystorePasswd; + + + private File _file; public Configuration(String path){ @@ -73,4 +80,20 @@ public class Configuration { public String getDbPassword(){ return this.db_password; } + + public String getSslKeystore(){ + return this.ssl_keystore; + } + + public String getSslKeystorePasswd(){ + return this.ssl_keystorePasswd; + } + + public int getTcpPort(){ + return Integer.parseInt(this.tcp_port); + } + + public boolean useSsl(){ + return Boolean.parseBoolean(this.use_ssl); + } } \ No newline at end of file diff --git a/src/be/jeffcheasey88/peeratcode/Main.java b/src/be/jeffcheasey88/peeratcode/Main.java index c709ec7..af74256 100644 --- a/src/be/jeffcheasey88/peeratcode/Main.java +++ b/src/be/jeffcheasey88/peeratcode/Main.java @@ -1,13 +1,14 @@ package be.jeffcheasey88.peeratcode; +import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.sql.Connection; -import java.sql.DriverManager; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.password4j.Password; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSocket; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.routes.ChapterElement; @@ -23,20 +24,21 @@ import be.jeffcheasey88.peeratcode.webserver.Response; import be.jeffcheasey88.peeratcode.webserver.Router; public class Main { - + // Define SSL Protocol parameters public static void main(String[] args) throws Exception { Configuration config = new Configuration("config.txt"); config.load(); - Class.forName("com.mysql.cj.jdbc.Driver"); - + Router router = new Router(); - - router.setDefault(new Response(){ - + + router.setDefault(new Response() { + @Override - public Pattern getPattern(){return null;} - + public Pattern getPattern() { + return null; + } + @Override public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 404, "Access-Control-Allow-Origin: *"); @@ -45,19 +47,13 @@ public class Main { writer.close(); } }); - + initRoutes(router, new DatabaseRepository(config)); - - ServerSocket server = new ServerSocket(80); - - while(!server.isClosed()){ - Socket socket = server.accept(); - Client client = new Client(socket, router); - client.start(); - } - - } - private static void initRoutes(Router router, DatabaseRepository repo){ + + startWebServer(config, router); + } + + private static void initRoutes(Router router, DatabaseRepository repo) { router.register(new ChapterElement(repo)); router.register(new ChapterList(repo)); router.register(new PuzzleElement(repo)); @@ -65,4 +61,40 @@ public class Main { router.register(new Login(repo)); } + private static void startWebServer(Configuration config, Router router) throws IOException { + if (config.useSsl()) { + SSLServerSocket server = null; + try { + System.setProperty("javax.net.ssl.keyStore", config.getSslKeystore()); + System.setProperty("javax.net.ssl.keyStorePassword", config.getSslKeystorePasswd()); + + SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + server = (SSLServerSocket) ssf.createServerSocket(config.getTcpPort()); + + while (!server.isClosed()) { + SSLSocket socket = (SSLSocket) server.accept(); + Client client = new Client(socket, router); + client.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (server != null) { + server.close(); + } + } + } + else { + try (ServerSocket server = new ServerSocket(config.getTcpPort())){ + while(!server.isClosed()){ + Socket socket = server.accept(); + Client client = new Client(socket, router); + client.start(); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } } diff --git a/src/be/jeffcheasey88/peeratcode/webserver/Client.java b/src/be/jeffcheasey88/peeratcode/webserver/Client.java index e3da39f..aa6ee64 100644 --- a/src/be/jeffcheasey88/peeratcode/webserver/Client.java +++ b/src/be/jeffcheasey88/peeratcode/webserver/Client.java @@ -5,7 +5,7 @@ import java.util.Arrays; public class Client extends Thread{ - private Socket socket; + private Socket socket; // A quoi il sert ?? private HttpReader reader; private HttpWriter writer; private Router router;