diff --git a/CHANGELOG.md b/CHANGELOG.md index 618a88e10231..8069e84c8882 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 1.8.3 +*BREAKING CHANGE*: undoing the "clear authorship colors" command is no longer supported (see https://github.com/ether/etherpad-lite/issues/2802) + # 1.8 * SECURITY: change referrer policy so that Etherpad addresses aren't leaked when links are clicked (discussion: https://github.com/ether/etherpad-lite/pull/3636) * SECURITY: set the "secure" flag for the session cookies when served over SSL. From now on it will not be possible to serve the same instance both in cleartext and over SSL diff --git a/src/locales/en.json b/src/locales/en.json index c8ef1a7ae4ec..5a86a6618198 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -154,7 +154,7 @@ "pad.userlist.guest": "Guest", "pad.userlist.deny": "Deny", "pad.userlist.approve": "Approve", - "pad.editbar.clearcolors": "Clear authorship colors on entire document?", + "pad.editbar.clearcolors": "Clear authorship colors on entire document? This cannot be undone", "pad.impexp.importbutton": "Import Now", "pad.impexp.importing": "Importing...", diff --git a/src/locales/qqq.json b/src/locales/qqq.json index 512ef6a3103d..de357fb738f0 100644 --- a/src/locales/qqq.json +++ b/src/locales/qqq.json @@ -113,7 +113,7 @@ "pad.userlist.guest": "Preceded by the link text which is labeled {{msg-etherpadlite|Pad.userlist.approve}}.\n{{Identical|Guest}}", "pad.userlist.deny": "Used as link text.\n\nFollowed by the link which is labeled {{msg-etherpadlite|Pad.userlist.approve}}.", "pad.userlist.approve": "Used as link text.\n\nPreceded by the link which is labeled {{msg-etherpadlite|Pad.userlist.deny}}.\n\nFollowed by the message {{msg-etherpadlite|Pad.userlist.guest}}.\n{{Identical|Approve}}", - "pad.editbar.clearcolors": "Used as confirmation message (JavaScript confirm() function).\n\nThis message means \"Are you sure you want to clear authorship colors on entire document?\".", + "pad.editbar.clearcolors": "Used as confirmation message (JavaScript confirm() function).\n\nThis message means \"Are you sure you want to clear authorship colors on entire document? This cannot be undone\".", "pad.impexp.importbutton": "Used as label for the Submit button.", "pad.impexp.importing": "Used to indicate that the file is being imported.\n{{Identical|Importing}}", "pad.impexp.confirmimport": "Used as confirmation message (JavaScript confirm() function).", diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0e16f4b69188..5be683e2d3ca 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -932,7 +932,7 @@ async function handleClientReady(client, message) await Promise.all(authors.map(authorId => { return authorManager.getAuthor(authorId).then(author => { if (!author) { - messageLogger.error("There is no author for authorId:", authorId); + messageLogger.error("There is no author for authorId: ", authorId, ". This is possibly related to https://github.com/ether/etherpad-lite/issues/2802"); } else { historicalAuthorData[authorId] = { name: author.name, colorId: author.colorId }; // Filter author attribs (e.g. don't send author's pads to all clients) } diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 2458ae65ea61..e8d182653dfe 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -791,6 +791,9 @@ exports.textLinesMutator = function (lines) { } } else { var sline = putCurLineInSplice(); + if (!curSplice[sline]) { + console.error("curSplice[sline] not populated, actual curSplice contents is ", curSplice, ". Possibly related to https://github.com/ether/etherpad-lite/issues/2802"); + } curSplice[sline] = curSplice[sline].substring(0, curCol) + text + curSplice[sline].substring(curCol); curCol += text.length; } diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 64e49ce1591e..4b119cc913c9 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -292,6 +292,7 @@ function Ace2Inner(){ { if ((typeof author) != "string") { + top.console.error("Going to throw new error, potentially caused by: https://github.com/ether/etherpad-lite/issues/2802"); throw new Error("setAuthorInfo: author (" + author + ") is not a string"); } if (!info) diff --git a/src/static/js/undomodule.js b/src/static/js/undomodule.js index 6610224fefea..7bb47a625603 100644 --- a/src/static/js/undomodule.js +++ b/src/static/js/undomodule.js @@ -253,7 +253,15 @@ var undoModule = (function() } if (!merged) { - stack.pushEvent(event); + /* + * Push the event on the undo stack only if it exists, and if it's + * not a "clearauthorship". This disallows undoing the removal of the + * authorship colors, but is a necessary stopgap measure against + * https://github.com/ether/etherpad-lite/issues/2802 + */ + if (event && (event.eventType !== "clearauthorship")) { + stack.pushEvent(event); + } } undoPtr = 0; }