From fd9c19b6e683794ac715518f913397acea88ee97 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Mon, 11 May 2026 11:23:27 +0200 Subject: [PATCH 1/5] Prepare Office history corruption fix https://github.com/cryptpad/cryptpad/issues/2291 --- www/common/onlyoffice/inner.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 0829277ee..f0792aaea 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -565,6 +565,7 @@ define([ isLockedModal.modal = UI.openCustomModal(isLockedModal.content); } myUniqueOOId = undefined; + // myIndex = undefined; TODO enable fix setMyId(); if (APP.docEditor) { APP.docEditor.destroyEditor(); } // Kill the old editor @@ -2998,7 +2999,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null pinImages(); }; - const loadCp = async function (cp, keepQueue) { + const loadCheckpoint = async function (cp, keepQueue) { if (!isLockedModal.modal) { isLockedModal.modal = UI.openCustomModal(isLockedModal.content); } @@ -3018,7 +3019,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null var loadHistoryCp = function (cp, keepQueue) { APP.history = true; APP.stopHistory = false; - loadCp(cp, keepQueue); + loadCheckpoint(cp, keepQueue); }; var loadTemplate = function (href, pw, parsed) { @@ -3068,7 +3069,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null }); ooChannel.historyLastHash = ooChannel.lastHash; ooChannel.currentIndex = ooChannel.cpIndex; - loadCp(lastCp, true); + loadCheckpoint(lastCp, true); }); }; @@ -3239,7 +3240,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null }; var onCheckpoint = function (cp) { // We want to load a checkpoint: - loadCp(cp, true); + loadCheckpoint(cp, true); }; var onPatchBack = function (cp, msgs) { APP.history = true; @@ -3259,10 +3260,10 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null }); ooChannel.queue = msgsFormatted; setTimeout(function () { - loadCp(cp, true); + loadCheckpoint(cp, true); }, 200); } else { - loadCp(cp); + loadCheckpoint(cp); } }; var docType = function() { @@ -3283,7 +3284,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null // Fill the queue and then load the last CP rtChannel.getHistory(function () { var lastCp = getLastCp(); - loadCp(lastCp, true); + loadCheckpoint(lastCp, true); }); }; @@ -3341,7 +3342,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null onPatch: onPatch, onPatchBack: onPatchBack, docType: docType, - loadCp: loadCp, + loadCp: loadCheckpoint, loadHistoryCp: loadHistoryCp, onCheckpoint: onCheckpoint, onRevert: commit, From 19341fc6c551d912f0f9823ead23df6d421f2fab Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Fri, 15 May 2026 14:30:16 +0200 Subject: [PATCH 2/5] Log an error when a Office document is corrupted https://github.com/cryptpad/cryptpad/issues/2291 --- install-onlyoffice.sh | 2 +- www/common/onlyoffice/inner.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/install-onlyoffice.sh b/install-onlyoffice.sh index 69d935150..ab38d1593 100755 --- a/install-onlyoffice.sh +++ b/install-onlyoffice.sh @@ -98,7 +98,7 @@ main() { rm -rf "$OO_DIR/v8/web-apps/apps/spreadsheeteditor/main/resources/help" rm -rf "$OO_DIR/v8/web-apps/apps/common/main/resources/help/" ;; - v9) install_version v9 v9.2.0.119+5 1f1184fb04cf72a7eb2a49a9740074b5419486c79e1fd713e1f8c09b8594a826050ae941fed6ac6a96807ba73cc751d7c807bd7e6b73de9e4f8e74cd5ed04cfa ;; + v9) install_version v9 v9.3.0.140+2 fedf1af4c3b061f6afadbc231cee7f06d15dd1a5e82db3c5f1e9739b7ddf5b5b38825f3ec3da5e92d7ed6ad1d944c11b9f83875cc5fb67bde4f9c9b1434579d8 ;; x2t) install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1 ;; *) echo "Unknown version: $version" diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index f0792aaea..3df20c2ce 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -2629,12 +2629,16 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null makeChannel(); return; } + + const onCorruptionWarning = Util.once((id) => console.log('XXX id collision', id)); + APP.docEditor.connectMockServer({ onMessage: fromOOHandler, getParticipants: getParticipants, onAuth: onAuth, getImageURL: getImageURL, getInitialChanges: getInitialChanges, + onCorruptionWarning: onCorruptionWarning, }); }; From 2ed07f1c26430f1ad6a81f002e2a79a1cc6373a3 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Fri, 15 May 2026 14:44:21 +0200 Subject: [PATCH 3/5] Fix ID collison and add feedback if it happens again https://github.com/cryptpad/cryptpad/issues/2291 --- www/common/onlyoffice/inner.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 3df20c2ce..697437039 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -565,7 +565,7 @@ define([ isLockedModal.modal = UI.openCustomModal(isLockedModal.content); } myUniqueOOId = undefined; - // myIndex = undefined; TODO enable fix + myIndex = undefined; setMyId(); if (APP.docEditor) { APP.docEditor.destroyEditor(); } // Kill the old editor @@ -2630,7 +2630,10 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null return; } - const onCorruptionWarning = Util.once((id) => console.log('XXX id collision', id)); + const onCorruptionWarning = Util.once((id) => { + console.log('id collision in document', id); + Feedback.send('OFFICE_DOCUMENT_ID_COLLISION', true); + }); APP.docEditor.connectMockServer({ onMessage: fromOOHandler, From ea004e3f0b16992f2f8f5ab6d87d84c7373a1670 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Tue, 19 May 2026 14:17:14 +0200 Subject: [PATCH 4/5] Send idCollision feedback only once per new doc --- www/common/onlyoffice/inner.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 697437039..ca6d3c59f 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -102,7 +102,10 @@ define([ hashes: {}, ids: {}, mediasSources: {}, - version: privateData.ooForceVersion ? Number(privateData.ooForceVersion) : OOCurrentVersion.currentVersionNumber + version: privateData.ooForceVersion ? Number(privateData.ooForceVersion) : OOCurrentVersion.currentVersionNumber, + debug: { + idCollision: false, + }, }; var oldHashes = {}; var oldIds = {}; @@ -2632,7 +2635,13 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null const onCorruptionWarning = Util.once((id) => { console.log('id collision in document', id); - Feedback.send('OFFICE_DOCUMENT_ID_COLLISION', true); + if (content?.debug?.idCollision !== undefined // No feedback for old documents + && content?.debug?.idCollision === false) { // Send feedback only once + Feedback.send(`channel=${content.channel}&OFFICE_DOCUMENT_ID_COLLISION`, true); + content.debug = content.debug || {}; + content.debug.idCollision = true; + APP.onLocal(); + } }); APP.docEditor.connectMockServer({ From d2a4e53a3e8cd7c03b4057147f28e2376382f5c4 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Tue, 19 May 2026 14:47:22 +0200 Subject: [PATCH 5/5] Init content.debug in onDocumentReady --- www/common/onlyoffice/inner.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index ca6d3c59f..a6fcb61f4 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -103,9 +103,6 @@ define([ ids: {}, mediasSources: {}, version: privateData.ooForceVersion ? Number(privateData.ooForceVersion) : OOCurrentVersion.currentVersionNumber, - debug: { - idCollision: false, - }, }; var oldHashes = {}; var oldIds = {}; @@ -2210,6 +2207,11 @@ define([ }]; common.checkTrimHistory(channels); } + + content.debug = content.debug ?? {}; + content.debug.idCollision = content.debug.idCollision ?? false; + APP.onLocal(); + console.log("OO ready"); }; @@ -2638,7 +2640,7 @@ Uncaught TypeError: Cannot read property 'calculatedType' of null if (content?.debug?.idCollision !== undefined // No feedback for old documents && content?.debug?.idCollision === false) { // Send feedback only once Feedback.send(`channel=${content.channel}&OFFICE_DOCUMENT_ID_COLLISION`, true); - content.debug = content.debug || {}; + content.debug = content.debug ?? {}; content.debug.idCollision = true; APP.onLocal(); }