diff --git a/package.json b/package.json
index 703431e..59c8dfa 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
- "jsbuild": "uglifyjs src/js/main.js -o src/public/main.js"
+ "jsbuild": "uglifyjs src/js/main.js --compress --mangle -o src/public/main.js"
},
"author": "Daniel Seripap",
"license": "ISC"
diff --git a/src/js/main.js b/src/js/main.js
index 989f147..1729e9e 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -23,6 +23,7 @@ $(function() {
var $inputMessage = $('.inputMessage'); // Input message input box
var $key = $('#key');
var $genKey = $('#new_key');
+ var $removeKey = $('#remove_key');
var $chatPage = $('.chat.page'); // The chatroom page
@@ -260,6 +261,10 @@ $(function() {
$key.val(key);
});
+ $removeKey.click(function() {
+ $key.val('');
+ });
+
// Socket events
// Whenever the server emits 'login', log the login message
diff --git a/src/public/main.js b/src/public/main.js
index cab7ca1..3ff15a3 100644
--- a/src/public/main.js
+++ b/src/public/main.js
@@ -1 +1 @@
-var fs=window.RequestFileSystem||window.webkitRequestFileSystem;$(function(){var isActive=false;var newMessages=0;var FADE_TIME=150;var TYPING_TIMER_LENGTH=400;var COLORS=["#e21400","#91580f","#f8a700","#f78b00","#58dc00","#287b00","#a8f07a","#4ae8c4","#3b88eb","#3824aa","#a700ff","#d300e7"];window.favicon=new Favico({animation:"pop",type:"rectangle"});var $window=$(window);var $usernameInput=$(".usernameInput");var $messages=$(".messages");var $inputMessage=$(".inputMessage");var $key=$("#key");var $genKey=$("#new_key");var $chatPage=$(".chat.page");var key=CryptoJS.SHA3(Math.random().toString(36).substring(7)).toString();$key.val(key);var username;var connected=false;var typing=false;var lastTypingTime;var $currentInput=$usernameInput.focus();var clipboard=new Clipboard(".copyable");var roomId=window.location.pathname.length?window.location.pathname:null;if(!roomId)return;var socket=io(roomId);$("#roomIdKey").text(roomId.replace("/",""));function addParticipantsMessage(data){var message="";if(data.numUsers===1){message+="There's 1 participant"}else{message+="There are "+data.numUsers+" participants"}log(message)}function setUsername(){username=window.username;if(!fs){console.log("no fs")}else{fs(window.TEMPORARY,100,log.bind(log,"WARNING: Your browser is not in incognito mode!"),log.bind(log,"Your browser is in incognito mode."))}if(username){$chatPage.show();$currentInput=$inputMessage.focus();socket.emit("add user",username)}}function sendMessage(){var message=$inputMessage.val();message=cleanInput(message);if(message&&connected){$inputMessage.val("");addChatMessage({username:username,message:message});socket.emit("new message",encrypt(message))}}function encrypt(text){return CryptoJS.AES.encrypt(text,$key.val()).toString()}function decrypt(text){return CryptoJS.AES.decrypt(text,$key.val()).toString(CryptoJS.enc.Utf8)||text}function log(message,options){var html=options&&options.html===true||false;var $el;if(html){$el=$("
").addClass("log").html(message)}else{$el=$("
").addClass("log").text(message)}addMessageElement($el,options)}function addChatMessage(data,options){var $typingMessages=getTypingMessages(data);options=options||{};if($typingMessages.length!==0){options.fade=false;$typingMessages.remove()}var $usernameDiv=$('').text(data.username).css("color",getUsernameColor(data.username));var $messageBodyDiv=$('').text(data.message);var typingClass=data.typing?"typing":"";var $messageDiv=$('').data("username",data.username).addClass(typingClass).append($usernameDiv,$messageBodyDiv);addMessageElement($messageDiv,options)}function addChatTyping(data){data.typing=true;data.message="is typing";addChatMessage(data)}function removeChatTyping(data){getTypingMessages(data).fadeOut(function(){$(this).remove()})}function addMessageElement(el,options){var $el=$(el);if(!options){options={}}if(typeof options.fade==="undefined"){options.fade=true}if(typeof options.prepend==="undefined"){options.prepend=false}if(options.fade){$el.hide().fadeIn(FADE_TIME)}if(options.prepend){$messages.prepend($el)}else{$messages.append($el)}$messages[0].scrollTop=$messages[0].scrollHeight}function cleanInput(input){return $("").text(input).text()}function updateTyping(){if(connected){if(!typing){typing=true;socket.emit("typing")}lastTypingTime=(new Date).getTime();setTimeout(function(){var typingTimer=(new Date).getTime();var timeDiff=typingTimer-lastTypingTime;if(timeDiff>=TYPING_TIMER_LENGTH&&typing){socket.emit("stop typing");typing=false}},TYPING_TIMER_LENGTH)}}function getTypingMessages(data){return $(".typing.message").filter(function(i){return $(this).data("username")===data.username})}function getUsernameColor(username){var hash=7;for(var i=0;iCopy link to share';log(message,{prepend:true,html:true});message="This chatroom is destroyed after all participants exit. Chat history is client side only and not persistent.";log(message);addParticipantsMessage(data)});socket.on("new message",function(data){if(!isActive){newMessages++;favicon.badge(newMessages)}data.message=decrypt(data.message);addChatMessage(data)});socket.on("user joined",function(data){log(data.username+" joined");addParticipantsMessage(data)});socket.on("user left",function(data){log(data.username+" left");addParticipantsMessage(data);removeChatTyping(data)});socket.on("typing",function(data){addChatTyping(data)});socket.on("stop typing",function(data){removeChatTyping(data)});socket.on("first",function(){$(".modal").modal("show")});setUsername();$("span.key-btn").click(function(){$("#key-modal").modal("show")});window.onfocus=function(){isActive=true;newMessages=0;favicon.reset()};window.onblur=function(){isActive=false};clipboard.on("success",function(e){console.log("success");$(e.trigger).tooltip({title:"Copied!",trigger:"manual",placement:"auto"});$(e.trigger).tooltip("show");setTimeout(function(){$(e.trigger).tooltip("hide")},2e3);e.clearSelection()});clipboard.on("error",function(e){console.log("error");$(e.trigger).tooltip({title:"Press ⌘C to copy",trigger:"manual",placement:"auto"});$(e.trigger).tooltip("show");setTimeout(function(){$(e.trigger).tooltip("hide")},2e3)})});
\ No newline at end of file
+var fs=window.RequestFileSystem||window.webkitRequestFileSystem;$(function(){function e(e){var n="";n+=1===e.numUsers?"There's 1 participant":"There are "+e.numUsers+" participants",a(n)}function n(){R=window.username,fs?fs(window.TEMPORARY,100,a.bind(a,"WARNING: Your browser is not in incognito mode!"),a.bind(a,"Your browser is in incognito mode.")):console.log("no fs"),R&&(A.show(),D=C.focus(),U.emit("add user",R))}function t(){var e=C.val();e=l(e),e&&J&&(C.val(""),s({username:R,message:e}),U.emit("new message",o(e)))}function o(e){return CryptoJS.AES.encrypt(e,k.val()).toString()}function i(e){return CryptoJS.AES.decrypt(e,k.val()).toString(CryptoJS.enc.Utf8)||e}function a(e,n){var t,o=n&&n.html===!0||!1;t=o?$("
").addClass("log").html(e):$("
").addClass("log").text(e),u(t,n)}function s(e,n){var t=f(e);n=n||{},0!==t.length&&(n.fade=!1,t.remove());var o=$('').text(e.username).css("color",d(e.username)),i=$('').text(e.message),a=e.typing?"typing":"",s=$('').data("username",e.username).addClass(a).append(o,i);u(s,n)}function r(e){e.typing=!0,e.message="is typing",s(e)}function c(e){f(e).fadeOut(function(){$(this).remove()})}function u(e,n){var t=$(e);n||(n={}),"undefined"==typeof n.fade&&(n.fade=!0),"undefined"==typeof n.prepend&&(n.prepend=!1),n.fade&&t.hide().fadeIn(y),n.prepend?S.prepend(t):S.append(t),S[0].scrollTop=S[0].scrollHeight}function l(e){return $("").text(e).text()}function p(){J&&(F||(F=!0,U.emit("typing")),I=(new Date).getTime(),setTimeout(function(){var e=(new Date).getTime(),n=e-I;n>=h&&F&&(U.emit("stop typing"),F=!1)},h))}function f(e){return $(".typing.message").filter(function(n){return $(this).data("username")===e.username})}function d(e){for(var n=7,t=0;tCopy link to share';a(t,{prepend:!0,html:!0}),t="This chatroom is destroyed after all participants exit. Chat history is client side only and not persistent.",a(t),e(n)}),U.on("new message",function(e){m||(g++,favicon.badge(g)),e.message=i(e.message),s(e)}),U.on("user joined",function(n){a(n.username+" joined"),e(n)}),U.on("user left",function(n){a(n.username+" left"),e(n),c(n)}),U.on("typing",function(e){r(e)}),U.on("stop typing",function(e){c(e)}),U.on("first",function(){$(".modal").modal("show")}),n(),$("span.key-btn").click(function(){$("#key-modal").modal("show")}),window.onfocus=function(){m=!0,g=0,favicon.reset()},window.onblur=function(){m=!1},E.on("success",function(e){$(e.trigger).tooltip({title:"Copied!",trigger:"manual",placement:"auto"}),$(e.trigger).tooltip("show"),setTimeout(function(){$(e.trigger).tooltip("hide")},2e3),e.clearSelection()}),E.on("error",function(e){$(e.trigger).tooltip({title:"Press ⌘C to copy",trigger:"manual",placement:"auto"}),$(e.trigger).tooltip("show"),setTimeout(function(){$(e.trigger).tooltip("hide")},2e3)})}});
\ No newline at end of file
diff --git a/src/views/index.mustache b/src/views/index.mustache
index eedc48d..b4d95b5 100644
--- a/src/views/index.mustache
+++ b/src/views/index.mustache
@@ -33,7 +33,11 @@
This chat encryption key is randomly generated by every client. Clients must use the same chat key to decrypt chat messages. This key is NOT STORED nor transmitted to the server. Regardless if the room URL was shared, chat messages will appear as hash values until the same key is used between clients. You may change the key as many times as you want.
-
+
+
+
+
+ *Warning: If there is no key specified, anyone with the chat url will be able to see decrypted messages.