diff options
Diffstat (limited to 'main/app/sprinkles')
5 files changed, 80 insertions, 48 deletions
diff --git a/main/app/sprinkles/admin/routes/wormhole.php b/main/app/sprinkles/admin/routes/wormhole.php index 882a177..0883dba 100644 --- a/main/app/sprinkles/admin/routes/wormhole.php +++ b/main/app/sprinkles/admin/routes/wormhole.php @@ -4,6 +4,6 @@ */ $app->group('/wormhole/{access_token}', function () { $this->get('/verify/{user_id}/{session_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:verify'); - $this->get('/new/message/{sender_id}/{receiver_id}/{message}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:newMessage'); + $this->post('/new/message/{sender_id}/{receiver_id}/', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:newMessage'); $this->get('/user/{user_id}', 'UserFrosting\Sprinkle\Admin\Controller\WormholeController:getInfo'); }); diff --git a/main/app/sprinkles/admin/src/Controller/WormholeController.php b/main/app/sprinkles/admin/src/Controller/WormholeController.php index a2775f1..e7cd9aa 100644 --- a/main/app/sprinkles/admin/src/Controller/WormholeController.php +++ b/main/app/sprinkles/admin/src/Controller/WormholeController.php @@ -44,11 +44,11 @@ class WormholeController extends SimpleController } } - public function newMessage(Request $request, Response $response, $args) { + public function newMessage($request, Response $response, $args) { if ($this->verifyAccessToken($args)) { $sender_id = $args['sender_id']; $receiver_id = $args['receiver_id']; - $message = $args['message']; + $message = $request->getParsedBody()["message"]; if (($sender_id != $receiver_id) && $message) { DB::table('chat_messages') ->insert(['sender_id' => $sender_id, 'receiver_id' => $receiver_id, 'message' => $message]); @@ -82,7 +82,7 @@ class WormholeController extends SimpleController ->select("user_follow.user_id as id", "users.user_name as username") ->get(); - $UsersFriends = Capsule::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1"); + $UsersFriends = DB::select("SELECT id FROM (SELECT user_id AS id FROM user_follow WHERE followed_by_id = $user->id UNION ALL SELECT followed_by_id FROM user_follow WHERE user_id = $user->id) t GROUP BY id HAVING COUNT(id) > 1"); /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ $classMapper = $this->ci->classMapper; foreach ($UsersFriends as $Key => $UsersFriendId) { // NOT THAT EFFICIENT... diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js index 6dc67f0..ee30c04 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js @@ -45,10 +45,8 @@ function InitializeChatServer() { ChatSocket.onmessage = function (e) { // DECLARATIONS var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); - LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); var MessageObject = JSON.parse(e.data); var Message = MessageObject.Message; // ENCRYPTED MESSAGE (NOT ENCRYPTED ON SERVER MESSAGES) - Username = MessageObject.Username; var Fullname = MessageObject.Fullname; var Avatar = MessageObject.Avatar; var GroupName = MessageObject.GroupName; @@ -59,6 +57,10 @@ function InitializeChatServer() { var Granted = MessageObject.Granted; var Success = MessageObject.Success; + // GLOBAL OVERWRITES + LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); + Username = MessageObject.Username; + // GET OWN PUBLIC KEY FIRST if (!(current_username in PublicKey)) { 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 62ec9a2..5463aec 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 @@ -53,7 +53,6 @@ class ChatProcessor implements MessageComponentInterface $MessageObject = new \stdClass(); $MessageObject->ServerMessage = TRUE; - if (isset($this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name)) $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name; $MessageObject->ServerMessageType = "Verify"; if (isset($this->userInfo[$conn->resourceId]->id)) { // USER FOUND $MessageObject->Granted = TRUE; @@ -69,7 +68,6 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "Verify"; $MessageObject->Granted = FALSE; - if (isset($this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name)) $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name; $this->verifiedUsers[$conn->resourceId] = FALSE; $this->users[$conn->resourceId]->send(json_encode($MessageObject, TRUE)); $this->onClose($conn); @@ -101,35 +99,68 @@ class ChatProcessor implements MessageComponentInterface } break;*/ case "SetReceiver": // USER CLICKED ON NEW CHAT - foreach ($this->userInfo[$conn->resourceId]->friends as $friend) { - if ($data->ReceiversId === $friend->id) { - $this->ReceiversId[$conn->resourceId] = $data->ReceiversId; - } - } $MessageObject = new \stdClass(); $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "SetReceiver"; - $this->ReceiversId[$conn->resourceId] !== $data->ReceiversId ? $MessageObject->Success = FALSE : $MessageObject->Success = TRUE; + $MessageObject->Success = FALSE; // WILL BE PROBABLY OVERRIDDEN + foreach ($this->userInfo[$conn->resourceId]->friends as $friend) { // CHECK IF USERS ARE FRIENDS + if ($data->ReceiversId == $friend->id) { + $this->ReceiversId[$conn->resourceId] = $data->ReceiversId; + $MessageObject->Success = TRUE; // ARE FRIENDS + } + } $this->users[$conn->resourceId]->send(json_encode($MessageObject, TRUE)); break; case "ChatMessage": // MESSAGE RECEIVED $ReceiversId = $this->ReceiversId[$conn->resourceId]; - $ReceiversResourceId = $this->ResourceId[$ReceiversId]; - $MessageObject = new \stdClass(); - $MessageObject->ServerMessage = FALSE; - $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; - $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->full_name; - $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; - $MessageObject->Message = htmlspecialchars($data->Message); + if (isset($this->ResourceId[$ReceiversId])) { + $ReceiversResourceId = $this->ResourceId[$ReceiversId]; + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = FALSE; + $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; + $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->full_name; + $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; + $MessageObject->Message = htmlspecialchars($data->Message); - if ($data->EncryptedWithKeyOfUsername === $this->userInfo[$ReceiversResourceId]->user_name) { - $MessageObject->WasHimself = FALSE; - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$ReceiversResourceId]->send($MessageJson); // SEND TO RECEIVER - } else if ($data->EncryptedWithKeyOfUsername === $MessageObject->Username) { - $MessageObject->WasHimself = TRUE; - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$conn->resourceId]->send($MessageJson); // SEND TO SENDER (FOR VERIFICATION) + if ($data->EncryptedWithKeyOfUsername === $this->userInfo[$ReceiversResourceId]->user_name) { + $MessageObject->WasHimself = FALSE; + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$ReceiversResourceId]->send($MessageJson); // SEND TO RECEIVER + + // SAVE IN DATABASE + $url = "https://beam-messenger.de/wormhole/" . file("/AccessToken.txt", FILE_IGNORE_NEW_LINES)["0"] . "/new/message/" . $this->userInfo[$conn->resourceId]->id . "/" . $this->userInfo[$ReceiversResourceId]->id . "/"; + $data = array('message' => $data->Message); + $options = array( + 'http' => array( + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data) + ) + ); + $context = stream_context_create($options); + $result = file_get_contents($url, FALSE, $context); + if ($result === FALSE) { /* Handle error */ + } + + } else if ($data->EncryptedWithKeyOfUsername === $MessageObject->Username) { + $MessageObject->WasHimself = TRUE; + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$conn->resourceId]->send($MessageJson); // SEND TO SENDER (FOR VERIFICATION) + } + } else { // USER ISN'T ONLINE -> ONLY STORE IN DATABASE + $url = "https://beam-messenger.de/wormhole/" . file("/AccessToken.txt", FILE_IGNORE_NEW_LINES)["0"] . "/new/message/" . $this->userInfo[$conn->resourceId]->id . "/" . $this->ReceiversId[$conn->resourceId] . "/"; + $data = array('message' => $data->Message); + $options = array( + 'http' => array( + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data) + ) + ); + $context = stream_context_create($options); + $result = file_get_contents($url, FALSE, $context); + if ($result === FALSE) { /* Handle error */ + } } break; case "GroupMessage": // GROUP MESSAGE RECEIVED -- RESERVED FOR LATER USE (CHANNEL BASED RIGHT NOW) @@ -140,7 +171,6 @@ class ChatProcessor implements MessageComponentInterface $MessageObject = new \stdClass(); $MessageObject->ServerMessage = FALSE; $MessageObject->GroupName = $channel; - if (isset($this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name)) $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name; $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->full_name; $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; @@ -154,24 +184,21 @@ class ChatProcessor implements MessageComponentInterface } break; case "TypingState": // USER STARTED TYPING - if (isset($this->channels[$conn->resourceId])) { - $target = $this->channels[$conn->resourceId]; - foreach ($this->channels as $id => $channel) { - if ($channel == $target) { - $MessageObject = new \stdClass(); - $MessageObject->ServerMessage = TRUE; - $MessageObject->ServerMessageType = "TypingState"; - $MessageObject->GroupName = $channel; - if (isset($this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name)) $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name; - $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; - $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->full_name; - $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; - $MessageObject->State = $data->State; - $id === $conn->resourceId ? $MessageObject->WasHimself = TRUE : $MessageObject->WasHimself = FALSE; - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$id]->send($MessageJson); - } - } + // GET RECEIVERS DATA + $ReceiversId = $this->ReceiversId[$conn->resourceId]; + if (isset($this->ResourceId[$ReceiversId])) { // ONLY SEND IF OTHER USER EXISTS + $ReceiversResourceId = $this->ResourceId[$ReceiversId]; + $MessageObject = new \stdClass(); + $MessageObject->ServerMessage = TRUE; + $MessageObject->ServerMessageType = "TypingState"; + $MessageObject->Receiver = $this->userInfo[$ReceiversResourceId]->user_name; + $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; + $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->full_name; + $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; + $MessageObject->State = $data->State; + $ReceiversResourceId === $conn->resourceId ? $MessageObject->WasHimself = TRUE : $MessageObject->WasHimself = FALSE; + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$ReceiversResourceId]->send($MessageJson); } break; } diff --git a/main/app/sprinkles/core/src/ServicesProvider/ServicesProvider.php b/main/app/sprinkles/core/src/ServicesProvider/ServicesProvider.php index 62d8382..27544c7 100644 --- a/main/app/sprinkles/core/src/ServicesProvider/ServicesProvider.php +++ b/main/app/sprinkles/core/src/ServicesProvider/ServicesProvider.php @@ -238,6 +238,9 @@ class ServicesProvider $csrfBlacklist['^/' . $config['assets.raw.path']] = [ 'GET' ]; + $csrfBlacklist['^/wormhole'] = [ + 'POST' + ]; $config->set('csrf.blacklist', $csrfBlacklist); |