diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/app/sprinkles/core/assets/SiteAssets/js/chat.js | 11 | ||||
-rw-r--r-- | main/app/sprinkles/core/assets/SiteAssets/php/Chatserver/src/ChatProcessor.php | 138 |
2 files changed, 85 insertions, 64 deletions
diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js index f131db1..2cc90cb 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js @@ -10,17 +10,16 @@ function InitializeChatServer() { var ChatSocket = new WebSocket('wss://marvinborner.ddnss.de:1337'); ChatSocket.onerror = function () { setTimeout(function () { - console.log("[WEBSOCKET LOGGER] Connection failed. Trying again..."); + console.log("[CHATSOCKET LOGGER] Connection failed. Trying again..."); InitializeChatServer(); }, 5000); }; ChatSocket.onopen = function () { ChatSocket.send(JSON.stringify({ClientMessageType: "Verify", Cookie: document.cookie, UserID: current_user_id})); // CONNECTION SUCCESSFUL! - console.log("[WEBSOCKET LOGGER] Chat connection established!"); + console.log("[CHATSOCKET LOGGER] Chat connection established!"); // GOT MESSAGE ChatSocket.onmessage = function (e) { - console.log("[WEBSOCKET LOGGER] Received a message from server!"); // DECLARATIONS var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); @@ -34,6 +33,7 @@ function InitializeChatServer() { var ServerMessageType = MessageObject.ServerMessageType; if (ServerMessage === false) { // NO SERVER MESSAGE -> SENT BY USER + console.log("[CHATSOCKET LOGGER] Received a message from user!"); if (WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF if (!LastMessage.hasClass("MessageSent")) { // CHECK IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE ChatMessages.append("<div class='MessageWrapper Normal'><div class='ChatMessage MessageSent AloneMessage animated fadeInRight'>" + Message + "</div></div>"); @@ -66,6 +66,7 @@ function InitializeChatServer() { target: "_blank" }); } else if (ServerMessage === true) { // SERVER MESSAGE + console.log("[CHATSOCKET LOGGER] Received a message from server!"); if (ServerMessageType === "GroupJoin") { // TYPE: USER JOINED A GROUP if (WasHimself === true) { // HIMSELF JOINED A GROUP -> NOTIFY ChatMessages.empty(); // -> EMPTY MESSAGES ON NEW GROUP JOIN @@ -78,7 +79,7 @@ function InitializeChatServer() { } else if (ServerMessageType === "UserDisconnect") { // TYPE: USER DISCONNECTED -> NOTIFY ChatMessages.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + Username + "</span></div></div><br>"); ReplaceServerMessage("UserDisconnect"); // FOR TRANSLATION - } else if (ServerMessageType === "TypingState") { // SOMEBODY'S TYPING STATE CHANGED! + } else if (ServerMessageType === "TypingState") { // TYPE: SOMEBODY'S TYPING STATE CHANGED! if (State === true) { // IF 'SOMEBODY' STARTED TYPING if (WasHimself === true) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STARTS TYPING?) // NOTHING @@ -95,6 +96,8 @@ function InitializeChatServer() { console.log("[SERVER REPORT] " + Username + " STOPPED TYPING"); } } + } else if (ServerMessageType === "Verify") { // TYPE: SERVER CHECKED ACCESS + } } // SCROLL TO BOTTOM ON NEW MESSAGE OF ANY KIND diff --git a/main/app/sprinkles/core/assets/SiteAssets/php/Chatserver/src/ChatProcessor.php b/main/app/sprinkles/core/assets/SiteAssets/php/Chatserver/src/ChatProcessor.php index 17e85b9..6436a50 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/php/Chatserver/src/ChatProcessor.php +++ b/main/app/sprinkles/core/assets/SiteAssets/php/Chatserver/src/ChatProcessor.php @@ -14,12 +14,14 @@ class ChatProcessor implements MessageComponentInterface private $subscriptions; private $users; private $connectedUsersNames; + private $verifiedUsers; public function __construct() { $this->clients = new \SplObjectStorage; $this->subscriptions = []; $this->users = []; $this->connectedUsersNames = []; + $this->verifiedUsers = []; } public function onOpen(ConnectionInterface $conn) { @@ -32,35 +34,45 @@ class ChatProcessor implements MessageComponentInterface public function onMessage(ConnectionInterface $conn, MessageInterface $msg) { $data = json_decode($msg); switch ($data->ClientMessageType) { - case "Subscribe": - $this->subscriptions[$conn->resourceId] = $data->Channel; - foreach ($this->subscriptions as $id => $channel) { - if ($this->subscriptions[$conn->resourceId] == $channel) { - $MessageObject = new \stdClass(); - $MessageObject->ServerMessage = TRUE; - $MessageObject->ServerMessageType = "GroupJoin"; - $MessageObject->GroupName = $channel; - $MessageObject->Username = $this->connectedUsersNames[$conn->resourceId]; - if ($id === $conn->resourceId) { - $MessageObject->WasHimself = TRUE; - } else { - $MessageObject->WasHimself = FALSE; - } - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$id]->send($MessageJson); - } + case "Verify": // USER WANTS TO GET VERIFIED + $headerCookies = explode('; ', $data->Cookie); + $cookies = array(); + foreach ($headerCookies as $headerCookie) { + list($key, $val) = explode('=', $headerCookie, 2); + $cookies[$key] = $val; + } + $UserSessionKey = $cookies["uf4"]; + $AccessToken = file("/AccessToken.txt", FILE_IGNORE_NEW_LINES)["0"]; // SECRET + $KeyVerifierCode = $this->getHttpCode("https://beam-messenger.de/wormhole/" . $AccessToken . "/verify/" . $data->UserID . "/" . $UserSessionKey); + if ($KeyVerifierCode === "200") { + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = TRUE; + $MessageObject->ServerMessageType = "Verify"; + $MessageObject->Granted = TRUE; + $this->verifiedUsers[$conn->resourceId] = TRUE; + $this->users[$conn->resourceId]->send(json_encode($MessageObject, TRUE)); + } else { + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = TRUE; + $MessageObject->ServerMessageType = "Verify"; + $MessageObject->Granted = FALSE; + $this->verifiedUsers[$conn->resourceId] = FALSE; + $this->users[$conn->resourceId]->send(json_encode($MessageObject, TRUE)); + $this->clients->detach($conn); } break; - case "Message": - if (isset($this->subscriptions[$conn->resourceId])) { - $target = $this->subscriptions[$conn->resourceId]; + } + if ($this->verifiedUsers[$conn->resourceId]) { + switch ($data->ClientMessageType) { + case "Subscribe": // USER SUBSCRIBED + $this->subscriptions[$conn->resourceId] = $data->Channel; foreach ($this->subscriptions as $id => $channel) { - if ($channel == $target) { + if ($this->subscriptions[$conn->resourceId] == $channel) { $MessageObject = new \stdClass(); - $MessageObject->ServerMessage = FALSE; + $MessageObject->ServerMessage = TRUE; + $MessageObject->ServerMessageType = "GroupJoin"; $MessageObject->GroupName = $channel; $MessageObject->Username = $this->connectedUsersNames[$conn->resourceId]; - $MessageObject->Message = htmlspecialchars($data->Message); if ($id === $conn->resourceId) { $MessageObject->WasHimself = TRUE; } else { @@ -70,46 +82,51 @@ class ChatProcessor implements MessageComponentInterface $this->users[$id]->send($MessageJson); } } - } - break; - case "TypingState": - if (isset($this->subscriptions[$conn->resourceId])) { - $target = $this->subscriptions[$conn->resourceId]; - foreach ($this->subscriptions as $id => $channel) { - if ($channel == $target) { - $MessageObject = new \stdClass(); - $MessageObject->ServerMessage = TRUE; - $MessageObject->ServerMessageType = "TypingState"; - $MessageObject->GroupName = $channel; - $MessageObject->Username = $this->connectedUsersNames[$conn->resourceId]; - $MessageObject->State = $data->State; - if ($id === $conn->resourceId) { - $MessageObject->WasHimself = TRUE; - } else { - $MessageObject->WasHimself = FALSE; + break; + case "Message": // MESSAGE RECEIVED + if (isset($this->subscriptions[$conn->resourceId])) { + $target = $this->subscriptions[$conn->resourceId]; + foreach ($this->subscriptions as $id => $channel) { + if ($channel == $target) { + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = FALSE; + $MessageObject->GroupName = $channel; + $MessageObject->Username = $this->connectedUsersNames[$conn->resourceId]; + $MessageObject->Message = htmlspecialchars($data->Message); + if ($id === $conn->resourceId) { + $MessageObject->WasHimself = TRUE; + } else { + $MessageObject->WasHimself = FALSE; + } + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$id]->send($MessageJson); } - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$id]->send($MessageJson); } } - } - break; - case "Verify": - $headerCookies = explode('; ', $data->Cookie); - $cookies = array(); - foreach ($headerCookies as $headerCookie) { - list($key, $val) = explode('=', $headerCookie, 2); - $cookies[$key] = $val; - } - $UserSessionKey = $cookies["uf4"]; - $AccessToken = file_get_contents("/AccessToken.txt"); // SECRET - $KeyVerifierCode = $this->getHttpCode("https://beam-messenger.de/wormhole/" . $AccessToken . "/verify/" . $data->UserID . "/" . $UserSessionKey); - if ($KeyVerifierCode === 200) { - echo "Access granted"; - } else { - echo "Access denied"; - } - break; + break; + case "TypingState": // USER STARTED TYPING + if (isset($this->subscriptions[$conn->resourceId])) { + $target = $this->subscriptions[$conn->resourceId]; + foreach ($this->subscriptions as $id => $channel) { + if ($channel == $target) { + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = TRUE; + $MessageObject->ServerMessageType = "TypingState"; + $MessageObject->GroupName = $channel; + $MessageObject->Username = $this->connectedUsersNames[$conn->resourceId]; + $MessageObject->State = $data->State; + if ($id === $conn->resourceId) { + $MessageObject->WasHimself = TRUE; + } else { + $MessageObject->WasHimself = FALSE; + } + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$id]->send($MessageJson); + } + } + } + break; + } } } @@ -130,6 +147,7 @@ class ChatProcessor implements MessageComponentInterface } } } + unset($this->verifiedUsers[$conn->resourceId]); unset($this->users[$conn->resourceId]); unset($this->subscriptions[$conn->resourceId]); unset($this->connectedUsersNames[$conn->resourceId]); |