From 5cc9d2113a7f4e03b25d0e2cf8f6b40d9a63c5ab Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 18 Mar 2026 12:04:57 +0100 Subject: [PATCH] fix(export): fix TypeError while downloading folders from the drive --- www/common/sframe-common-outer.js | 16 ++++++++++++---- www/form/command-handler.js | 21 ++++++++++----------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 8ed673885..199752f0e 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -1971,7 +1971,7 @@ define([ // It seems we have performance issues when we open and close a lot of channels over // the same network, maybe a memory leak. To fix this, we kill and create a new // network every 30 cryptget calls (1 call = 1 channel) - const cgNetworkStatus = {}; + let cgNetworkStatus = {}; let cgNetworkId = 0; let cgNetworkIndex = 0; let cgNetwork; @@ -1985,7 +1985,7 @@ define([ // Use promises to know when all the cryptget are done // so that we can disconnect the network cgNetworkStatus[cgNetworkId] ||= []; - cgNetworkStatus.push(new Promise((res) => { + cgNetworkStatus[cgNetworkId].push(new Promise((res) => { Cryptget.get(data.hash, function (err, val) { res(network); cb({ @@ -2033,9 +2033,17 @@ define([ }); }); sframeChan.on('EV_CRYPTGET_DISCONNECT', function () { - if (!cgNetwork) { return; } - cgNetwork.disconnect(); + const prom = cgNetworkStatus[cgNetworkId] || []; + Promise.all(prom).then((nw) => { + let network = nw[0]; + if (typeof(network?.disconnect) === "function") { + network.disconnect(); + } + }); cgNetwork = undefined; + cgNetworkId = 0; + cgNetworkIndex = 0; + cgNetworkStatus = {}; }); if (cfg.addRpc) { diff --git a/www/form/command-handler.js b/www/form/command-handler.js index a5d317ec8..c2413ba77 100644 --- a/www/form/command-handler.js +++ b/www/form/command-handler.js @@ -136,7 +136,6 @@ define([ }); }); sframeChan.on('Q_FORM_FETCH_ANSWERS', function (data, _cb) { - var formHref = data.href; var cb = Utils.Util.once(_cb); var myKeys = {}; var myFormKeys; @@ -167,19 +166,19 @@ define([ if (myFormKeys.formSeed) { myFormKeys = Cryptpad.getAnonymousKeys(myFormKeys.formSeed, data.channel, Utils); } - var keys; - var privateKey, publicKey; - var formData; + + let secret, parsed; if (data.drive) { - var secret = Utils.Hash.getSecrets('form', formHref, data.password); - keys = secret && secret.keys; - formData = Utils.Hash.getFormData(secret); + parsed = Utils.Hash.parseTypeHash('form', data.href); + secret = Utils.Hash.getSecrets('form', data.href, data.password); } else { - formData = Utils.Hash.getFormData(Utils.secret); - keys = Utils.secret && Utils.secret.keys; + secret = Utils.secret; } - privateKey = formData?.form_private; - publicKey = formData?.form_public; + let keys = (secret && secret.keys) || {}; + let formData = Utils.Hash.getFormData(secret); + const privateKey = parsed.auditorKey || formData?.form_private; + const publicKey = formData?.form_public; + var curvePrivate = privateKey || data.privateKey; if (!curvePrivate) { return void cb({error: 'EFORBIDDEN'}); } var cryptoKeys = {