mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	encrypt and decrypt subtrees (in tree context menu)
This commit is contained in:
		| @@ -6,6 +6,9 @@ const contextMenuSetup = { | |||||||
|         {title: "Insert child note", cmd: "insertChildNote", uiIcon: "ui-icon-pencil"}, |         {title: "Insert child note", cmd: "insertChildNote", uiIcon: "ui-icon-pencil"}, | ||||||
|         {title: "Delete", cmd: "delete", uiIcon: "ui-icon-trash"}, |         {title: "Delete", cmd: "delete", uiIcon: "ui-icon-trash"}, | ||||||
|         {title: "----"}, |         {title: "----"}, | ||||||
|  |         {title: "Encrypt sub-tree", cmd: "encryptSubTree", uiIcon: "ui-icon-locked"}, | ||||||
|  |         {title: "Decrypt sub-tree", cmd: "decryptSubTree", uiIcon: "ui-icon-unlocked"}, | ||||||
|  |         {title: "----"}, | ||||||
|         {title: "Cut", cmd: "cut", uiIcon: "ui-icon-scissors"}, |         {title: "Cut", cmd: "cut", uiIcon: "ui-icon-scissors"}, | ||||||
|         {title: "Copy / clone", cmd: "copy", uiIcon: "ui-icon-copy"}, |         {title: "Copy / clone", cmd: "copy", uiIcon: "ui-icon-copy"}, | ||||||
|         {title: "Paste after", cmd: "pasteAfter", uiIcon: "ui-icon-clipboard"}, |         {title: "Paste after", cmd: "pasteAfter", uiIcon: "ui-icon-clipboard"}, | ||||||
| @@ -36,6 +39,12 @@ const contextMenuSetup = { | |||||||
|         else if (ui.cmd === "insertChildNote") { |         else if (ui.cmd === "insertChildNote") { | ||||||
|             createNote(node, node.key, 'into'); |             createNote(node, node.key, 'into'); | ||||||
|         } |         } | ||||||
|  |         else if (ui.cmd === "encryptSubTree") { | ||||||
|  |             encryptSubTree(node.key); | ||||||
|  |         } | ||||||
|  |         else if (ui.cmd === "decryptSubTree") { | ||||||
|  |             decryptSubTree(node.key); | ||||||
|  |         } | ||||||
|         else if (ui.cmd === "cut") { |         else if (ui.cmd === "cut") { | ||||||
|             globalClipboardNoteId = node.key; |             globalClipboardNoteId = node.key; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -82,8 +82,6 @@ $("#encryptionPasswordForm").submit(function() { | |||||||
|  |  | ||||||
|         globalDataKey = key; |         globalDataKey = key; | ||||||
|  |  | ||||||
|         console.log("got the key", key); |  | ||||||
|  |  | ||||||
|         for (const noteId of globalAllNoteIds) { |         for (const noteId of globalAllNoteIds) { | ||||||
|             const note = getNodeByKey(noteId); |             const note = getNodeByKey(noteId); | ||||||
|  |  | ||||||
| @@ -100,7 +98,11 @@ $("#encryptionPasswordForm").submit(function() { | |||||||
|             globalEncryptionCallback = null; |             globalEncryptionCallback = null; | ||||||
|         } |         } | ||||||
|     }) |     }) | ||||||
|         .catch(reason => alert(reason)); |         .catch(reason => { | ||||||
|  |             console.log(reason); | ||||||
|  |  | ||||||
|  |             alert(reason); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|     return false; |     return false; | ||||||
| }); | }); | ||||||
| @@ -266,3 +268,108 @@ function decryptNote(note) { | |||||||
|     note.detail.note_title = decryptString(note.detail.note_title); |     note.detail.note_title = decryptString(note.detail.note_title); | ||||||
|     note.detail.note_text = decryptString(note.detail.note_text); |     note.detail.note_text = decryptString(note.detail.note_text); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function encryptSubTree(noteId) { | ||||||
|  |     handleEncryption(true, true, () => { | ||||||
|  |         updateSubTreeRecursively(noteId, note => { | ||||||
|  |             if (note.detail.encryption === null || note.detail.encryption === 0) { | ||||||
|  |                 encryptNote(note); | ||||||
|  |  | ||||||
|  |                 note.detail.encryption = 1; | ||||||
|  |  | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |             note => { | ||||||
|  |                 if (note.detail.note_id === globalCurrentNote.detail.note_id) { | ||||||
|  |                     loadNote(note.detail.note_id); | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  |                     setTreeBasedOnEncryption(note); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |         alert("Encryption finished."); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function decryptSubTree(noteId) { | ||||||
|  |     handleEncryption(true, true, () => { | ||||||
|  |         updateSubTreeRecursively(noteId, note => { | ||||||
|  |             if (note.detail.encryption === 1) { | ||||||
|  |                 decryptNote(note); | ||||||
|  |  | ||||||
|  |                 note.detail.encryption = 0; | ||||||
|  |  | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |             note => { | ||||||
|  |                 if (note.detail.note_id === globalCurrentNote.detail.note_id) { | ||||||
|  |                     loadNote(note.detail.note_id); | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  |                     setTreeBasedOnEncryption(note); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |         alert("Decryption finished."); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function updateSubTreeRecursively(noteId, updateCallback, successCallback) { | ||||||
|  |     updateNoteSynchronously(noteId, updateCallback, successCallback); | ||||||
|  |  | ||||||
|  |     const node = getNodeByKey(noteId); | ||||||
|  |     if (!node || !node.getChildren()) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (const child of node.getChildren()) { | ||||||
|  |         updateSubTreeRecursively(child.key, updateCallback, successCallback); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function updateNoteSynchronously(noteId, updateCallback, successCallback) { | ||||||
|  |     $.ajax({ | ||||||
|  |         url: baseUrl + 'notes/' + noteId, | ||||||
|  |         type: 'GET', | ||||||
|  |         async: false, | ||||||
|  |         success: function (note) { | ||||||
|  |             const needSave = updateCallback(note); | ||||||
|  |  | ||||||
|  |             if (!needSave) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for (const link of note.links) { | ||||||
|  |                 delete link.type; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $.ajax({ | ||||||
|  |                 url: baseUrl + 'notes/' + noteId, | ||||||
|  |                 type: 'PUT', | ||||||
|  |                 data: JSON.stringify(note), | ||||||
|  |                 contentType: "application/json", | ||||||
|  |                 async: false, | ||||||
|  |                 success: function () { | ||||||
|  |                     if (successCallback) { | ||||||
|  |                         successCallback(note); | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 error: function () { | ||||||
|  |                     console.log("Updating " + noteId + " failed."); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         error: function () { | ||||||
|  |             console.log("Reading " + noteId + " failed."); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | } | ||||||
| @@ -149,6 +149,11 @@ function createNote(node, parentKey, target, encryption) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function setTreeBasedOnEncryption(note) { | ||||||
|  |     const node = getNodeByKey(note.detail.note_id); | ||||||
|  |     node.toggleClass("encrypted", note.detail.encryption > 0); | ||||||
|  | } | ||||||
|  |  | ||||||
| function setNoteBackgroundIfEncrypted(note) { | function setNoteBackgroundIfEncrypted(note) { | ||||||
|     if (note.detail.encryption > 0) { |     if (note.detail.encryption > 0) { | ||||||
|         $(".note-editable").addClass("encrypted"); |         $(".note-editable").addClass("encrypted"); | ||||||
| @@ -161,8 +166,7 @@ function setNoteBackgroundIfEncrypted(note) { | |||||||
|         $("#decryptButton").hide(); |         $("#decryptButton").hide(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const node = getNodeByKey(note.detail.note_id); |     setTreeBasedOnEncryption(note); | ||||||
|     node.toggleClass("encrypted", note.detail.encryption > 0); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| function loadNote(noteId) { | function loadNote(noteId) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user