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;
+        }
+    }
+}