From 4b9d36039734a1b23d960ba215190860855b0141 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Mon, 28 Jan 2019 19:11:25 +0100 Subject: Tried implementing encrypted message storage --- public/scripts/chat.js | 7 ++++++- public/scripts/encryption.js | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) (limited to 'public') diff --git a/public/scripts/chat.js b/public/scripts/chat.js index 35e75db..36cfdf1 100644 --- a/public/scripts/chat.js +++ b/public/scripts/chat.js @@ -90,9 +90,11 @@ function chat() { // Peer events peer.on('open', id => console.log('[LOG] Your ID is', id)); peer.on('error', err => console.error(err)); - peer.on('connection', conn => { + peer.on('connection', async conn => { connectedPeer = conn; console.log('[LOG] Connected with', connectedPeer.peer); + encryption.getMsgs(connectedPeer.peer, await encryption.get(connectedPeer.peer), await encryption.getPrivate(), passphrase).then(messages => + messages.forEach(data => receivedMessage(`${data.message} - ${data.time}`, true))); connectedPeer.on('open', async () => transferKey(await encryption.getPublic())); connectedPeer.on('data', async message => { console.log('[LOG] Received new message!'); @@ -111,6 +113,8 @@ function chat() { console.log('[LOG] Your connection ID is', connectionId); connectedPeer = peer.connect(id, {label: connectionId, reliable: true}); console.log('[LOG] Connected with', connectedPeer.peer); + encryption.getMsgs(connectedPeer.peer, await encryption.get(connectedPeer.peer), await encryption.getPrivate(), passphrase).then(messages => + messages.forEach(data => receivedMessage(`${data.message} - ${data.time}`, true))); connectedPeer.on('open', async () => transferKey(await encryption.getPublic())); connectedPeer.on('data', async message => { console.log('[LOG] Received new message!'); @@ -151,6 +155,7 @@ function chat() { $('#messages').append(`${message}
`); } else { if (message.type === 'text') { + await encryption.storeMsg(peerId, message.data); await encryption.decrypt(message.data, await encryption.get(connectedPeer.peer), await encryption.getPrivate(), passphrase) .then(plaintext => $('#messages').append(`${plaintext}
`)); } else if (message.type === 'key') { diff --git a/public/scripts/encryption.js b/public/scripts/encryption.js index 6406906..d1d4038 100644 --- a/public/scripts/encryption.js +++ b/public/scripts/encryption.js @@ -6,6 +6,7 @@ */ const Dexie = require('dexie'); +const moment = require('moment'); const openpgp = require('openpgp'); let db; @@ -19,7 +20,7 @@ function setupDatabase() { db.version(2).stores({ own_keys: '&key_type, key_data', peer_keys: 'peer_id, key_data', - messages: 'peer_id, message' + messages: '++id, peer_id, message, time' }); localStorage.setItem('database', 'success'); @@ -149,6 +150,41 @@ async function isEncrypted() { }); } +/** + * Stores a message + * @param peerId + * @param message + */ +async function storeMessage(peerId, message) { + await db.messages.put({peer_id: peerId, message: message, time: new Date()}).then(() => + console.log('[LOG] Stored message of ' + peerId) + ); +} + +/** + * Gets a message + * @param peerId + * @param publicKey + * @param privateKey + * @param passphrase + */ +async function getMessages(peerId, publicKey, privateKey, passphrase) { + console.log('[LOG] Getting messages'); + try { + return await db.messages.where('peer_id').equals(peerId).sortBy('id').toArray().then(messages => { + let messageArray = []; + messages.forEach(async messageObj => messageArray.push({ + message: await decrypt(messages['message'], publicKey, privateKey, passphrase), + time: moment(messageObj['time']).fromNow() + })); + return messageArray; + }) + } catch (e) { + console.log('[LOG] No messages found!'); + return []; + } +} + /** * Stores the public key of a peer * @param peerId @@ -209,6 +245,8 @@ exports.encrypt = encrypt; exports.decrypt = decrypt; exports.decryptPrivate = decryptPrivateKey; exports.check = isEncrypted; +exports.storeMsg = storeMessage; +exports.getMsgs = getMessages; exports.store = storePeerPublicKey; exports.get = getPeerPublicKey; exports.getId = getPublicKeyUserId; -- cgit v1.2.3