diff --git a/Havana-Web/src/main/java/org/alexdev/http/Routes.java b/Havana-Web/src/main/java/org/alexdev/http/Routes.java index 9d4e8fb..667184d 100644 --- a/Havana-Web/src/main/java/org/alexdev/http/Routes.java +++ b/Havana-Web/src/main/java/org/alexdev/http/Routes.java @@ -282,6 +282,8 @@ public class Routes { // API RouteManager.addRoute("/api/advertisement/get_img", AdvertisementController::getImg); RouteManager.addRoute("/api/advertisement/get_url", AdvertisementController::getUrl); + RouteManager.addRoute("/api/ticket", TicketController::get); + RouteManager.addRoute("/api/login", TicketController::login); RouteManager.addRoute("/api/verify/get/*", VerifyController::get); RouteManager.addRoute("/api/verify/clear/*", VerifyController::clear); RouteManager.addRoute("/habbo-imaging/*", ImagerController::imager_redirect); diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/api/TicketController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/TicketController.java new file mode 100644 index 0000000..a2857a6 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/TicketController.java @@ -0,0 +1,117 @@ +package org.alexdev.http.controllers.api; + +import com.google.gson.GsonBuilder; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.UUID; + +public class TicketController { + public static void get(WebConnection webConnection) { + String ssoTicket = ""; + + if (webConnection.get().contains("username") && webConnection.get().contains("password")) { + var username = webConnection.get().getString("username"); + var password = webConnection.get().getString("password"); + + PlayerDetails details = new PlayerDetails(); + boolean hasError; + + if (username.isBlank() || password.isBlank()) { + hasError = true; + } else { + hasError = !PlayerDao.login(details, username, password); + } + + if (!hasError) { + ssoTicket = details.getSsoTicket(); + + // Update sso ticket + if (GameConfiguration.getInstance().getBoolean("reset.sso.after.login") || ssoTicket == null || ssoTicket.isBlank()) { + ssoTicket = UUID.randomUUID().toString(); + PlayerDao.setTicket(details.getId(), ssoTicket); + } + + var jsonDetails = new JsonDetails(); + + jsonDetails.host = GameConfiguration.getInstance().getString("loader.game.ip"); + jsonDetails.site = GameConfiguration.getInstance().getString("site.path"); + jsonDetails.shockwavePort = GameConfiguration.getInstance().getString("loader.game.port"); + jsonDetails.musPort = GameConfiguration.getInstance().getString("loader.mus.port"); + jsonDetails.flashPort = GameConfiguration.getInstance().getString("loader.flash.port"); + + jsonDetails.shockwaveDcr = GameConfiguration.getInstance().getString("loader.dcr.http"); + jsonDetails.shockwaveVariables = GameConfiguration.getInstance().getString("loader.external.variables").replace("https://", "http://"); + jsonDetails.shockwaveTexts = GameConfiguration.getInstance().getString("loader.external.texts").replace("https://", "http://"); + + jsonDetails.flashBase = GameConfiguration.getInstance().getString("loader.flash.base"); + jsonDetails.flashSwf = GameConfiguration.getInstance().getString("loader.flash.swf"); + jsonDetails.flashTexts = GameConfiguration.getInstance().getString("loader.flash.external.texts"); + jsonDetails.flashVariables = GameConfiguration.getInstance().getString("loader.flash.external.variables"); + + jsonDetails.ssoTicket = ssoTicket; + + var gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); + var response = ResponseBuilder.create("text/json", gson.toJson(jsonDetails)); + webConnection.send(response); + } + } + } + public static void login(WebConnection webConnection) { + String ssoTicket = ""; + + if (webConnection.get().contains("username") && webConnection.get().contains("password")) { + var username = webConnection.get().getString("username"); + var password = webConnection.get().getString("password"); + + PlayerDetails details = new PlayerDetails(); + boolean hasError; + + if (username.isBlank() || password.isBlank()) { + hasError = true; + } else { + hasError = !PlayerDao.login(details, username, password); + } + + if (!hasError) { + ssoTicket = details.getSsoTicket(); + + // Update sso ticket + if (GameConfiguration.getInstance().getBoolean("reset.sso.after.login") || ssoTicket == null || ssoTicket.isBlank()) { + ssoTicket = UUID.randomUUID().toString(); + PlayerDao.setTicket(details.getId(), ssoTicket); + } + + var response = ResponseBuilder.create(ssoTicket); + webConnection.send(response); + } + else { + var response = ResponseBuilder.create("ERROR Login invalid"); + webConnection.send(response); + } + } else { + var response = ResponseBuilder.create("ERROR No username or password supplied"); + webConnection.send(response); + } + } + + private static class JsonDetails + { + public String host; + public String site; + public String musPort; + public String shockwavePort; + public String shockwaveDcr; + public String shockwaveVariables; + public String shockwaveTexts; + public String flashPort; + public String flashBase; + public String flashSwf; + public String flashVariables; + public String flashTexts; + public String ssoTicket; + } +}