From ee383a11735d01c9241754786d6fd6c7582881a5 Mon Sep 17 00:00:00 2001 From: Raven Scott Date: Sat, 28 Feb 2026 19:12:05 -0500 Subject: [PATCH] Save RDP Passwords in state as base64 --- extension/dashboard.html | 2 +- extension/dashboard.js | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/extension/dashboard.html b/extension/dashboard.html index 9c05756..7ff103e 100644 --- a/extension/dashboard.html +++ b/extension/dashboard.html @@ -1862,7 +1862,7 @@
- +
diff --git a/extension/dashboard.js b/extension/dashboard.js index 89dbc87..28f19df 100644 --- a/extension/dashboard.js +++ b/extension/dashboard.js @@ -223,9 +223,11 @@ function generateRdpId() { } function saveRdpConnections(cb) { - // Strip password before persisting — passwords are session-only + // Encode password as base64 before persisting so it survives page reloads const toSave = rdpConnections.map(c => { const { password, ...rest } = c; // eslint-disable-line no-unused-vars + if (password) rest.passwordB64 = btoa(unescape(encodeURIComponent(password))); + else delete rest.passwordB64; return rest; }); chrome.runtime.sendMessage( @@ -324,7 +326,7 @@ function openAddRdpModal(conn) { $('rdpConnWidth').value = conn ? (conn.width || 1280) : 1280; $('rdpConnHeight').value = conn ? (conn.height || 720) : 720; $('rdpConnUsername').value = conn ? (conn.username || '') : ''; - $('rdpConnPassword').value = ''; + $('rdpConnPassword').value = conn ? (conn.password || '') : ''; $('rdpConnEditId').value = conn ? conn.id : ''; $('rdpConnSubmit').textContent = isEdit ? 'Save Changes' : 'Save Connection'; @@ -1581,12 +1583,16 @@ async function refresh() { }); renderSshGrid(); } - // Sync RDP connections from native host state (passwords are not persisted) + // Sync RDP connections from native host state — decode base64 password if present if (Array.isArray(state.rdpConnections)) { - // Merge: keep in-memory passwords for connections that already exist rdpConnections = state.rdpConnections.map(c => { const existing = rdpConnections.find(e => e.id === c.id); - return existing ? { ...c, password: existing.password || '' } : c; + // Prefer in-memory password (user just typed it), then decode persisted base64 + let password = (existing && existing.password) || ''; + if (!password && c.passwordB64) { + try { password = decodeURIComponent(escape(atob(c.passwordB64))); } catch (_) {} + } + return { ...c, password }; }); renderRdpGrid(); }