mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02:00
encrypt and decrypt subtrees (in tree context menu)
This commit is contained in:
parent
52034e0cdc
commit
d6ffae2035
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user