From bf527e31d2946a15d9c692653bbc9202ef35af39 Mon Sep 17 00:00:00 2001 From: stijnb1234 <stijnbannink23@gmail.com> Date: Wed, 6 May 2020 11:52:51 +0200 Subject: [PATCH] Added pinmanager and message AUTH event. --- src/me/mctp/managers/PinManager.java | 72 ++++++++++++++++++++++++++++ src/me/mctp/socket/Client.java | 34 ++++++++++++- src/me/mctp/socket/JSONUtil.java | 41 ++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 src/me/mctp/managers/PinManager.java create mode 100644 src/me/mctp/socket/JSONUtil.java diff --git a/src/me/mctp/managers/PinManager.java b/src/me/mctp/managers/PinManager.java new file mode 100644 index 0000000..e4409c7 --- /dev/null +++ b/src/me/mctp/managers/PinManager.java @@ -0,0 +1,72 @@ +package me.mctp.managers; + +import java.security.SecureRandom; +import java.util.UUID; +import java.util.WeakHashMap; + +public class PinManager { + private static WeakHashMap<UUID, String> pins = new WeakHashMap<>(); + + /** + * Get the pin of a player + * + * @param pUUID The player UUID + * + * @return The pin + */ + public static String getPIN(UUID pUUID) { + if (pUUID == null) return null; + + if (!pins.containsKey(pUUID)) { + StringBuilder builder = new StringBuilder(); + SecureRandom random = new SecureRandom(); + for (int i = 0; i < 9; ++i) { + builder.append(random.nextInt(9)); + } + String pin = builder.toString(); + + pins.put(pUUID, pin); + return pin; + } else { + return pins.get(pUUID); + } + } + + /** + * Check if a player has a pin + * + * @param pUUID The player UUID + * + * @return The pin + */ + public static boolean hasPin(UUID pUUID) { + return pUUID != null && pins.containsKey(pUUID); + } + + /** + * Check if the pin is correct + * + * @param pUUID The player UUID + * @param pin The pin + * + * @return true/false + */ + public static boolean checkPin(UUID pUUID, String pin) { + if (pUUID == null || pin == null || pin.isEmpty()) { + return false; + } + + return pins.containsKey(pUUID) && pin.equals(pins.get(pUUID)); + } + + /** + * Remove the pin + * + * @param pUUID The player UUID + */ + public static void removePin(UUID pUUID) { + if (pUUID != null) { + pins.remove(pUUID); + } + } +} diff --git a/src/me/mctp/socket/Client.java b/src/me/mctp/socket/Client.java index 8e733d5..ea7664a 100644 --- a/src/me/mctp/socket/Client.java +++ b/src/me/mctp/socket/Client.java @@ -1,13 +1,16 @@ package me.mctp.socket; import me.mctp.Main; +import me.mctp.managers.PinManager; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import org.json.simple.JSONObject; import java.net.URI; import java.net.URISyntaxException; +import java.util.UUID; public class Client { private String url; @@ -48,7 +51,36 @@ public class Client { @Override public void onMessage(String s) { - //TODO Add message handler + JSONObject json = JSONUtil.parse(s); + if (json == null) return; + + String str = JSONUtil.getValue(json, "action"); + if (str == null || str.isEmpty()) return; + + if (str.equals("VERIFY")) { + String uuid = JSONUtil.getValue(json, "uuid"); + if (uuid == null || uuid.isEmpty()) return; + + String pin = JSONUtil.getValue(json, "pin"); + if (pin == null || pin.isEmpty()) return; + + UUID pUUID = UUID.fromString(JSONUtil.fixUUID(uuid)); + boolean verified = true; + Player player = Bukkit.getPlayer(uuid); + if (player == null || !player.isOnline()) { + verified = false; + } + + if (!PinManager.checkPin(pUUID, pin)) { + verified = false; + } + + JSONObject reply = new JSONObject(); + reply.put("action", "AUTHENTICATION"); + reply.put("verified", verified); + reply.put("uuid", uuid); + this.send(reply.toJSONString()); + } } @Override diff --git a/src/me/mctp/socket/JSONUtil.java b/src/me/mctp/socket/JSONUtil.java new file mode 100644 index 0000000..8599059 --- /dev/null +++ b/src/me/mctp/socket/JSONUtil.java @@ -0,0 +1,41 @@ +package me.mctp.socket; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +public class JSONUtil { + public static JSONObject parse(String string) { + try { + JSONParser parser = new JSONParser(); + return (JSONObject) parser.parse(string); + } catch (ParseException ignored) { } + return null; + } + + public static String getValue(JSONObject object, String string) { + if (object != null && !object.isEmpty()) { + Object obj = object.get(string); + String str = null; + if (obj != null) str = String.valueOf(obj); + return str; + } + return null; + } + + public static String fixUUID(String uuid) { + if (uuid != null && !uuid.isEmpty()) { + StringBuilder sb = new StringBuilder(uuid); + sb.insert(8, "-"); + sb = new StringBuilder(sb.toString()); + sb.insert(13, "-"); + sb = new StringBuilder(sb.toString()); + sb.insert(18, "-"); + sb = new StringBuilder(sb.toString()); + sb.insert(23, "-"); + return sb.toString(); + } else { + return null; + } + } +}