From 89e40a0b8fe49929cebc578e6f5e45f3bf427057 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 6 Dec 2024 16:15:37 +0000 Subject: [PATCH 1/3] Rework saving of credentials to undo history --- .../@node-red/editor-client/src/js/history.js | 9 +++--- .../editor-client/src/js/ui/editor.js | 29 ------------------- .../src/js/ui/editors/panes/properties.js | 1 + 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index d4fbc5102..2b95b35d3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -495,11 +495,12 @@ RED.history = (function() { // Reset - Only want to keep the changes inverseEv.changes[i] = {}; for (const [key, value] of Object.entries(ev.changes[i])) { - inverseEv.changes[i][key] = ev.node.credentials[key]; - ev.node.credentials[key] = value; - if (ev.node._def.credentials[key]?.type === 'password') { - ev.node.credentials['has_' + key] = !!value; + // Edge case: node.credentials is cleared after a deploy, so we can't + // capture values for the inverse event when undoing past a deploy + if (ev.node.credentials) { + inverseEv.changes[i][key] = ev.node.credentials[key]; } + ev.node.credentials[key] = value; } } else { ev.node[i] = ev.changes[i]; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index bb4457f8c..fbb822418 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -808,17 +808,6 @@ RED.editor = (function() { } } - const oldCreds = {}; - if (editing_node._def.credentials) { - for (const prop in editing_node._def.credentials) { - if (Object.prototype.hasOwnProperty.call(editing_node._def.credentials, prop)) { - if (prop in editing_node.credentials) { - oldCreds[prop] = editing_node.credentials[prop]; - } - } - } - } - try { const rc = editing_node._def.oneditsave.call(editing_node); if (rc === true) { @@ -850,24 +839,6 @@ RED.editor = (function() { } } } - - if (editing_node._def.credentials) { - for (const prop in editing_node._def.credentials) { - if (Object.prototype.hasOwnProperty.call(editing_node._def.credentials, prop)) { - if (oldCreds[prop] !== editing_node.credentials[prop]) { - if (editing_node.credentials[prop] === '__PWRD__') { - // The password may not exist in oldCreds - // The value '__PWRD__' means the password exists, - // so ignore this change - continue; - } - editState.changes.credentials = editState.changes.credentials || {}; - editState.changes.credentials[prop] = oldCreds[prop]; - editState.changed = true; - } - } - } - } } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/properties.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/properties.js index 396317052..88472f97e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/properties.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/properties.js @@ -195,6 +195,7 @@ // Like the user sets a value, saves the config, // reopens the config and save the config again } else { + changes['has_' + cred] = node.credentials['has_' + cred]; changes[cred] = node.credentials[cred]; node.credentials[cred] = value; } From 7d284ce1575190f937b50b6cb4da12cf0a5749a5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 10 Dec 2024 15:42:42 +0000 Subject: [PATCH 2/3] Update packages/node_modules/@node-red/editor-client/src/js/ui/editor.js Co-authored-by: Gauthier Dandele <92022724+GogoVega@users.noreply.github.com> --- .../@node-red/editor-client/src/js/ui/editor.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index fbb822418..37dabe663 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -808,6 +808,20 @@ RED.editor = (function() { } } + const oldCreds = {}; + if (editing_node._def.credentials) { + for (const prop in editing_node._def.credentials) { + if (Object.prototype.hasOwnProperty.call(editing_node._def.credentials, prop)) { + if (editing_node._def.credentials[prop].type === 'password') { + oldCreds['has_' + prop] = editing_node.credentials['has_' + prop]; + } + if (prop in editing_node.credentials) { + oldCreds[prop] = editing_node.credentials[prop]; + } + } + } + } + try { const rc = editing_node._def.oneditsave.call(editing_node); if (rc === true) { From 11c4277466238e5e053cb9087fc975bdd69284dd Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 10 Dec 2024 15:42:59 +0000 Subject: [PATCH 3/3] Update packages/node_modules/@node-red/editor-client/src/js/ui/editor.js Co-authored-by: Gauthier Dandele <92022724+GogoVega@users.noreply.github.com> --- .../editor-client/src/js/ui/editor.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 37dabe663..ca74b3eff 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -853,6 +853,25 @@ RED.editor = (function() { } } } + + if (editing_node._def.credentials) { + for (const prop in editing_node._def.credentials) { + if (Object.prototype.hasOwnProperty.call(editing_node._def.credentials, prop)) { + if (oldCreds[prop] !== editing_node.credentials[prop]) { + if (editing_node.credentials[prop] === '__PWRD__') { + // The password may not exist in oldCreds + // The value '__PWRD__' means the password exists, + // so ignore this change + continue; + } + editState.changes.credentials = editState.changes.credentials || {}; + editState.changes.credentials['has_' + prop] = oldCreds['has_' + prop]; + editState.changes.credentials[prop] = oldCreds[prop]; + editState.changed = true; + } + } + } + } } }