From a6036859b8bd24be31dfcf6318e57cf696fa25bc Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 27 Nov 2023 23:23:55 +0100 Subject: [PATCH 1/7] normalize strings before calculation hashes, #4435 --- src/services/utils.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/utils.js b/src/services/utils.js index 517d65ef9..67cd32881 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -63,6 +63,8 @@ function isElectron() { } function hash(text) { + text = text.normalize(); + return crypto.createHash('sha1').update(text).digest('base64'); } From 84feaabc52df839d6a99861b2d316246cc8c5ede Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 27 Nov 2023 23:37:24 +0100 Subject: [PATCH 2/7] release 0.62.3 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 00384c537..40d32f208 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.62.2", + "version": "0.62.3", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index e42f64e2d..253b680a2 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2023-11-21T20:49:24+01:00", buildRevision: "e2b1421bf3d764ffe444a103c118e67d8c563673" }; +module.exports = { buildDate:"2023-11-27T23:37:24+01:00", buildRevision: "a6036859b8bd24be31dfcf6318e57cf696fa25bc" }; From d0f6ff5f98f93e68a2264ac60e38e2900563e702 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 4 Dec 2023 00:11:24 +0100 Subject: [PATCH 3/7] fix erasing revisions --- src/routes/api/revisions.js | 5 +++-- src/services/bulk_actions.js | 3 ++- src/services/consistency_checks.js | 2 +- src/services/erase.js | 17 +++++++++++++++-- src/services/revisions.js | 14 +------------- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/routes/api/revisions.js b/src/routes/api/revisions.js index 7fd36476d..d03358005 100644 --- a/src/routes/api/revisions.js +++ b/src/routes/api/revisions.js @@ -8,6 +8,7 @@ const cls = require('../../services/cls'); const path = require('path'); const becca = require("../../becca/becca"); const blobService = require("../../services/blob"); +const eraseService = require("../../services/erase.js"); function getRevisionBlob(req) { const preview = req.query.preview === 'true'; @@ -88,11 +89,11 @@ function eraseAllRevisions(req) { const revisionIdsToErase = sql.getColumn('SELECT revisionId FROM revisions WHERE noteId = ?', [req.params.noteId]); - revisionService.eraseRevisions(revisionIdsToErase); + eraseService.eraseRevisions(revisionIdsToErase); } function eraseRevision(req) { - revisionService.eraseRevisions([req.params.revisionId]); + eraseService.eraseRevisions([req.params.revisionId]); } function restoreRevision(req) { diff --git a/src/services/bulk_actions.js b/src/services/bulk_actions.js index 9926aff67..4917ea7a4 100644 --- a/src/services/bulk_actions.js +++ b/src/services/bulk_actions.js @@ -4,6 +4,7 @@ const becca = require("../becca/becca"); const cloningService = require("./cloning"); const branchService = require("./branches"); const utils = require("./utils"); +const eraseService = require("./erase.js"); const ACTION_HANDLERS = { addLabel: (action, note) => { @@ -18,7 +19,7 @@ const ACTION_HANDLERS = { note.deleteNote(deleteId); }, deleteRevisions: (action, note) => { - revisionService.eraseRevisions(note.getRevisions().map(rev => rev.revisionId)); + eraseService.eraseRevisions(note.getRevisions().map(rev => rev.revisionId)); }, deleteLabel: (action, note) => { for (const label of note.getOwnedLabels(action.labelName)) { diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index 020848d83..b4e0542ef 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -467,7 +467,7 @@ class ConsistencyChecks { WHERE blobs.blobId IS NULL`, ({revisionId, blobId}) => { if (this.autoFix) { - revisionService.eraseRevisions([revisionId]); + eraseService.eraseRevisions([revisionId]); this.reloadNeeded = true; diff --git a/src/services/erase.js b/src/services/erase.js index 1fc03cc09..21cf51f92 100644 --- a/src/services/erase.js +++ b/src/services/erase.js @@ -29,7 +29,7 @@ function eraseNotes(noteIdsToErase) { const revisionIdsToErase = sql.getManyRows(`SELECT revisionId FROM revisions WHERE noteId IN (???)`, noteIdsToErase) .map(row => row.revisionId); - revisionService.eraseRevisions(revisionIdsToErase); + eraseRevisions(revisionIdsToErase); log.info(`Erased notes: ${JSON.stringify(noteIdsToErase)}`); } @@ -79,6 +79,18 @@ function eraseAttachments(attachmentIdsToErase) { log.info(`Erased attachments: ${JSON.stringify(attachmentIdsToErase)}`); } +function eraseRevisions(revisionIdsToErase) { + if (revisionIdsToErase.length === 0) { + return; + } + + sql.executeMany(`DELETE FROM revisions WHERE revisionId IN (???)`, revisionIdsToErase); + + setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'revisions' AND entityId IN (???)`, revisionIdsToErase)); + + log.info(`Removed revisions: ${JSON.stringify(revisionIdsToErase)}`); +} + function eraseUnusedBlobs() { const unusedBlobIds = sql.getColumn(` SELECT blobs.blobId @@ -184,5 +196,6 @@ module.exports = { eraseUnusedAttachmentsNow, eraseNotesWithDeleteId, eraseUnusedBlobs, - eraseAttachments + eraseAttachments, + eraseRevisions }; diff --git a/src/services/revisions.js b/src/services/revisions.js index d7b059efa..01d24906a 100644 --- a/src/services/revisions.js +++ b/src/services/revisions.js @@ -46,18 +46,6 @@ function protectRevisions(note) { } } -function eraseRevisions(revisionIdsToErase) { - if (revisionIdsToErase.length === 0) { - return; - } - - log.info(`Removing revisions: ${JSON.stringify(revisionIdsToErase)}`); - - sql.executeMany(`DELETE FROM revisions WHERE revisionId IN (???)`, revisionIdsToErase); - sql.executeMany(`UPDATE entity_changes SET isErased = 1, utcDateChanged = '${dateUtils.utcNowDateTime()}' WHERE entityName = 'revisions' AND entityId IN (???)`, revisionIdsToErase); -} - module.exports = { - protectRevisions, - eraseRevisions + protectRevisions }; From eb761b286f6e31f6c991db616a78084830654d18 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 4 Dec 2023 00:17:00 +0100 Subject: [PATCH 4/7] electron upgrade --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40d32f208..2f988aa34 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "25.9.5", + "electron": "25.9.7", "electron-builder": "24.6.4", "electron-packager": "17.1.2", "electron-rebuild": "3.2.9", From 2e23c521c356c2305124f5df0f474532fa5f34ce Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 6 Dec 2023 23:54:17 +0100 Subject: [PATCH 5/7] electron upgrade --- package-lock.json | 19 ++++++++++--------- package.json | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a478467a..6d8dbd405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { "name": "trilium", - "version": "0.62.2", + "version": "0.62.3", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.62.2", + "name": "trilium", + "version": "0.62.3", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { @@ -80,7 +81,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "25.9.5", + "electron": "25.9.8", "electron-builder": "24.6.4", "electron-packager": "17.1.2", "electron-rebuild": "3.2.9", @@ -4365,9 +4366,9 @@ } }, "node_modules/electron": { - "version": "25.9.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.5.tgz", - "integrity": "sha512-gM7GXUSd3JVRcYbBnNOtZeNnE5MCJjtZTT8QyIxJvpQ0Dh9dz3hTuEL62dOwnMFW/l47ACQ6es/8qi01P4QGZA==", + "version": "25.9.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.8.tgz", + "integrity": "sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -16963,9 +16964,9 @@ } }, "electron": { - "version": "25.9.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.5.tgz", - "integrity": "sha512-gM7GXUSd3JVRcYbBnNOtZeNnE5MCJjtZTT8QyIxJvpQ0Dh9dz3hTuEL62dOwnMFW/l47ACQ6es/8qi01P4QGZA==", + "version": "25.9.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.8.tgz", + "integrity": "sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg==", "requires": { "@electron/get": "^2.0.0", "@types/node": "^18.11.18", diff --git a/package.json b/package.json index 2f988aa34..c00f2ea59 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "25.9.7", + "electron": "25.9.8", "electron-builder": "24.6.4", "electron-packager": "17.1.2", "electron-rebuild": "3.2.9", From d243880099e08a2085652654af5cd6149c7d82df Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 7 Dec 2023 00:03:59 +0100 Subject: [PATCH 6/7] release 0.62.4 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c00f2ea59..54762a8eb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.62.3", + "version": "0.62.4", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index 253b680a2..de0afa8f3 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2023-11-27T23:37:24+01:00", buildRevision: "a6036859b8bd24be31dfcf6318e57cf696fa25bc" }; +module.exports = { buildDate:"2023-12-07T00:03:59+01:00", buildRevision: "2e23c521c356c2305124f5df0f474532fa5f34ce" }; From 0ac397e7ffbca5f2821b75b719ca04581ada388b Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 11 Dec 2023 23:05:05 +0100 Subject: [PATCH 7/7] fix setNoteToParent API breakage, closes #4505 --- src/services/tree.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/services/tree.js b/src/services/tree.js index 60f481d55..66276ab2f 100644 --- a/src/services/tree.js +++ b/src/services/tree.js @@ -209,8 +209,9 @@ function sortNotesIfNeeded(parentNoteId) { function setNoteToParent(noteId, prefix, parentNoteId) { const parentNote = becca.getNote(parentNoteId); - if (!parentNote) { - throw new Error(`Cannot move note to deleted parent note '${parentNoteId}'`); + if (parentNoteId && !parentNote) { + // null parentNoteId is a valid value + throw new Error(`Cannot move note to deleted / missing parent note '${parentNoteId}'`); } // case where there might be more such branches is ignored. It's expected there should be just one