undomodule: disallow undoing "clear authorship colors"

Clearing the authorship colors of a document with at least two authors, and then
undoing that action caused a disconnect from the pad.
This change disallows undoing clearing authorship colors in order to prevent
the problem from affecting users, and adds the relative test coverage.

This is a change of behaviour, and is documented in the changelog.

Fixes #2802 (sidestepping it).
This commit is contained in:
John McLear 2020-04-07 00:39:43 +02:00 committed by muxator
parent ffc718e8c0
commit babf67175c
8 changed files with 90 additions and 4 deletions

View file

@ -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...",

View file

@ -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 <code>confirm()</code> 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 <code>confirm()</code> 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 <code>confirm()</code> function).",

View file

@ -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)
}

View file

@ -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;
}

View file

@ -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)

View file

@ -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;
}