From c6670b56d6cefa995c4bb43411b8385392614232 Mon Sep 17 00:00:00 2001 From: Dan Seripap Date: Fri, 19 Feb 2016 12:39:47 -0500 Subject: [PATCH] Working implementation of darkwire interface --- .gitignore | 1 + gulpfile.js | 11 +++++++- src/js/darkwire.js | 60 ++++++++++++++++++++++++++----------------- src/js/fileHandler.js | 2 +- src/js/main.js | 54 +++++++++++++++++++------------------- src/public/style.css | 2 +- 6 files changed, 77 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index f918f96..1c3273d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules +npm-debug.log src/public/main.js src/.secret diff --git a/gulpfile.js b/gulpfile.js index 1c27cdb..9bca124 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,6 +16,15 @@ gulp.task('bundle', function() { .pipe(gulp.dest('src/public')) }); +gulp.task('dev', function() { + return browserify('src/js/main.js', { debug: true }).transform(babel.configure({ + presets: ["es2015"] + })).bundle() + .pipe(source('main.js')) + .pipe(buffer()) + .pipe(gulp.dest('src/public')) +}); + gulp.task('start', function() { nodemon({ script: 'index.js', @@ -24,6 +33,6 @@ gulp.task('start', function() { env: { 'NODE_ENV': 'development' }, - tasks: ['bundle'] + tasks: ['dev'] }) }); diff --git a/src/js/darkwire.js b/src/js/darkwire.js index 4f9b40f..7188aae 100644 --- a/src/js/darkwire.js +++ b/src/js/darkwire.js @@ -9,6 +9,25 @@ export default class Darkwire { this._myUserId = false; this._connected = false; this._users = []; + this._keys = {}; + } + + get keys() { + return this._keys; + } + + set keys(keys) { + this._keys = keys; + return this._keys; + } + + get connected() { + return this._connected; + } + + set connected(state) { + this._connected = state; + return this._connected; } get users() { @@ -60,18 +79,14 @@ export default class Darkwire { encodeMessage(message, messageType) { // Don't send unless other users exist return new Promise( (resolve, reject) => { - if (this._users.length <= 1) { - reject(); - return; - }; - + // if (this._users.length <= 1) { + // console.log('rejected:' + this._users); + // reject(); + // return; + // }; + // if there is a non-empty message and a socket connection if (message && this._connected) { - $('#send-message-btn').removeClass('active'); - addChatMessage({ - username: username, - message: message - }); let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16)); let secretKey; @@ -80,14 +95,13 @@ export default class Darkwire { let signature; let signingKey; let encryptedMessageData; - // Generate new secret key and vector for each message this._cryptoUtil.createSecretKey() - .then(function(key) { + .then((key) => { secretKey = key; return this._cryptoUtil.createSigningKey(); }) - .then(function(key) { + .then((key) => { signingKey = key; // Generate secretKey and encrypt with each user's public key let promises = []; @@ -101,20 +115,20 @@ export default class Darkwire { // Export secret key this._cryptoUtil.exportKey(secretKey, "raw") - .then(function(data) { + .then((data) => { return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey); }) - .then(function(encryptedSecretKey) { + .then((encryptedSecretKey) => { let encData = new Uint8Array(encryptedSecretKey); secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData); // Export HMAC signing key return this._cryptoUtil.exportKey(signingKey, "raw"); }) - .then(function(data) { + .then((data) => { // Encrypt signing key with user's public key return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey); }) - .then(function(encryptedSigningKey) { + .then((encryptedSigningKey) => { let encData = new Uint8Array(encryptedSigningKey); var str = this._cryptoUtil.convertArrayBufferViewToString(encData); res({ @@ -129,16 +143,16 @@ export default class Darkwire { }); return Promise.all(promises); }) - .then(function(data) { + .then((data) => { secretKeys = data; messageData = this._cryptoUtil.convertStringToArrayBufferView(message); return this._cryptoUtil.signKey(messageData, signingKey); }) - .then(function(data) { + .then((data) => { signature = data; return this._cryptoUtil.encryptMessage(messageData, secretKey, vector); }) - .then(function(data) { + .then((data) => { encryptedMessageData = data; let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData)); let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector)); @@ -146,7 +160,7 @@ export default class Darkwire { resolve({ message: msg, vector: vct, - messageType: type, + messageType: messageType, secretKeys: secretKeys, signature: sig }); @@ -176,7 +190,7 @@ export default class Darkwire { let secretKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.secretKey); let signingKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.encryptedSigningKey); - this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, keys.private) + this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, this._keys.private) .then((data) => { return this._cryptoUtil.importSecretKey(new Uint8Array(data), "raw"); }) @@ -187,7 +201,7 @@ export default class Darkwire { .then((data) => { decryptedMessageData = data; decryptedMessage = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(data)) - return this._cryptoUtil.decryptSigningKey(signingKeyArrayBuffer, keys.private) + return this._cryptoUtil.decryptSigningKey(signingKeyArrayBuffer, this._keys.private) }) .then((data) => { return this._cryptoUtil.importSigningKey(new Uint8Array(data), "raw"); diff --git a/src/js/fileHandler.js b/src/js/fileHandler.js index adb1744..722005c 100644 --- a/src/js/fileHandler.js +++ b/src/js/fileHandler.js @@ -39,7 +39,7 @@ export default class FileHandler { reader.readAsBinaryString(file); - return base64; + return encodedFile; } return false; diff --git a/src/js/main.js b/src/js/main.js index 70f7ec1..b3c83e7 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -33,8 +33,6 @@ $(function() { let roomId = window.location.pathname.length ? window.location.pathname : null; - let keys = {}; - if (!roomId) return; $('input.share-text').val(document.location.protocol + "//" + document.location.host + roomId); @@ -77,7 +75,7 @@ $(function() { cryptoUtil.createPrimaryKeys() ]) .then(function(data) { - keys = { + darkwire.keys = { public: data[0].publicKey, private: data[0].privateKey }; @@ -231,13 +229,7 @@ $(function() { $window.keydown(function (event) { // When the client hits ENTER on their keyboard and chat message input is focused if (event.which === 13 && $('.inputMessage').is(':focus')) { - let message = cleanInput($inputMessage.val()); - darkwire.encodeMessage(message, 'chat').then( (message) => { - $inputMessage.val(''); - socket.emit('new message', message); - }).catch( (err) => { - console.log(err); - }); + handleMessageSending(); socket.emit('stop typing'); typing = false; } @@ -296,16 +288,14 @@ $(function() { // Whenever the server emits 'new message', update the chat body socket.on('new message', function (data) { - // Don't show messages if no key - if (!windowHandler.isActive) { - windowHandler.notifyFavicon(); - darkwire.audio.play(); - } + darkwire.decodeMessage(data).then( (data) => { + if (!windowHandler.isActive) { + windowHandler.notifyFavicon(); + darkwire.audio.play(); + } + addChatMessage(data); + }); - let decoded = darkwire.decode(data); - decoded.then( (data) => { - console.log(data); - }) }); // Whenever the server emits 'user left', log it in the chat body @@ -363,14 +353,7 @@ $(function() { } $('#send-message-btn').click(function() { - let message = cleanInput($inputMessage.val()); - // Prevent markup from being injected into the message - darkwire.encodeMessage(message, 'chat').then( (message) => { - $inputMessage.val(''); - socket.emit('new message', message); - }).catch( (err) => { - console.log(err); - }); + handleMessageSending(); socket.emit('stop typing'); typing = false; }); @@ -385,4 +368,21 @@ $(function() { darkwire.audio.soundEnabled = state; }); + function handleMessageSending() { + let message = $inputMessage; + let cleanedMessage = cleanInput(message.val()); + // Prevent markup from being injected into the message + darkwire.encodeMessage(cleanedMessage, 'chat').then( (socketData) => { + message.val(''); + $('#send-message-btn').removeClass('active'); + addChatMessage({ + username: username, + message: cleanedMessage + }); + socket.emit('new message', socketData); + }).catch( (err) => { + console.log(err); + }); + } + }); diff --git a/src/public/style.css b/src/public/style.css index c8ea770..873608f 100644 --- a/src/public/style.css +++ b/src/public/style.css @@ -293,6 +293,6 @@ html.no-touchevents .chat #input-icons { border-color: #2a9fd6 !important; } -#fileSendForm { +#fileInput { display: none; }