From ef6fc62a5048afd8467af20b34861ad085566481 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Thu, 10 May 2018 13:31:42 +0200 Subject: Removed caching (performance issues) + fixed some issues for firefox alignment --- .../sprinkles/core/assets/SiteAssets/css/main.css | 29 ++++++++++++++-------- .../sprinkles/core/assets/SiteAssets/js/main.js | 17 +++++++------ .../sprinkles/core/templates/pages/index.html.twig | 14 +++++------ 3 files changed, 36 insertions(+), 24 deletions(-) (limited to 'main/app/sprinkles') diff --git a/main/app/sprinkles/core/assets/SiteAssets/css/main.css b/main/app/sprinkles/core/assets/SiteAssets/css/main.css index 999bdaa..aa234a0 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/css/main.css +++ b/main/app/sprinkles/core/assets/SiteAssets/css/main.css @@ -76,7 +76,6 @@ SWIPEABLE HEADER ******/ .header { - -js-display: flex; display: flex; flex-wrap: nowrap; justify-content: space-between; @@ -323,18 +322,23 @@ hr.ChatHeaderDivider { } @-webkit-keyframes sk-bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0) } - 40% { -webkit-transform: scale(1.0) } + 0%, 80%, 100% { + -webkit-transform: scale(0) + } + 40% { + -webkit-transform: scale(1.0) + } } @keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0); transform: scale(0); - } 40% { - -webkit-transform: scale(1.0); - transform: scale(1.0); - } + } + 40% { + -webkit-transform: scale(1.0); + transform: scale(1.0); + } } /********* @@ -371,7 +375,6 @@ FRIEND TAB align-self: center; } - /*********** PERSONAL TAB ***********/ @@ -382,7 +385,6 @@ PERSONAL TAB } .PersonalOverviewHeader { - -js-display: flex; display: flex; justify-content: space-evenly; align-items: flex-end; @@ -421,7 +423,6 @@ PERSONAL TAB NAVBAR *****/ .Navbar { - -js-display: flex; display: flex; flex-wrap: nowrap; justify-content: center; @@ -433,11 +434,19 @@ NAVBAR width: 100%; } +.NavbarIconWrap { + width: calc(100vw / 5); + width: -moz-calc(100vw / 5); + width: -webkit-calc(100vw / 5); +} + .NavbarIconWrap { margin: auto; } .NavbarIconWrap img { + display: block; + margin: 0 auto; height: 30px; width: 30px; } diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/main.js b/main/app/sprinkles/core/assets/SiteAssets/js/main.js index 7dd6006..9d1d697 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/main.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/main.js @@ -12,8 +12,8 @@ var ExploreData = $("#ExploreData"); * CACHE IMAGES * @type {*|jQueryImageCaching|jQuery} */ -var cachedNavbarIcons = $(".NavbarIconWrap img").imageCaching(); -var cashedAvatarIcons = $("img.Avatar").imageCaching(); +//var cachedNavbarIcons = $(".NavbarIconWrap img").imageCaching(); +//var cashedAvatarIcons = $("img.Avatar").imageCaching(); /** * POPUPS @@ -111,10 +111,13 @@ MainTabWindows.slick({ MainTabWindows.on('beforeChange', function (event, slick, currentSlide, nextSlide) { currentSlide = $("#" + currentSlide); nextSlide = $("#" + nextSlide); - currentSlide.children().attr("data-src", (currentSlide.children().attr("data-src").split('.svg')[0].replace('Activated', '') + ".svg")); - nextSlide.children().attr("data-caching-key", nextSlide.children().attr("data-src").split('.svg')[0].split('/').pop() + "Activated_nav_cached"); - nextSlide.children().attr("data-src", nextSlide.children().attr("data-src").split('.svg')[0] + "Activated.svg"); - cachedNavbarIcons.refresh(); + + currentSlide.children().attr("src", (currentSlide.children().attr("src").split('.svg')[0].replace('Activated', '') + ".svg")); + nextSlide.children().attr("src", nextSlide.children().attr("src").split('.svg')[0] + "Activated.svg"); + //currentSlide.children().attr("data-src", (currentSlide.children().attr("data-src").split('.svg')[0].replace('Activated', '') + ".svg")); + //nextSlide.children().attr("data-caching-key", nextSlide.children().attr("data-src").split('.svg')[0].split('/').pop() + "Activated_nav_cached"); + //nextSlide.children().attr("data-src", nextSlide.children().attr("data-src").split('.svg')[0] + "Activated.svg"); + //cachedNavbarIcons.refresh(); $el = nextSlide; $el.addClass("ActiveTab"); leftPos = $el.position().left; @@ -143,7 +146,7 @@ UserSearchBar.keyup(function () { alerts.ufAlerts().ufAlerts('fetch'); SearchResults.append("
" + answer.full_name + "
"); - $(".SearchResults .Avatar").imageCaching(); // refresh + //$(".SearchResults .Avatar").imageCaching(); // refresh }, error: function () { console.log("%c[SEARCH LOGGER] User " + RequestedUser + " was not found!", "color: red"); diff --git a/main/app/sprinkles/core/templates/pages/index.html.twig b/main/app/sprinkles/core/templates/pages/index.html.twig index ab6b692..59ad41e 100644 --- a/main/app/sprinkles/core/templates/pages/index.html.twig +++ b/main/app/sprinkles/core/templates/pages/index.html.twig @@ -89,7 +89,7 @@
{% for friend in friends %} - + {{ friend.first_name }} {{ friend.last_name }}
@@ -111,7 +111,7 @@
- +

@@ -128,19 +128,19 @@ -- cgit v1.2.3 From a8d37fab30ccbced5ec8819510ee84893460bb5e Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Thu, 10 May 2018 20:42:13 +0200 Subject: Began chat encrpytion integration and ECC key generation on registration --- TODO.md | 2 - main/app/sprinkles/account/asset-bundles.json | 152 +++++++++++---------- .../assets/userfrosting/js/pages/register.js | 63 ++++++--- .../assets/userfrosting/js/pages/sign-in.js | 13 ++ .../account/templates/pages/sign-in.html.twig | 1 + main/app/sprinkles/admin/routes/users.php | 2 + .../admin/src/Controller/PostController.php | 5 +- .../admin/src/Controller/UserController.php | 26 ++++ .../admin/src/Controller/WormholeController.php | 6 +- .../sprinkles/core/assets/SiteAssets/css/main.css | 1 + .../sprinkles/core/assets/SiteAssets/js/chat.js | 26 ++-- .../sprinkles/core/assets/SiteAssets/js/main.js | 93 +++++++------ .../sprinkles/core/assets/SiteAssets/js/push.js | 3 +- .../sprinkles/core/templates/pages/index.html.twig | 2 +- .../sprinkles/core/templates/pages/test.html.twig | 53 ++++++- 15 files changed, 299 insertions(+), 149 deletions(-) delete mode 100644 TODO.md (limited to 'main/app/sprinkles') diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 3504e89..0000000 --- a/TODO.md +++ /dev/null @@ -1,2 +0,0 @@ -### TODO (for future implementations) -* Use Laravels database migrations system \ No newline at end of file diff --git a/main/app/sprinkles/account/asset-bundles.json b/main/app/sprinkles/account/asset-bundles.json index 77ee559..7fc9430 100644 --- a/main/app/sprinkles/account/asset-bundles.json +++ b/main/app/sprinkles/account/asset-bundles.json @@ -1,79 +1,81 @@ { - "bundle": { - "js/pages/account-settings": { - "scripts": [ - "userfrosting/js/pages/account-settings.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/forgot-password": { - "scripts": [ - "userfrosting/js/pages/forgot-password.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/resend-verification": { - "scripts": [ - "userfrosting/js/pages/resend-verification.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/set-or-reset-password": { - "scripts": [ - "userfrosting/js/pages/set-or-reset-password.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/register": { - "scripts": [ - "vendor/speakingurl/speakingurl.min.js", - "userfrosting/js/uf-captcha.js", - "userfrosting/js/pages/register.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } - }, - "js/pages/sign-in": { - "scripts": [ - "vendor/urijs/src/URI.js", - "userfrosting/js/pages/sign-in.js" - ], - "options": { - "result": { - "type": { - "scripts": "plain" - } - } - } + "bundle": { + "js/pages/account-settings": { + "scripts": [ + "userfrosting/js/pages/account-settings.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } } + } + }, + "js/pages/forgot-password": { + "scripts": [ + "userfrosting/js/pages/forgot-password.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/resend-verification": { + "scripts": [ + "userfrosting/js/pages/resend-verification.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/set-or-reset-password": { + "scripts": [ + "userfrosting/js/pages/set-or-reset-password.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/register": { + "scripts": [ + "vendor/speakingurl/speakingurl.min.js", + "userfrosting/js/uf-captcha.js", + "SiteAssets/js/encryption.js", + "userfrosting/js/pages/register.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } + }, + "js/pages/sign-in": { + "scripts": [ + "vendor/urijs/src/URI.js", + "SiteAssets/js/encryption.js", + "userfrosting/js/pages/sign-in.js" + ], + "options": { + "result": { + "type": { + "scripts": "plain" + } + } + } } + } } \ No newline at end of file diff --git a/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js b/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js index d855bb9..97870a7 100644 --- a/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js +++ b/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js @@ -6,9 +6,9 @@ * * Target page: account/register */ -$(document).ready(function() { +$(document).ready(function () { // TOS modal - $(this).find('.js-show-tos').click(function() { + $(this).find('.js-show-tos').click(function () { $("body").ufModal({ sourceUrl: site.uri.public + "/modals/account/tos", msgTarget: $("#alerts-page") @@ -17,7 +17,7 @@ $(document).ready(function() { // Auto-generate username when name is filled in var autoGenerate = true; - $("#register").find('input[name=first_name], input[name=last_name]').on('input change', function() { + $("#register").find('input[name=first_name], input[name=last_name]').on('input change', function () { if (!autoGenerate) { return; } @@ -40,26 +40,26 @@ $(document).ready(function() { // Autovalidate username field on a delay var timer; - $("#register").find('input[name=first_name], input[name=last_name], input[name=user_name]').on('input change', function() { + $("#register").find('input[name=first_name], input[name=last_name], input[name=user_name]').on('input change', function () { clearTimeout(timer); // Clear the timer so we don't end up with dupes. - timer = setTimeout(function() { // assign timer a new timeout + timer = setTimeout(function () { // assign timer a new timeout $("#register").find('input[name=user_name]').valid(); - }, 500); + }, 50); }); // Enable/disable username suggestions in registration page - $("#register").find('#form-register-username-suggest').on('click', function(e) { + $("#register").find('#form-register-username-suggest').on('click', function (e) { e.preventDefault(); var form = $("#register"); $.getJSON(site.uri.public + '/account/suggest-username') - .done(function (data) { - // Set suggestion - form.find('input[name=user_name]').val(data.user_name); - }); + .done(function (data) { + // Set suggestion + form.find('input[name=user_name]').val(data.user_name); + }); }); // Turn off autogenerate when someone enters stuff manually in user_name - $("#register").find('input[name=user_name]').on('input', function() { + $("#register").find('input[name=user_name]').on('input', function () { autoGenerate = false; }); @@ -84,10 +84,41 @@ $(document).ready(function() { validators: registrationValidators, msgTarget: $("#alerts-page"), keyupDelay: 500 - }).on("submitSuccess.ufForm", function() { - // Reload to clear form and show alerts - window.location.reload(); - }).on("submitError.ufForm", function() { + }).on("submitSuccess.ufForm", function () { + // GENERATE KEYS + var openpgp = window.openpgp; + var options; + var randomString = Math.random().toString(36).substr(2, 11); // PRIVKEY ENCRYPTION KEY + openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); + options = { + userIds: [{name: $("#r-form-username").val(), email: $("#r-form-email").val()}], + curve: "curve25519", + passphrase: randomString + }; + openpgp.generateKey(options).then(function (key) { + localStorage.setItem("PrivateKey", key.privateKeyArmored); + localStorage.setItem("🔒", randomString); + + console.log(key.publicKeyArmored); + console.log(key.privateKeyArmored); + // SAVE PUBLIC KEY TO DATABASE + var data = { + csrf_name: site.csrf.name, + csrf_value: site.csrf.value, + PublicKey: key.publicKeyArmored + }; + $.ajax({ + type: 'POST', + url: site.uri.public + '/api/users/u/' + $("#r-form-username").val() + '/publickey', + data: data, + success: function (response) { + console.log(response); + //window.location.reload(); + } + }); + + }); + }).on("submitError.ufForm", function () { // Reload captcha $("#captcha").captcha(); }); diff --git a/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js b/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js index 40a8628..b627f2d 100644 --- a/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js +++ b/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js @@ -34,6 +34,19 @@ $(document).ready(function() { validators: page.validators.login, msgTarget: $("#alerts-page") }).on("submitSuccess.ufForm", function(event, data, textStatus, jqXHR) { + /* GENERATE KEYS + var openpgp = window.openpgp; + var options, PublicKey, PrivateKey; + openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); + options = { + userIds: [{user_id: current_user_id}], + curve: "curve25519", + passphrase: $("input[name='password']") // only local + }; + openpgp.generateKey(options).then(function (key) { + PrivateKey = key.privateKeyArmored; + PublicKey = key.publicKeyArmored; + });*/ redirectOnLogin(jqXHR); }); }); diff --git a/main/app/sprinkles/account/templates/pages/sign-in.html.twig b/main/app/sprinkles/account/templates/pages/sign-in.html.twig index 2fb6e1c..083d170 100644 --- a/main/app/sprinkles/account/templates/pages/sign-in.html.twig +++ b/main/app/sprinkles/account/templates/pages/sign-in.html.twig @@ -62,6 +62,7 @@ {% endblock %} {% block scripts_page %} + + +{{ assets.js('js/main') | raw }} + + + + \ No newline at end of file -- cgit v1.2.3 From 80b9827a0576ef36ff08f8b9c6e3ef647c965781 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 11 May 2018 15:41:23 +0200 Subject: More chat encryption... --- .../assets/userfrosting/js/pages/register.js | 34 +------------ .../assets/userfrosting/js/pages/sign-in.js | 49 +++++++++++++------ .../account/templates/pages/sign-in.html.twig | 1 - main/app/sprinkles/admin/routes/users.php | 2 + .../admin/src/Controller/UserController.php | 57 +++++++++++++++++++--- .../sprinkles/core/assets/SiteAssets/js/chat.js | 52 +++++++++++++++----- .../sprinkles/core/assets/SiteAssets/js/main.js | 53 ++++++++++++-------- main/app/sprinkles/core/config/default.php | 2 +- .../templates/pages/abstract/mainsite.html.twig | 15 ++++-- .../sprinkles/core/templates/pages/test.html.twig | 28 ++--------- 10 files changed, 174 insertions(+), 119 deletions(-) (limited to 'main/app/sprinkles') diff --git a/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js b/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js index 97870a7..a311305 100644 --- a/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js +++ b/main/app/sprinkles/account/assets/userfrosting/js/pages/register.js @@ -85,39 +85,7 @@ $(document).ready(function () { msgTarget: $("#alerts-page"), keyupDelay: 500 }).on("submitSuccess.ufForm", function () { - // GENERATE KEYS - var openpgp = window.openpgp; - var options; - var randomString = Math.random().toString(36).substr(2, 11); // PRIVKEY ENCRYPTION KEY - openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); - options = { - userIds: [{name: $("#r-form-username").val(), email: $("#r-form-email").val()}], - curve: "curve25519", - passphrase: randomString - }; - openpgp.generateKey(options).then(function (key) { - localStorage.setItem("PrivateKey", key.privateKeyArmored); - localStorage.setItem("🔒", randomString); - - console.log(key.publicKeyArmored); - console.log(key.privateKeyArmored); - // SAVE PUBLIC KEY TO DATABASE - var data = { - csrf_name: site.csrf.name, - csrf_value: site.csrf.value, - PublicKey: key.publicKeyArmored - }; - $.ajax({ - type: 'POST', - url: site.uri.public + '/api/users/u/' + $("#r-form-username").val() + '/publickey', - data: data, - success: function (response) { - console.log(response); - //window.location.reload(); - } - }); - - }); + window.location.reload(); }).on("submitError.ufForm", function () { // Reload captcha $("#captcha").captcha(); diff --git a/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js b/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js index b627f2d..97f19e9 100644 --- a/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js +++ b/main/app/sprinkles/account/assets/userfrosting/js/pages/sign-in.js @@ -34,19 +34,40 @@ $(document).ready(function() { validators: page.validators.login, msgTarget: $("#alerts-page") }).on("submitSuccess.ufForm", function(event, data, textStatus, jqXHR) { - /* GENERATE KEYS - var openpgp = window.openpgp; - var options, PublicKey, PrivateKey; - openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); - options = { - userIds: [{user_id: current_user_id}], - curve: "curve25519", - passphrase: $("input[name='password']") // only local - }; - openpgp.generateKey(options).then(function (key) { - PrivateKey = key.privateKeyArmored; - PublicKey = key.publicKeyArmored; - });*/ - redirectOnLogin(jqXHR); + if (localStorage.getItem("PrivateKey") === null && localStorage.getItem("🔒") === null) { + // GENERATE KEYS + var openpgp = window.openpgp; + var options; + var randomString = Math.random().toString(36).substr(2, 11); // PRIVKEY ENCRYPTION KEY + openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); + options = { + userIds: [{name: $("input[name=user_name]").val()}], + curve: "curve25519", + passphrase: randomString + }; + openpgp.generateKey(options).then(function (key) { + localStorage.setItem("PrivateKey", key.privateKeyArmored); + localStorage.setItem("🔒", randomString); + + console.log(key.publicKeyArmored); + console.log(key.privateKeyArmored); + // SAVE PUBLIC KEY TO DATABASE + var data = { + csrf_name: site.csrf.name, + csrf_value: site.csrf.value, + PublicKey: key.publicKeyArmored + }; + $.ajax({ + type: 'POST', + dataType : "json", + url: site.uri.public + '/api/users/u/' + $("input[name=user_name]").val() + '/publickey', + data: data, + async: false + }); + redirectOnLogin(jqXHR); + }); + } else { + redirectOnLogin(jqXHR); + } }); }); diff --git a/main/app/sprinkles/account/templates/pages/sign-in.html.twig b/main/app/sprinkles/account/templates/pages/sign-in.html.twig index 083d170..2fb6e1c 100644 --- a/main/app/sprinkles/account/templates/pages/sign-in.html.twig +++ b/main/app/sprinkles/account/templates/pages/sign-in.html.twig @@ -62,7 +62,6 @@ {% endblock %} {% block scripts_page %} - + {# Override this block in a child layout template or page template to override site-level scripts. #} {% block scripts_site %} {{ assets.js('js/main') | raw }} diff --git a/main/app/sprinkles/core/templates/pages/test.html.twig b/main/app/sprinkles/core/templates/pages/test.html.twig index 972e734..6f64962 100644 --- a/main/app/sprinkles/core/templates/pages/test.html.twig +++ b/main/app/sprinkles/core/templates/pages/test.html.twig @@ -25,35 +25,13 @@ \ No newline at end of file -- cgit v1.2.3 From 933f652b65b42cc143bec27fb4cb137f645b7d6c Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 11 May 2018 23:39:01 +0200 Subject: Message encryption integration - decryption needs work --- .../sprinkles/core/assets/SiteAssets/js/chat.js | 56 ++++++++++++++-------- .../php/Chatserver/src/ChatProcessor.php | 6 +++ 2 files changed, 43 insertions(+), 19 deletions(-) (limited to 'main/app/sprinkles') diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js index ac3f3f7..54f8262 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js @@ -1,25 +1,15 @@ /** - * GENERAL CHAT + * ENCRYPTION */ -var ReceiversUsername = "marvinborner"; // HARD +var ReceiversUsername = ""; // HARD var openpgp = window.openpgp; var options, EncryptedText; var PublicKey = []; openpgp.initWorker({path: '/assets-raw/core/assets/SiteAssets/js/openpgp.worker.js'}); -var privKeyObj = openpgp.key.readArmored(localStorage.getItem("PrivateKey")).keys[0]; -privKeyObj.decrypt(localStorage.getItem("🔒")); -$.ajax({ - type: 'GET', - url: site.uri.public + '/api/users/u/' + ReceiversUsername + '/publickey', - dataType: "json", - success: function (response) { - //if (response.user_id === ReceiversUsername->id) { - PublicKey[ReceiversUsername] = response.PublicKey; - console.log(PublicKey[ReceiversUsername]) - //} - } -}); +/** + * GENERAL CHAT + */ function InitializeChatServer() { var ChatTextInput = $("#ChatTextInput"); var SubscribeTextInput = $("#SubscribeTextInput"); @@ -49,7 +39,7 @@ function InitializeChatServer() { var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); var MessageObject = JSON.parse(e.data); - var Message = MessageObject.Message; + var Message = MessageObject.Message; // ENCRYPTED MESSAGE (NOT ENCRYPTED ON SERVER MESSAGES) var Username = MessageObject.Username; var Fullname = MessageObject.Fullname; var Avatar = MessageObject.Avatar; @@ -59,8 +49,35 @@ function InitializeChatServer() { var WasHimself = MessageObject.WasHimself; var ServerMessageType = MessageObject.ServerMessageType; var Granted = MessageObject.Granted; + ReceiversUsername = MessageObject.Receiver; + + // GET PUBLIC KEY IF NOT ALREADY DID + if (!(ReceiversUsername in PublicKey) && ReceiversUsername !== null) { + $.ajax({ + type: 'GET', + url: site.uri.public + '/api/users/u/' + ReceiversUsername + '/publickey', + dataType: "json", + success: function (response) { + PublicKey[ReceiversUsername] = response.PublicKey; + console.log(PublicKey[ReceiversUsername]) + } + }); + } if (ServerMessage === false) { // NO SERVER MESSAGE -> SENT BY USER + + // DECRYPT MESSAGE + var privKeyObj = openpgp.key.readArmored(localStorage.getItem("PrivateKey")).keys[0]; + privKeyObj.decrypt(localStorage.getItem("🔒")); + options = { + message: openpgp.message.readArmored("-----BEGIN PGP MESSAGE-----\r\nVersion: OpenPGP.js v3.0.9\r\nComment: https://openpgpjs.org\r\n\n" + Message + "\r\n-----END PGP MESSAGE-----\r\n"), + //publicKeys: openpgp.key.readArmored(PublicKey[Username]).keys, // FOR VERIFICATION + privateKeys: [privKeyObj] + }; + openpgp.decrypt(options).then(function(plaintext) { + Message = plaintext.data; + }); + if (WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF console.log("%c[CHATSOCKET LOGGER] You sent a message!", "color: darkorange"); if (!LastMessage.hasClass("MessageSent")) { // CHECK IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE @@ -208,11 +225,12 @@ function InitializeChatServer() { if (e.keyCode === 13 && ChatTextInput.val().length > 0) { options = { data: ChatTextInput.val(), - publicKeys: openpgp.key.readArmored(PublicKey[ReceiversUsername]).keys, - privateKeys: [privKeyObj] // FOR SIGNING + publicKeys: openpgp.key.readArmored(PublicKey[ReceiversUsername]).keys + //privateKeys: [privKeyObj] // FOR SIGNING }; openpgp.encrypt(options).then(function (Encrypted) { EncryptedText = Encrypted.data; + console.log(EncryptedText); // USER USUALLY STOPS TYPING ON SENDING -> CHANGE STATE TO FALSE sendTypingState(false); @@ -222,7 +240,7 @@ function InitializeChatServer() { ChatSocket.send(JSON.stringify({ ClientMessageType: "ChatMessage", MessageType: "Private", - Message: EncryptedText.substr(91).slice(0,-29) + Message: EncryptedText.substr(91).slice(0,-29) // SLICING FOR DATABASE SAVING (LESS DATA) })); ChatTextInput.val(""); ChatTextInput.val(""); 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 e4f7f30..1553468 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 @@ -51,6 +51,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "Verify"; $MessageObject->Granted = TRUE; + $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$this->channels[$conn->resourceId]]]->user_name; $this->verifiedUsers[$conn->resourceId] = TRUE; $this->users[$conn->resourceId]->send(json_encode($MessageObject, TRUE)); } else { @@ -58,6 +59,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "Verify"; $MessageObject->Granted = FALSE; + $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); @@ -67,6 +69,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "Verify"; $MessageObject->Granted = FALSE; + $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); @@ -84,6 +87,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "GroupJoin"; $MessageObject->GroupName = $channel; + $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]->first_name . " " . $this->userInfo[$conn->resourceId]->last_name; $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; @@ -105,6 +109,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject = new \stdClass(); $MessageObject->ServerMessage = FALSE; $MessageObject->GroupName = $channel; + $MessageObject->Receiver = $this->userInfo[array_flip($this->channels)[$target]]->user_name; $MessageObject->Username = $this->userInfo[$conn->resourceId]->user_name; $MessageObject->Fullname = $this->userInfo[$conn->resourceId]->first_name . " " . $this->userInfo[$conn->resourceId]->last_name; $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; @@ -136,6 +141,7 @@ class ChatProcessor implements MessageComponentInterface $MessageObject->ServerMessage = TRUE; $MessageObject->ServerMessageType = "TypingState"; $MessageObject->GroupName = $channel; + $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]->first_name . " " . $this->userInfo[$conn->resourceId]->last_name; $MessageObject->Avatar = $this->userInfo[$conn->resourceId]->avatar; -- cgit v1.2.3 From 1f05a05eec9fc88aca7d3e4e7d9e891ae31ba4eb Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 12 May 2018 12:29:12 +0200 Subject: Even more chat encryption... --- .../sprinkles/core/assets/SiteAssets/js/chat.js | 149 +++++++++++++-------- 1 file changed, 90 insertions(+), 59 deletions(-) (limited to 'main/app/sprinkles') diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js index 54f8262..76e34db 100644 --- a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js +++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js @@ -3,9 +3,17 @@ */ var ReceiversUsername = ""; // HARD var openpgp = window.openpgp; -var options, EncryptedText; +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("🔒")); + +/** + * GLOBAL DECLARATIONS + */ +var LastMessage, Username; + /** * GENERAL CHAT @@ -37,10 +45,10 @@ function InitializeChatServer() { ChatSocket.onmessage = function (e) { // DECLARATIONS var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent(); - var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); + LastMessage = $(".MessageWrapper.Normal:last .ChatMessage"); var MessageObject = JSON.parse(e.data); var Message = MessageObject.Message; // ENCRYPTED MESSAGE (NOT ENCRYPTED ON SERVER MESSAGES) - var Username = MessageObject.Username; + Username = MessageObject.Username; var Fullname = MessageObject.Fullname; var Avatar = MessageObject.Avatar; var GroupName = MessageObject.GroupName; @@ -52,14 +60,14 @@ function InitializeChatServer() { ReceiversUsername = MessageObject.Receiver; // GET PUBLIC KEY IF NOT ALREADY DID - if (!(ReceiversUsername in PublicKey) && ReceiversUsername !== null) { + if (!(ReceiversUsername in PublicKey) && ReceiversUsername !== null && ReceiversUsername !== undefined) { $.ajax({ type: 'GET', url: site.uri.public + '/api/users/u/' + ReceiversUsername + '/publickey', dataType: "json", success: function (response) { PublicKey[ReceiversUsername] = response.PublicKey; - console.log(PublicKey[ReceiversUsername]) + console.log("%c[ENCRYPTION LOGGER] Publickey of " + ReceiversUsername + ": " + PublicKey[ReceiversUsername].substr(96).slice(0, -35), "color: #20c20e; background-color: black;") } }); } @@ -67,58 +75,44 @@ function InitializeChatServer() { if (ServerMessage === false) { // NO SERVER MESSAGE -> SENT BY USER // DECRYPT MESSAGE - var privKeyObj = openpgp.key.readArmored(localStorage.getItem("PrivateKey")).keys[0]; - privKeyObj.decrypt(localStorage.getItem("🔒")); options = { - message: openpgp.message.readArmored("-----BEGIN PGP MESSAGE-----\r\nVersion: OpenPGP.js v3.0.9\r\nComment: https://openpgpjs.org\r\n\n" + Message + "\r\n-----END PGP MESSAGE-----\r\n"), - //publicKeys: openpgp.key.readArmored(PublicKey[Username]).keys, // FOR VERIFICATION + message: openpgp.message.readArmored("-----BEGIN PGP MESSAGE-----\r\nVersion: OpenPGP.js v3.0.9\r\nComment: https://openpgpjs.org\r\n\r\n" + Message + "\r\n\-----END PGP MESSAGE-----\r\n"), + publicKeys: openpgp.key.readArmored(PublicKey[Username]).keys, // FOR VERIFICATION privateKeys: [privKeyObj] }; openpgp.decrypt(options).then(function(plaintext) { - Message = plaintext.data; - }); - - if (WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF - console.log("%c[CHATSOCKET LOGGER] You sent a message!", "color: darkorange"); - if (!LastMessage.hasClass("MessageSent")) { // CHECK IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE - ChatMessages.append("
" + Message + "
"); - } else if (LastMessage.hasClass("MessageSent")) { // IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN - ChatMessages.append("
" + Message + "
"); - if (LastMessage.hasClass("AloneMessage")) { - LastMessage.removeClass("AloneMessage"); - LastMessage.addClass("TopMessage"); - } else if (LastMessage.hasClass("BottomMessage")) { - LastMessage.removeClass("BottomMessage"); - LastMessage.addClass("MiddleMessage"); - } - } - } else if (WasHimself === false) { // -> MESSAGE WAS FROM OTHER USER - console.log("%c[CHATSOCKET LOGGER] You received a message!", "color: darkorange"); - NotifySound.play(); - Push.create(Fullname, { // CREATE NOTIFICATION - body: Message, - icon: Avatar, - timeout: 5000, - onClick: function () { - window.focus(); - this.close(); - } - }); - if (!LastMessage.hasClass("MessageReceived")) { // CHECK IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE - ChatMessages.append("
" + Message + "
"); - } else if (LastMessage.hasClass("MessageReceived")) { // IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN - ChatMessages.append("
" + Message + "
"); - if (LastMessage.hasClass("AloneMessage")) { - LastMessage.removeClass("AloneMessage"); - LastMessage.addClass("TopMessage"); - } else if (LastMessage.hasClass("BottomMessage")) { - LastMessage.removeClass("BottomMessage"); - LastMessage.addClass("MiddleMessage"); + DecryptedMessage = plaintext.data; + if (WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF -> Don't write to chat, as its done directly (on enter function at the bottom, for performance) + console.log("%c[CHATSOCKET LOGGER] Message sending succeeded!", "color: darkorange"); + } else if (WasHimself === false) { // -> MESSAGE WAS FROM OTHER USER + console.log("%c[CHATSOCKET LOGGER] You received a message!", "color: darkorange"); + NotifySound.play(); + Push.create(Fullname, { // CREATE NOTIFICATION + body: DecryptedMessage, + icon: Avatar, + timeout: 5000, + onClick: function () { + window.focus(); + this.close(); + } + }); + if (!LastMessage.hasClass("MessageReceived")) { // CHECK IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE + ChatMessages.append("
" + DecryptedMessage + "
"); + } else if (LastMessage.hasClass("MessageReceived")) { // IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN + ChatMessages.append("
" + DecryptedMessage + "
"); + if (LastMessage.hasClass("AloneMessage")) { + LastMessage.removeClass("AloneMessage"); + LastMessage.addClass("TopMessage"); + } else if (LastMessage.hasClass("BottomMessage")) { + LastMessage.removeClass("BottomMessage"); + LastMessage.addClass("MiddleMessage"); + } } } - } + }); + // CONVERT LINKS TO LINKS - $('.MessageReceived').linkify({ + $('.ChatMessage').linkify({ target: "_blank" }); } else if (ServerMessage === true) { // SERVER MESSAGE @@ -223,24 +217,61 @@ function InitializeChatServer() { // SEND MESSAGE FROM INPUT FIELD ChatTextInput.keyup(function (e) { if (e.keyCode === 13 && ChatTextInput.val().length > 0) { + + var 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("
" + ChatTextInput.val() + "
"); + } else if (LastMessage.hasClass("MessageSent")) { // IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN + ChatMessages.append("
" + ChatTextInput.val() + "
"); + if (LastMessage.hasClass("AloneMessage")) { + LastMessage.removeClass("AloneMessage"); + LastMessage.addClass("TopMessage"); + } else if (LastMessage.hasClass("BottomMessage")) { + LastMessage.removeClass("BottomMessage"); + LastMessage.addClass("MiddleMessage"); + } + } + + // USER USUALLY STOPS TYPING ON SENDING -> CHANGE STATE TO FALSE + sendTypingState(false); + isTyping = false; + clearTimeout(typingTimer); + + // ENCRYPT AND SEND MESSAGE WITH OWN PUBLIC KEY options = { data: ChatTextInput.val(), - publicKeys: openpgp.key.readArmored(PublicKey[ReceiversUsername]).keys - //privateKeys: [privKeyObj] // FOR SIGNING + publicKeys: openpgp.key.readArmored(PublicKey[ReceiversUsername]).keys, + privateKeys: [privKeyObj] // FOR SIGNING }; openpgp.encrypt(options).then(function (Encrypted) { - EncryptedText = Encrypted.data; - console.log(EncryptedText); + EncryptedMessage = Encrypted.data.substr(91).slice(0,-29); // SLICING FOR DATABASE SAVING (LESS DATA) + console.log("%c[ENCRYPTION LOGGER] Encrypted message for sender: " + EncryptedMessage, "color: #20c20e; background-color: black;"); - // USER USUALLY STOPS TYPING ON SENDING -> CHANGE STATE TO FALSE - sendTypingState(false); - isTyping = false; - clearTimeout(typingTimer); + ChatSocket.send(JSON.stringify({ + ClientMessageType: "ChatMessage", + MessageType: "Private", + EncryptedWithKey: ReceiversUsername, + Message: EncryptedMessage + })); + ChatTextInput.val(""); + ChatTextInput.val(""); + }); + + // ENCRYPT AND SEND MESSAGE WITH RECEIVERS PUBLIC KEY + options = { + data: ChatTextInput.val(), + publicKeys: openpgp.key.readArmored(PublicKey[ReceiversUsername]).keys, + privateKeys: [privKeyObj] // FOR SIGNING + }; + openpgp.encrypt(options).then(function (Encrypted) { + EncryptedMessage = Encrypted.data.substr(91).slice(0,-29); // SLICING FOR DATABASE SAVING (LESS DATA) + console.log("%c[ENCRYPTION LOGGER] Encrypted message for receiver: " + EncryptedMessage, "color: #20c20e; background-color: black;"); ChatSocket.send(JSON.stringify({ ClientMessageType: "ChatMessage", MessageType: "Private", - Message: EncryptedText.substr(91).slice(0,-29) // SLICING FOR DATABASE SAVING (LESS DATA) + EncryptedWithKey: ReceiversUsername, + Message: EncryptedMessage })); ChatTextInput.val(""); ChatTextInput.val(""); -- cgit v1.2.3