Creating some stability

This commit is contained in:
Dan Seripap 2016-02-19 11:57:01 -05:00
parent e59bb2a1cf
commit ebeab321e1
2 changed files with 113 additions and 95 deletions

View File

@ -52,99 +52,108 @@ export default class Darkwire {
return importKeysPromises; return importKeysPromises;
} }
sendMessage(message, messageType) { removeUser(data) {
this._users = _.without(this._users, _.findWhere(this._users, {id: data.id}));
return this._users;
}
encodeMessage(message, messageType) {
// Don't send unless other users exist // Don't send unless other users exist
console.log(this._users); return new Promise( (resolve, reject) => {
if (this._users.length <= 1) return; if (this._users.length <= 1) {
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) {
$inputMessage.val(''); $('#send-message-btn').removeClass('active');
$('#send-message-btn').removeClass('active'); addChatMessage({
addChatMessage({ username: username,
username: username, message: message
message: message
});
let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16));
let secretKey;
let secretKeys;
let messageData;
let signature;
let signingKey;
let encryptedMessageData;
// Generate new secret key and vector for each message
this._cryptoUtil.createSecretKey()
.then(function(key) {
secretKey = key;
return this._cryptoUtil.createSigningKey();
})
.then(function(key) {
signingKey = key;
// Generate secretKey and encrypt with each user's public key
let promises = [];
_.each(this._users, function(user) {
// If not me
if (user.username !== window.username) {
let promise = new Promise(function(resolve, reject) {
let thisUser = user;
let secretKeyStr;
// Export secret key
this._cryptoUtil.exportKey(secretKey, "raw")
.then(function(data) {
return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey);
})
.then(function(encryptedSecretKey) {
let encData = new Uint8Array(encryptedSecretKey);
secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData);
// Export HMAC signing key
return this._cryptoUtil.exportKey(signingKey, "raw");
})
.then(function(data) {
// Encrypt signing key with user's public key
return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey);
})
.then(function(encryptedSigningKey) {
let encData = new Uint8Array(encryptedSigningKey);
var str = this._cryptoUtil.convertArrayBufferViewToString(encData);
resolve({
id: thisUser.id,
secretKey: secretKeyStr,
encryptedSigningKey: str
});
});
});
promises.push(promise);
}
});
return Promise.all(promises);
})
.then(function(data) {
secretKeys = data;
messageData = this._cryptoUtil.convertStringToArrayBufferView(message);
return this._cryptoUtil.signKey(messageData, signingKey);
})
.then(function(data) {
signature = data;
return this._cryptoUtil.encryptMessage(messageData, secretKey, vector);
})
.then(function(data) {
encryptedMessageData = data;
let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData));
let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector));
let sig = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(signature));
socket.emit('new message', {
message: msg,
vector: vct,
messageType: type,
secretKeys: secretKeys,
signature: sig
});
}); });
} let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16));
let secretKey;
let secretKeys;
let messageData;
let signature;
let signingKey;
let encryptedMessageData;
// Generate new secret key and vector for each message
this._cryptoUtil.createSecretKey()
.then(function(key) {
secretKey = key;
return this._cryptoUtil.createSigningKey();
})
.then(function(key) {
signingKey = key;
// Generate secretKey and encrypt with each user's public key
let promises = [];
_.each(this._users, (user) => {
// If not me
if (user.username !== window.username) {
let promise = new Promise((res, rej) => {
let thisUser = user;
let secretKeyStr;
// Export secret key
this._cryptoUtil.exportKey(secretKey, "raw")
.then(function(data) {
return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey);
})
.then(function(encryptedSecretKey) {
let encData = new Uint8Array(encryptedSecretKey);
secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData);
// Export HMAC signing key
return this._cryptoUtil.exportKey(signingKey, "raw");
})
.then(function(data) {
// Encrypt signing key with user's public key
return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey);
})
.then(function(encryptedSigningKey) {
let encData = new Uint8Array(encryptedSigningKey);
var str = this._cryptoUtil.convertArrayBufferViewToString(encData);
res({
id: thisUser.id,
secretKey: secretKeyStr,
encryptedSigningKey: str
});
});
});
promises.push(promise);
}
});
return Promise.all(promises);
})
.then(function(data) {
secretKeys = data;
messageData = this._cryptoUtil.convertStringToArrayBufferView(message);
return this._cryptoUtil.signKey(messageData, signingKey);
})
.then(function(data) {
signature = data;
return this._cryptoUtil.encryptMessage(messageData, secretKey, vector);
})
.then(function(data) {
encryptedMessageData = data;
let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData));
let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector));
let sig = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(signature));
resolve({
message: msg,
vector: vct,
messageType: type,
secretKeys: secretKeys,
signature: sig
});
});
}
});
} }
decodeMessage(data) { decodeMessage(data) {

View File

@ -232,7 +232,12 @@ $(function() {
// 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()); let message = cleanInput($inputMessage.val());
darkwire.sendMessage(message, 'chat'); 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;
} }
@ -309,7 +314,7 @@ $(function() {
addParticipantsMessage(data); addParticipantsMessage(data);
removeChatTyping(data); removeChatTyping(data);
users = _.without(users, _.findWhere(users, {id: data.id})); darkwire.removeUser(data);
renderParticipantsList(); renderParticipantsList();
}); });
@ -358,10 +363,14 @@ $(function() {
} }
$('#send-message-btn').click(function() { $('#send-message-btn').click(function() {
let message = $inputMessage.val(); let message = cleanInput($inputMessage.val());
// Prevent markup from being injected into the message // Prevent markup from being injected into the message
message = cleanInput(message); darkwire.encodeMessage(message, 'chat').then( (message) => {
darkwire.sendMessage(message, 'chat'); $inputMessage.val('');
socket.emit('new message', message);
}).catch( (err) => {
console.log(err);
});
socket.emit('stop typing'); socket.emit('stop typing');
typing = false; typing = false;
}); });