diff options
Diffstat (limited to 'main')
6 files changed, 123 insertions, 71 deletions
diff --git a/main/app/sprinkles/admin/src/Controller/WormholeController.php b/main/app/sprinkles/admin/src/Controller/WormholeController.php index e40a7e3..47e6fcb 100644 --- a/main/app/sprinkles/admin/src/Controller/WormholeController.php +++ b/main/app/sprinkles/admin/src/Controller/WormholeController.php @@ -30,6 +30,13 @@ use Illuminate\Session\FileSessionHandler; */ class WormholeController extends SimpleController { + /** + * @param Request $request + * @param Response $response + * @param $args + * @return Response + * @throws NotFoundException + */ public function verify(Request $request, Response $response, $args) { if ($this->verifyAccessToken($args)) { $user_id = $args['user_id']; @@ -44,14 +51,23 @@ class WormholeController extends SimpleController } } + /** + * @param $request + * @param Response $response + * @param $args + * @return Response + * @throws BadRequestException + * @throws NotFoundException + */ public function newMessage($request, Response $response, $args) { if ($this->verifyAccessToken($args)) { $sender_id = $args['sender_id']; $receiver_id = $args['receiver_id']; $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]); + $MessageId = DB::table('chat_messages') + ->insertGetId(['sender_id' => $sender_id, 'receiver_id' => $receiver_id, 'message' => $message], 'message_id'); + $response->write($MessageId); return $response->withStatus(200); } else { throw new BadRequestException(); @@ -59,6 +75,13 @@ class WormholeController extends SimpleController } } + /** + * @param Request $request + * @param Response $response + * @param $args + * @return Response + * @throws NotFoundException + */ public function getInfo(Request $request, Response $response, $args) { /** @var UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ $classMapper = $this->ci->classMapper; @@ -104,6 +127,11 @@ class WormholeController extends SimpleController } } + /** + * @param $args + * @return bool + * @throws NotFoundException + */ private function verifyAccessToken($args) { $currentUser = $this->ci->currentUser; // FOR DATABASE QUERY $access_token = $args['access_token']; @@ -113,7 +141,7 @@ class WormholeController extends SimpleController ->exists()) { return TRUE; } else { - throw new NotFoundException(); + throw new NotFoundException(); // IT'S A FORBIDDEN } } }
\ No newline at end of file diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js index 484102d..4e766df 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js @@ -1,30 +1,30 @@ /** - * ENCRYPTION + * GLOBAL DECLARATIONS */ -var ReceiversUsername, ReceiversId; -var openpgp = window.openpgp; -var options, EncryptedMessage, DecryptedMessage; -var PublicKey = []; -openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); -var privKeyObj = openpgp.key.readArmored(localStorage.getItem("PrivateKey").replace(/\r/, "")).keys[0]; -privKeyObj.decrypt(localStorage.getItem("🔒")); +let LastMessage, Username, ReceiversUsername, ReceiversId, options, EncryptedMessage, DecryptedMessage; /** - * GLOBAL DECLARATIONS + * INITIAL ENCRYPTION CONFIGURATION */ -var LastMessage, Username; +const openpgp = window.openpgp; +const PublicKey = []; +openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); +const privKeyObj = openpgp.key.readArmored(localStorage.getItem("PrivateKey").replace(/\r/, "")).keys[0]; +privKeyObj.decrypt(localStorage.getItem("🔒")); /** * GENERAL CHAT */ function InitializeChatServer() { - var ChatTextInput = $("#ChatTextInput"); - var SubscribeTextInput = $("#SubscribeTextInput"); - var ChatMessages = $("#ChatMessages"); - var TypingIndicatorAnimationElement = "<div class='spinner'><div class='bounce1'></div><div class='bounce2'></div><div class='bounce3'></div></div>"; + const ChatTextInput = $("#ChatTextInput"); + const SubscribeTextInput = $("#SubscribeTextInput"); + const ChatMessages = $("#ChatMessages:visible"); + const SelectReceiver = $(".SelectReceiver"); + const SelectedReceiver = $(".SelectedReceiver"); + const TypingIndicatorAnimationElement = "<div class='spinner'><div class='bounce1'></div><div class='bounce2'></div><div class='bounce3'></div></div>"; - var WebSocketConnectTimerStart = performance.now(); // START CONNECTION EXECUTION TIMER + const WebSocketConnectTimerStart = performance.now(); // START CONNECTION EXECUTION TIMER const ChatSocket = new WebSocket('wss://marvinborner.ddnss.de:1337'); ChatSocket.onerror = function () { setTimeout(function () { @@ -34,7 +34,7 @@ function InitializeChatServer() { }; ChatSocket.onopen = function () { // CONNECTION SUCCESSFUL! - var WebSocketConnectTimerEnd = performance.now(); // END CONNECTION EXECUTION TIMER + const WebSocketConnectTimerEnd = performance.now(); // END CONNECTION EXECUTION TIMER console.log("%c[CHATSOCKET LOGGER] Chat connection established! (Took " + +(WebSocketConnectTimerEnd - WebSocketConnectTimerStart) + " milliseconds)", "color: darkorange"); // START VERIFICATION ChatSocket.send(JSON.stringify({ @@ -46,18 +46,20 @@ function InitializeChatServer() { // GOT MESSAGE ChatSocket.onmessage = function (e) { // DECLARATIONS - var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); - var MessageObject = JSON.parse(e.data); - var Message = MessageObject.Message; // ENCRYPTED MESSAGE (NOT ENCRYPTED ON SERVER MESSAGES) - var Fullname = MessageObject.Fullname; - var Avatar = MessageObject.Avatar; - var GroupName = MessageObject.GroupName; - var State = MessageObject.State; - var ServerMessage = MessageObject.ServerMessage; - var WasHimself = MessageObject.WasHimself; - var ServerMessageType = MessageObject.ServerMessageType; - var Granted = MessageObject.Granted; - var Success = MessageObject.Success; + const TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); + const CurrentChatMessagesWindow = $(".SelectedReceiver #ChatMessages[data-username=" + ReceiversUsername + "]"); + const MessageObject = JSON.parse(e.data); + const Message = MessageObject.Message; // ENCRYPTED MESSAGE (NOT ENCRYPTED ON SERVER MESSAGES) + const MessageId = MessageObject.MessageId; + const Fullname = MessageObject.Fullname; + const Avatar = MessageObject.Avatar; + const GroupName = MessageObject.GroupName; + const ServerMessageType = MessageObject.ServerMessageType; + let State = MessageObject.State; + let ServerMessage = MessageObject.ServerMessage; + let WasHimself = MessageObject.WasHimself; + let Granted = MessageObject.Granted; + let Success = MessageObject.Success; // GLOBAL OVERWRITES LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); @@ -114,9 +116,9 @@ function InitializeChatServer() { } }); if (!LastMessage.hasClass("MessageReceived")) { // CHECK IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE - ChatMessages.append("<div class='MessageWrapper Normal'><div class='ChatMessage MessageReceived AloneMessage animated fadeInLeft'>" + DecryptedMessage + "</div></div>"); + CurrentChatMessagesWindow.append("<div class='MessageWrapper Normal'><div id='" + MessageId + "' class='ChatMessage MessageReceived AloneMessage animated fadeInLeft'>" + DecryptedMessage + "</div></div>"); } else if (LastMessage.hasClass("MessageReceived")) { // IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN - ChatMessages.append("<div class='MessageWrapper Normal'><div class='ChatMessage MessageReceived BottomMessage animated fadeInLeft'>" + DecryptedMessage + "</div></div>"); + CurrentChatMessagesWindow.append("<div class='MessageWrapper Normal'><div id='" + MessageId + "' class='ChatMessage MessageReceived BottomMessage animated fadeInLeft'>" + DecryptedMessage + "</div></div>"); if (LastMessage.hasClass("AloneMessage")) { LastMessage.removeClass("AloneMessage"); LastMessage.addClass("TopMessage"); @@ -132,20 +134,20 @@ function InitializeChatServer() { $('.ChatMessage').linkify({ target: "_blank" }); - } else if (ServerMessage) { // SERVER MESSAGE + } else { // SERVER MESSAGE if (ServerMessageType === "GroupJoin") { // TYPE: USER JOINED A GROUP if (WasHimself) { // HIMSELF JOINED A GROUP -> NOTIFY - ChatMessages.empty(); // -> EMPTY MESSAGES ON NEW GROUP JOIN - ChatMessages.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + GroupName + "</span></div></div><br>"); + CurrentChatMessagesWindow.empty(); // -> EMPTY MESSAGES ON NEW GROUP JOIN + CurrentChatMessagesWindow.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + GroupName + "</span></div></div><br>"); ReplaceServerMessage("YouGroupJoin"); // FOR TRANSLATION console.log("%c[CHATSOCKET LOGGER] You joined the group " + GroupName + "!", "color: darkorange"); } else if (!WasHimself) { // OTHER USER JOINED A GROUP -> NOTIFY - ChatMessages.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + Username + "</span></div></div><br>"); + CurrentChatMessagesWindow.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + Username + "</span></div></div><br>"); ReplaceServerMessage("UserGroupJoin"); // FOR TRANSLATION console.log("%c[CHATSOCKET LOGGER] " + Username + " joined the group!", "color: darkorange"); } } else if (ServerMessageType === "UserDisconnect") { // TYPE: USER DISCONNECTED -> NOTIFY - ChatMessages.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + Username + "</span></div></div><br>"); + CurrentChatMessagesWindow.append("<br><div class='MessageWrapper'><div class='ServerChatMessage'>" + Username + "</span></div></div><br>"); ReplaceServerMessage("UserDisconnect"); // FOR TRANSLATION console.log("%c[CHATSOCKET LOGGER] " + Username + " disconnected from server!", "color: darkorange"); } else if (ServerMessageType === "TypingState") { // TYPE: SOMEBODY'S TYPING STATE CHANGED! @@ -153,7 +155,7 @@ function InitializeChatServer() { if (WasHimself) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STARTS TYPING?) console.log("%c[CHAT TYPING LOGGER] You started typing!", "color: gray"); } else if (!WasHimself) { // IDENTIFY 'SOMEBODY' -> WAS OTHER USER -> SHOW TYPING ANIMATION ON RECEIVER'S SIDE - ChatMessages.append("<div class='MessageWrapper'><div class='ChatMessage TypingIndicatorMessage AloneMessage'>" + TypingIndicatorAnimationElement + "</div></div>"); + CurrentChatMessagesWindow.append("<div class='MessageWrapper'><div class='ChatMessage TypingIndicatorMessage AloneMessage'>" + TypingIndicatorAnimationElement + "</div></div>"); console.log("%c[CHAT TYPING LOGGER] " + Username + " started typing!", "color: gray"); } } else if (!State) { // IF 'SOMEBODY' STOPPED TYPING @@ -175,25 +177,28 @@ function InitializeChatServer() { } else if (ServerMessageType === "SetReceiver") { // TYPE: SERVER CHECKED ACCESS -- MOSTLY HANDLED IN BACKEND if (Success) { console.log("%c[CHATSOCKET LOGGER] Setting receiver succeeded!", "color: green"); - $(".SelectReceiver").hide(); + SelectReceiver.hide(); + ChatMessages.hide(); $(".SelectedReceiver > *").addClass("animated slideInRight"); $(".ChatTab .headerWrap .header .HeaderCaption").text(ReceiversUsername); - $(".SelectedReceiver").show(); + SelectedReceiver.prepend("<div id='ChatMessages' class='ChatMessages' data-username='" + ReceiversUsername + "'></div>"); + SelectedReceiver.show(); + $(".SelectedReceiver #ChatMessages[data-username=" + ReceiversUsername + "]").show(); } else if (!Success) { console.log("%c[CHATSOCKET LOGGER] Setting receiver failed!", "color: red"); } } } // SCROLL TO BOTTOM ON NEW MESSAGE OF ANY KIND - if ((ChatMessages.scrollTop() + ChatMessages.innerHeight() < ChatMessages[0].scrollHeight)) { - ChatMessages.animate({scrollTop: document.querySelector("#ChatMessages").scrollHeight}); + if ((CurrentChatMessagesWindow.scrollTop() + CurrentChatMessagesWindow.innerHeight() < CurrentChatMessagesWindow[0].scrollHeight)) { + CurrentChatMessagesWindow.animate({scrollTop: document.querySelector("#ChatMessages").scrollHeight}); } }; // TYPING RECOGNITION - var typingTimer; - var isTyping = false; + let typingTimer; + let isTyping = false; ChatTextInput.keydown(function () { sendStartTyping(); @@ -252,7 +257,7 @@ function InitializeChatServer() { if (e.keyCode === 13 && ChatTextInput.val().length > 0) { const ChatTextInputText = ChatTextInput.val(); ChatTextInput.val(""); - var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); + const LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); 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'>" + ChatTextInputText + "</div></div>"); } else if (LastMessage.hasClass("MessageSent")) { // IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/encryption.js b/main/app/sprinkles/core/assets/SiteAssets/js/encryption.js index 00162a2..0b406e7 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/encryption.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/encryption.js @@ -4427,7 +4427,7 @@ S ? A.emit("unhandledRejection", i, e) : (r = u.onunhandledrejection) ? r({ promise: e, reason: i - }) : (n = u.console) && n.error && n.error("Unhandled promise rejection", i) + }) : ""//(n = u.console) && n.error && n.error("Unhandled promise rejection", i) }), e._h = S || U(e) ? 2 : 1), e._a = void 0, a && t.e) throw t.v }) }, U = function (e) { diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/main.js b/main/app/sprinkles/core/assets/SiteAssets/js/main.js index 0a991fc..a65d637 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/main.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/main.js @@ -1,13 +1,14 @@ -var MainTabWindows = $(".MainTabWindows"); -var NavbarIconWrap = $(".NavbarIconWrap"); -var Navbar = $(".Navbar"); -var NavbarLine = $(".NavbarLine"); -var UserSearchBar = $("#UserSearchBar"); -var SearchResults = $(".SearchResults"); -var SelectReceiver = $(".SelectReceiver"); -var FriendList = $(".FriendList"); -var alerts = $("#alerts-page"); -var ExploreData = $("#ExploreData"); +const MainTabWindows = $(".MainTabWindows"); +const FeedTabWindow = $(".FeedTabWindow"); +const NavbarIconWrap = $(".NavbarIconWrap"); +const Navbar = $(".Navbar"); +const NavbarLine = $(".NavbarLine"); +const UserSearchBar = $("#UserSearchBar"); +const SearchResults = $(".SearchResults"); +const SelectReceiver = $(".SelectReceiver"); +const FriendList = $(".FriendList"); +const alerts = $("#alerts-page"); +const ExploreData = $("#ExploreData"); /** @@ -21,7 +22,7 @@ var ExploreData = $("#ExploreData"); * POPUPS */ function triggerErrorPopup(ErrorCode) { - var ErrorMessage = "Unknown Error occurred!", ErrorInformationSite = "", AlsoLogInConsole = true; // WILL BE REWRITTEN (EXCEPT SOMETHING CRAZY HAPPENS) + let ErrorMessage = "Unknown Error occurred!", ErrorInformationSite = "", AlsoLogInConsole = true; // WILL BE REWRITTEN (EXCEPT SOMETHING CRAZY HAPPENS) switch (ErrorCode) { case "ChatNotAllowed": AlsoLogInConsole = false; @@ -41,8 +42,8 @@ function triggerErrorPopup(ErrorCode) { * OLD BROWSER * @type {boolean} */ -var isIE = /*@cc_on!@*/false || !!document.documentMode; -var isEdge = !isIE && !!window.StyleMedia; +let isIE = /*@cc_on!@*/false || !!document.documentMode; +const isEdge = !isIE && !!window.StyleMedia; if (isIE || isEdge) { alert("Sorry, your browser is currently not supported. " + "Please update to a newer browser if you are facing any kind of issues. " + @@ -52,7 +53,7 @@ if (isIE || isEdge) { /** * NAVBAR */ -var $el, leftPos, newWidth; +let $el, leftPos, newWidth; NavbarLine .css("left", $(".ActiveTab").position().left) .data("origLeft", NavbarLine.position().left) @@ -108,7 +109,7 @@ MainTabWindows.on('beforeChange', function (event, slick, currentSlide, nextSlid */ UserSearchBar.keyup(function () { SearchResults.empty(); - var RequestedUser = UserSearchBar.val(); + const RequestedUser = UserSearchBar.val(); if (RequestedUser !== " " && RequestedUser !== "") $.ajax({ url: site.uri.public + "/api/users/u/" + RequestedUser, @@ -148,4 +149,17 @@ $(document).ready(function () { alerts.ufAlerts().ufAlerts('fetch'); } }); + $.ajax({ + url: site.uri.public + "/api/feed/" + current_username, + success: function (images) { + images.forEach(function (imageInfo) { + FeedTabWindow.append("<img class='FeedImage' src='" + imageInfo.image_url + "'><br>"); + }) + }, + error: function () { + console.log("%c[FEED LOGGER] No images in feed!", "color: red"); + + alerts.ufAlerts().ufAlerts('fetch'); + } + }); }); 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 30944c6..90ed22e 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 @@ -122,11 +122,7 @@ class ChatProcessor implements MessageComponentInterface if (isset($this->ResourceId[$ReceiversId])) { // USER IS ONLINE $ReceiversResourceId = $this->ResourceId[$ReceiversId]; - if ($data->EncryptedWithKeyOfUsername === $this->userInfo[$ReceiversResourceId]->user_name) { - $MessageObject->WasHimself = FALSE; - $MessageJson = json_encode($MessageObject, TRUE); - $this->users[$ReceiversResourceId]->send($MessageJson); // SEND TO RECEIVER - + if ($data->EncryptedWithKeyOfUsername === $this->userInfo[$ReceiversResourceId]->user_name) { // MESSAGE FOR 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); @@ -140,9 +136,15 @@ class ChatProcessor implements MessageComponentInterface $context = stream_context_create($options); $result = file_get_contents($url, FALSE, $context); if ($result === FALSE) { /* Handle error */ + } else { + $MessageObject->MessageId = $result; // MESSAGE ID GETS SEND IN ANSWER } - } else if ($data->EncryptedWithKeyOfUsername === $MessageObject->Username) { + $MessageObject->WasHimself = FALSE; + $MessageJson = json_encode($MessageObject, TRUE); + $this->users[$ReceiversResourceId]->send($MessageJson); // SEND TO RECEIVER + + } else if ($data->EncryptedWithKeyOfUsername === $MessageObject->Username) { // VERIFICATION MESSAGE $MessageObject->WasHimself = TRUE; $MessageJson = json_encode($MessageObject, TRUE); $this->users[$conn->resourceId]->send($MessageJson); // SEND TO SENDER (FOR VERIFICATION) @@ -161,6 +163,8 @@ class ChatProcessor implements MessageComponentInterface $context = stream_context_create($options); $result = file_get_contents($url, FALSE, $context); if ($result === FALSE) { /* Handle error */ + } else { + $MessageObject->MessageId = $result; // MESSAGE ID GETS SEND IN ANSWER } // SEND BACK FOR VERIFICATION diff --git a/main/app/sprinkles/core/templates/pages/index.html.twig b/main/app/sprinkles/core/templates/pages/index.html.twig index 0479fb8..92b21a4 100644 --- a/main/app/sprinkles/core/templates/pages/index.html.twig +++ b/main/app/sprinkles/core/templates/pages/index.html.twig @@ -23,8 +23,7 @@ </div> <div class="MainInTab FeedTabWindow"> {% for FeedImage in FeedImages %} - <img class="FeedImage" src="{{ site.uri.public }}/image/{{ FeedImage.PostID }}" - alt="You probably don't have a permission to see this image."> + <img class="FeedImage" src="{{ site.uri.public }}/image/{{ FeedImage.PostID }}"> <br> {% endfor %} </div> @@ -66,10 +65,12 @@ </div> <div class="MainInTab ChatWindow"> <div class="SelectReceiver"></div> - <div class="SelectedReceiver"> + <div class="SelectedReceiver"> {# TODO: Different chat windows for each user(name) #} + {# <div id="ChatMessages" class="ChatMessages" data-username=""> <!-- Messages --> </div> + #} <input title="{{ translate("CHAT_MESSAGES.WRITE_MESSAGE_PH") }}" placeholder="{{ translate("CHAT_MESSAGES.WRITE_MESSAGE_PH") }}" id="ChatTextInput" class="ChatInput" type="text" /> |