From fe3d3c1995d9b56a4e713079fdb046bf340956c6 Mon Sep 17 00:00:00 2001 From: azivner Date: Wed, 6 Sep 2017 23:13:39 -0400 Subject: [PATCH] note titles are now encrypted as well - plus auto-decryption of note tree and unloading --- src/tree_api.py | 3 +- static/js/encryption.js | 62 ++++++++++++++++++++++++++++------------- static/js/note.js | 6 ++-- static/js/tree.js | 11 ++++++-- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/tree_api.py b/src/tree_api.py index b260812e5..f9e9646e9 100644 --- a/src/tree_api.py +++ b/src/tree_api.py @@ -11,7 +11,8 @@ def getTree(): notes = getResults("select " "notes_tree.*, " "COALESCE(clone.note_title, notes.note_title) as note_title, " - "notes.note_clone_id, " + "notes.note_clone_id, " + "notes.encryption, " "case when notes.note_clone_id is null or notes.note_clone_id = '' then 0 else 1 end as is_clone " "from notes_tree " "join notes on notes.note_id = notes_tree.note_id " diff --git a/static/js/encryption.js b/static/js/encryption.js index 82b8dc9e6..59a886f4f 100644 --- a/static/js/encryption.js +++ b/static/js/encryption.js @@ -91,6 +91,16 @@ $("#encryptionPasswordForm").submit(function() { globalEncryptionKey = key; + for (const noteId of globalAllNoteIds) { + const note = getNodeByKey(noteId); + + if (note.data.encryption > 0) { + const title = decryptString(note.data.note_title); + + note.setTitle(title); + } + } + if (globalEncryptionCallback !== null) { globalEncryptionCallback(); @@ -110,6 +120,14 @@ function getAes() { if (globalNote.detail.encryption > 0) { loadNote(globalNote.detail.note_id); + + for (const noteId of globalAllNoteIds) { + const note = getNodeByKey(noteId); + + if (note.data.encryption > 0) { + note.setTitle("[encrypted]"); + } + } } } }, globalEncryptionKeyTimeToLive + 1000); @@ -126,16 +144,29 @@ function encryptNoteIfNecessary(note) { } } -function encryptNote(note) { +function encryptString(str) { const aes = getAes(); - const noteJson = note.detail.note_text; + const bytes = aesjs.utils.utf8.toBytes(str); - const noteBytes = aesjs.utils.utf8.toBytes(noteJson); + const encryptedBytes = aes.encrypt(bytes); - const encryptedBytes = aes.encrypt(noteBytes); + return uint8ToBase64(encryptedBytes); +} - // To print or store the binary data, you may convert it to hex - note.detail.note_text = uint8ToBase64(encryptedBytes); +function decryptString(encryptedBase64) { + const aes = getAes(); + const encryptedBytes = base64ToUint8Array(encryptedBase64); + + const decryptedBytes = aes.decrypt(encryptedBytes); + + return aesjs.utils.utf8.fromBytes(decryptedBytes); +} + +function encryptNote(note) { + note.detail.note_title = encryptString(note.detail.note_title); + note.detail.note_text = encryptString(note.detail.note_text); + + note.detail.encryption = 1; return note; } @@ -148,8 +179,6 @@ function encryptNoteAndSendToServer() { encryptNote(note); - note.detail.encryption = 1; - saveNoteToServer(note); setNoteBackgroundIfEncrypted(note); @@ -171,19 +200,12 @@ function decryptNoteAndSendToServer() { } function decryptNoteIfNecessary(note) { - if (note.detail.encryption === 1) { - return decryptNote(note.detail.note_text); - } - else { - return note.detail.note_text; + if (note.detail.encryption > 0) { + return decryptNote(note); } } -function decryptNote(encryptedBase64) { - const aes = getAes(); - const encryptedBytes = base64ToUint8Array(encryptedBase64); - - const decryptedBytes = aes.decrypt(encryptedBytes); - - return aesjs.utils.utf8.fromBytes(decryptedBytes); +function decryptNote(note) { + note.detail.note_title = decryptString(note.detail.note_title); + note.detail.note_text = decryptString(note.detail.note_text); } \ No newline at end of file diff --git a/static/js/note.js b/static/js/note.js index f4d2d1113..5f691e5b8 100644 --- a/static/js/note.js +++ b/static/js/note.js @@ -158,8 +158,6 @@ function loadNote(noteId) { $.get(baseUrl + 'notes/' + noteId).then(function(note) { globalNote = note; - $("#noteTitle").val(note.detail.note_title); - if (newNoteCreated) { newNoteCreated = false; @@ -177,7 +175,9 @@ function loadNote(noteId) { $("#encryptionPassword").val(''); - note.detail.note_text = decryptNoteIfNecessary(note); + decryptNoteIfNecessary(note); + + $("#noteTitle").val(note.detail.note_title); let noteText = notecase2html(note); diff --git a/static/js/tree.js b/static/js/tree.js index 546dc01a5..9051e6cdb 100644 --- a/static/js/tree.js +++ b/static/js/tree.js @@ -164,10 +164,15 @@ $(function(){ for (const note of notes) { globalAllNoteIds.push(note.note_id); - note.title = note.note_title; + if (note.encryption > 0) { + note.title = "[encrypted]"; + } + else { + note.title = note.note_title; - if (note.is_clone) { - note.title += " (clone)"; + if (note.is_clone) { + note.title += " (clone)"; + } } note.key = note.note_id;