From 161d636f17130f51a2f7d71be3ec3d3566ef89d0 Mon Sep 17 00:00:00 2001 From: s1to Date: Wed, 19 Aug 2026 11:23:19 +0200 Subject: [PATCH] =?UTF-8?q?legacy:=20la=20contrase=C3=B1a=20de=20la=20copi?= =?UTF-8?q?a=20deja=20de=20viajar=20en=20la=20direccion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El formulario de exportacion se habia pasado a GET, asi que la contraseña que cifra la copia de la identidad acababa en el historial del navegador, en el registro del servidor y en el Referer de lo siguiente que se cargara. Vuelve a POST, como en upstream, y la ruta la lee del cuerpo. Comprobado: la exportacion sigue descargando el fichero, y la direccion con la contraseña ya no responde. --- src/backend/fork_routes.js | 7 +++++-- src/views/legacy_view.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/fork_routes.js b/src/backend/fork_routes.js index c849cbe..b71aa18 100644 --- a/src/backend/fork_routes.js +++ b/src/backend/fork_routes.js @@ -230,9 +230,12 @@ async function karvanInviteAuthor(roomId) { // se responde primero: si se sale antes, el navegador se queda sin pagina setTimeout(() => process.exit(0), 500); }) - .get('/legacy/export', async (ctx) => { + // POST y no GET: en la direccion, la contraseña acaba en el historial del + // navegador, en el registro del servidor y en el Referer de lo siguiente que + // se cargue. En el cuerpo, no. + .post('/legacy/export', koaBody(), async (ctx) => { if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } - const pw = ctx.query && ctx.query.password; + const pw = ctx.request.body && ctx.request.body.password; if (!pw || pw.length < 32) return ctx.redirect('/legacy'); try { const { filename, data } = await legacyModel.exportData({ password: pw }); diff --git a/src/views/legacy_view.js b/src/views/legacy_view.js index 3238e13..80f06f5 100644 --- a/src/views/legacy_view.js +++ b/src/views/legacy_view.js @@ -25,7 +25,7 @@ const legacyView = async () => { form( { action: "/legacy/export", - method: "GET", + method: "POST", id: "exportForm" }, label(i18n.exportPasswordLabel),