mirror of
https://github.com/darkwire/darkwire.io.git
synced 2025-07-18 18:54:52 +00:00
Working implementation of darkwire interface
This commit is contained in:
parent
ebeab321e1
commit
c6670b56d6
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
node_modules
|
node_modules
|
||||||
|
npm-debug.log
|
||||||
src/public/main.js
|
src/public/main.js
|
||||||
src/.secret
|
src/.secret
|
||||||
|
11
gulpfile.js
11
gulpfile.js
@ -16,6 +16,15 @@ gulp.task('bundle', function() {
|
|||||||
.pipe(gulp.dest('src/public'))
|
.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() {
|
gulp.task('start', function() {
|
||||||
nodemon({
|
nodemon({
|
||||||
script: 'index.js',
|
script: 'index.js',
|
||||||
@ -24,6 +33,6 @@ gulp.task('start', function() {
|
|||||||
env: {
|
env: {
|
||||||
'NODE_ENV': 'development'
|
'NODE_ENV': 'development'
|
||||||
},
|
},
|
||||||
tasks: ['bundle']
|
tasks: ['dev']
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
@ -9,6 +9,25 @@ export default class Darkwire {
|
|||||||
this._myUserId = false;
|
this._myUserId = false;
|
||||||
this._connected = false;
|
this._connected = false;
|
||||||
this._users = [];
|
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() {
|
get users() {
|
||||||
@ -60,18 +79,14 @@ export default class Darkwire {
|
|||||||
encodeMessage(message, messageType) {
|
encodeMessage(message, messageType) {
|
||||||
// Don't send unless other users exist
|
// Don't send unless other users exist
|
||||||
return new Promise( (resolve, reject) => {
|
return new Promise( (resolve, reject) => {
|
||||||
if (this._users.length <= 1) {
|
// if (this._users.length <= 1) {
|
||||||
reject();
|
// console.log('rejected:' + this._users);
|
||||||
return;
|
// reject();
|
||||||
};
|
// return;
|
||||||
|
// };
|
||||||
|
|
||||||
// if there is a non-empty message and a socket connection
|
// if there is a non-empty message and a socket connection
|
||||||
if (message && this._connected) {
|
if (message && this._connected) {
|
||||||
$('#send-message-btn').removeClass('active');
|
|
||||||
addChatMessage({
|
|
||||||
username: username,
|
|
||||||
message: message
|
|
||||||
});
|
|
||||||
let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16));
|
let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16));
|
||||||
|
|
||||||
let secretKey;
|
let secretKey;
|
||||||
@ -80,14 +95,13 @@ export default class Darkwire {
|
|||||||
let signature;
|
let signature;
|
||||||
let signingKey;
|
let signingKey;
|
||||||
let encryptedMessageData;
|
let encryptedMessageData;
|
||||||
|
|
||||||
// Generate new secret key and vector for each message
|
// Generate new secret key and vector for each message
|
||||||
this._cryptoUtil.createSecretKey()
|
this._cryptoUtil.createSecretKey()
|
||||||
.then(function(key) {
|
.then((key) => {
|
||||||
secretKey = key;
|
secretKey = key;
|
||||||
return this._cryptoUtil.createSigningKey();
|
return this._cryptoUtil.createSigningKey();
|
||||||
})
|
})
|
||||||
.then(function(key) {
|
.then((key) => {
|
||||||
signingKey = key;
|
signingKey = key;
|
||||||
// Generate secretKey and encrypt with each user's public key
|
// Generate secretKey and encrypt with each user's public key
|
||||||
let promises = [];
|
let promises = [];
|
||||||
@ -101,20 +115,20 @@ export default class Darkwire {
|
|||||||
|
|
||||||
// Export secret key
|
// Export secret key
|
||||||
this._cryptoUtil.exportKey(secretKey, "raw")
|
this._cryptoUtil.exportKey(secretKey, "raw")
|
||||||
.then(function(data) {
|
.then((data) => {
|
||||||
return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey);
|
return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey);
|
||||||
})
|
})
|
||||||
.then(function(encryptedSecretKey) {
|
.then((encryptedSecretKey) => {
|
||||||
let encData = new Uint8Array(encryptedSecretKey);
|
let encData = new Uint8Array(encryptedSecretKey);
|
||||||
secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData);
|
secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData);
|
||||||
// Export HMAC signing key
|
// Export HMAC signing key
|
||||||
return this._cryptoUtil.exportKey(signingKey, "raw");
|
return this._cryptoUtil.exportKey(signingKey, "raw");
|
||||||
})
|
})
|
||||||
.then(function(data) {
|
.then((data) => {
|
||||||
// Encrypt signing key with user's public key
|
// Encrypt signing key with user's public key
|
||||||
return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey);
|
return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey);
|
||||||
})
|
})
|
||||||
.then(function(encryptedSigningKey) {
|
.then((encryptedSigningKey) => {
|
||||||
let encData = new Uint8Array(encryptedSigningKey);
|
let encData = new Uint8Array(encryptedSigningKey);
|
||||||
var str = this._cryptoUtil.convertArrayBufferViewToString(encData);
|
var str = this._cryptoUtil.convertArrayBufferViewToString(encData);
|
||||||
res({
|
res({
|
||||||
@ -129,16 +143,16 @@ export default class Darkwire {
|
|||||||
});
|
});
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
})
|
})
|
||||||
.then(function(data) {
|
.then((data) => {
|
||||||
secretKeys = data;
|
secretKeys = data;
|
||||||
messageData = this._cryptoUtil.convertStringToArrayBufferView(message);
|
messageData = this._cryptoUtil.convertStringToArrayBufferView(message);
|
||||||
return this._cryptoUtil.signKey(messageData, signingKey);
|
return this._cryptoUtil.signKey(messageData, signingKey);
|
||||||
})
|
})
|
||||||
.then(function(data) {
|
.then((data) => {
|
||||||
signature = data;
|
signature = data;
|
||||||
return this._cryptoUtil.encryptMessage(messageData, secretKey, vector);
|
return this._cryptoUtil.encryptMessage(messageData, secretKey, vector);
|
||||||
})
|
})
|
||||||
.then(function(data) {
|
.then((data) => {
|
||||||
encryptedMessageData = data;
|
encryptedMessageData = data;
|
||||||
let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData));
|
let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData));
|
||||||
let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector));
|
let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector));
|
||||||
@ -146,7 +160,7 @@ export default class Darkwire {
|
|||||||
resolve({
|
resolve({
|
||||||
message: msg,
|
message: msg,
|
||||||
vector: vct,
|
vector: vct,
|
||||||
messageType: type,
|
messageType: messageType,
|
||||||
secretKeys: secretKeys,
|
secretKeys: secretKeys,
|
||||||
signature: sig
|
signature: sig
|
||||||
});
|
});
|
||||||
@ -176,7 +190,7 @@ export default class Darkwire {
|
|||||||
let secretKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.secretKey);
|
let secretKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.secretKey);
|
||||||
let signingKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.encryptedSigningKey);
|
let signingKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.encryptedSigningKey);
|
||||||
|
|
||||||
this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, keys.private)
|
this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, this._keys.private)
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
return this._cryptoUtil.importSecretKey(new Uint8Array(data), "raw");
|
return this._cryptoUtil.importSecretKey(new Uint8Array(data), "raw");
|
||||||
})
|
})
|
||||||
@ -187,7 +201,7 @@ export default class Darkwire {
|
|||||||
.then((data) => {
|
.then((data) => {
|
||||||
decryptedMessageData = data;
|
decryptedMessageData = data;
|
||||||
decryptedMessage = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(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) => {
|
.then((data) => {
|
||||||
return this._cryptoUtil.importSigningKey(new Uint8Array(data), "raw");
|
return this._cryptoUtil.importSigningKey(new Uint8Array(data), "raw");
|
||||||
|
@ -39,7 +39,7 @@ export default class FileHandler {
|
|||||||
|
|
||||||
reader.readAsBinaryString(file);
|
reader.readAsBinaryString(file);
|
||||||
|
|
||||||
return base64;
|
return encodedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -33,8 +33,6 @@ $(function() {
|
|||||||
|
|
||||||
let roomId = window.location.pathname.length ? window.location.pathname : null;
|
let roomId = window.location.pathname.length ? window.location.pathname : null;
|
||||||
|
|
||||||
let keys = {};
|
|
||||||
|
|
||||||
if (!roomId) return;
|
if (!roomId) return;
|
||||||
|
|
||||||
$('input.share-text').val(document.location.protocol + "//" + document.location.host + roomId);
|
$('input.share-text').val(document.location.protocol + "//" + document.location.host + roomId);
|
||||||
@ -77,7 +75,7 @@ $(function() {
|
|||||||
cryptoUtil.createPrimaryKeys()
|
cryptoUtil.createPrimaryKeys()
|
||||||
])
|
])
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
keys = {
|
darkwire.keys = {
|
||||||
public: data[0].publicKey,
|
public: data[0].publicKey,
|
||||||
private: data[0].privateKey
|
private: data[0].privateKey
|
||||||
};
|
};
|
||||||
@ -231,13 +229,7 @@ $(function() {
|
|||||||
$window.keydown(function (event) {
|
$window.keydown(function (event) {
|
||||||
// When the client hits ENTER on their keyboard and chat message input is focused
|
// When the client hits ENTER on their keyboard and chat message input is focused
|
||||||
if (event.which === 13 && $('.inputMessage').is(':focus')) {
|
if (event.which === 13 && $('.inputMessage').is(':focus')) {
|
||||||
let message = cleanInput($inputMessage.val());
|
handleMessageSending();
|
||||||
darkwire.encodeMessage(message, 'chat').then( (message) => {
|
|
||||||
$inputMessage.val('');
|
|
||||||
socket.emit('new message', message);
|
|
||||||
}).catch( (err) => {
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
socket.emit('stop typing');
|
socket.emit('stop typing');
|
||||||
typing = false;
|
typing = false;
|
||||||
}
|
}
|
||||||
@ -296,16 +288,14 @@ $(function() {
|
|||||||
|
|
||||||
// Whenever the server emits 'new message', update the chat body
|
// Whenever the server emits 'new message', update the chat body
|
||||||
socket.on('new message', function (data) {
|
socket.on('new message', function (data) {
|
||||||
// Don't show messages if no key
|
darkwire.decodeMessage(data).then( (data) => {
|
||||||
if (!windowHandler.isActive) {
|
if (!windowHandler.isActive) {
|
||||||
windowHandler.notifyFavicon();
|
windowHandler.notifyFavicon();
|
||||||
darkwire.audio.play();
|
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
|
// Whenever the server emits 'user left', log it in the chat body
|
||||||
@ -363,14 +353,7 @@ $(function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#send-message-btn').click(function() {
|
$('#send-message-btn').click(function() {
|
||||||
let message = cleanInput($inputMessage.val());
|
handleMessageSending();
|
||||||
// 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);
|
|
||||||
});
|
|
||||||
socket.emit('stop typing');
|
socket.emit('stop typing');
|
||||||
typing = false;
|
typing = false;
|
||||||
});
|
});
|
||||||
@ -385,4 +368,21 @@ $(function() {
|
|||||||
darkwire.audio.soundEnabled = state;
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -293,6 +293,6 @@ html.no-touchevents .chat #input-icons {
|
|||||||
border-color: #2a9fd6 !important;
|
border-color: #2a9fd6 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#fileSendForm {
|
#fileInput {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user