Add HTTPS support to API (mandatory for domain name in .dev)

This commit is contained in:
Francois G 2023-02-22 14:45:51 +01:00
parent ee602af486
commit eace65ad53
3 changed files with 79 additions and 24 deletions

View file

@ -15,6 +15,13 @@ public class Configuration {
private String db_database; private String db_database;
private String db_password; private String db_password;
private String tcp_port;
private String use_ssl;
private String ssl_keystore;
private String ssl_keystorePasswd;
private File _file; private File _file;
public Configuration(String path){ public Configuration(String path){
@ -73,4 +80,20 @@ public class Configuration {
public String getDbPassword(){ public String getDbPassword(){
return this.db_password; 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);
}
} }

View file

@ -1,13 +1,14 @@
package be.jeffcheasey88.peeratcode; package be.jeffcheasey88.peeratcode;
import java.io.IOException;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; 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.repository.DatabaseRepository;
import be.jeffcheasey88.peeratcode.routes.ChapterElement; import be.jeffcheasey88.peeratcode.routes.ChapterElement;
@ -23,19 +24,20 @@ import be.jeffcheasey88.peeratcode.webserver.Response;
import be.jeffcheasey88.peeratcode.webserver.Router; import be.jeffcheasey88.peeratcode.webserver.Router;
public class Main { public class Main {
// Define SSL Protocol parameters
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Configuration config = new Configuration("config.txt"); Configuration config = new Configuration("config.txt");
config.load(); config.load();
Class.forName("com.mysql.cj.jdbc.Driver"); Class.forName("com.mysql.cj.jdbc.Driver");
Router router = new Router(); Router router = new Router();
router.setDefault(new Response(){ router.setDefault(new Response() {
@Override @Override
public Pattern getPattern(){return null;} public Pattern getPattern() {
return null;
}
@Override @Override
public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception { public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception {
@ -48,16 +50,10 @@ public class Main {
initRoutes(router, new DatabaseRepository(config)); initRoutes(router, new DatabaseRepository(config));
ServerSocket server = new ServerSocket(80); startWebServer(config, router);
while(!server.isClosed()){
Socket socket = server.accept();
Client client = new Client(socket, router);
client.start();
}
} }
private static void initRoutes(Router router, DatabaseRepository repo){
private static void initRoutes(Router router, DatabaseRepository repo) {
router.register(new ChapterElement(repo)); router.register(new ChapterElement(repo));
router.register(new ChapterList(repo)); router.register(new ChapterList(repo));
router.register(new PuzzleElement(repo)); router.register(new PuzzleElement(repo));
@ -65,4 +61,40 @@ public class Main {
router.register(new Login(repo)); 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();
}
}
}
} }

View file

@ -5,7 +5,7 @@ import java.util.Arrays;
public class Client extends Thread{ public class Client extends Thread{
private Socket socket; private Socket socket; // A quoi il sert ??
private HttpReader reader; private HttpReader reader;
private HttpWriter writer; private HttpWriter writer;
private Router router; private Router router;