From 190db75c191bbed33356ca36944aadc4c7cd0be7 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Mon, 18 Mar 2024 14:36:33 +0100 Subject: [PATCH] Remove remembered passphrase after 15 minutes of inactivity https://github.com/the-djmaze/snappymail/issues/1142#issuecomment-1635839009 --- dev/Storage/Passphrases.js | 13 ++++++++++++- dev/Stores/User/GnuPG.js | 2 +- dev/Stores/User/OpenPGP.js | 2 +- dev/View/Popup/Compose.js | 2 +- dev/View/User/MailBox/MessageView.js | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/dev/Storage/Passphrases.js b/dev/Storage/Passphrases.js index e9d2ec5e7..6196f2651 100644 --- a/dev/Storage/Passphrases.js +++ b/dev/Storage/Passphrases.js @@ -4,5 +4,16 @@ export const Passphrases = new WeakMap(); Passphrases.ask = async (key, sAskDesc, btnText) => Passphrases.has(key) - ? {password:Passphrases.get(key)/*, remember:false*/} + ? {password:Passphrases.handle(key)/*, remember:false*/} : await AskPopupView.password(sAskDesc, btnText); + +const timeouts = {}; +// get/set accessor to control deletion after 15 minutes of inactivity +Passphrases.handle = (key, pass) => { + if (!timeouts[key]) { + timeouts[key] = (()=>Passphrases.delete(key)).debounce(900000); + } + pass && Passphrases.set(key, pass); + timeouts[key](); + return Passphrases.get(key); +}; diff --git a/dev/Stores/User/GnuPG.js b/dev/Stores/User/GnuPG.js index 174686d9d..8e8c853e2 100644 --- a/dev/Stores/User/GnuPG.js +++ b/dev/Stores/User/GnuPG.js @@ -75,7 +75,7 @@ export const GnuPGUserStore = new class { 'GnuPG key
' + key.id + ' ' + key.emails[0], btnTxt ); - pass && pass.remember && Passphrases.set(key, pass.password); + pass && pass.remember && Passphrases.handle(key, pass.password); return pass?.password; }; } diff --git a/dev/Stores/User/OpenPGP.js b/dev/Stores/User/OpenPGP.js index b923c3de0..db6664286 100644 --- a/dev/Stores/User/OpenPGP.js +++ b/dev/Stores/User/OpenPGP.js @@ -34,7 +34,7 @@ const privateKey: privateKey.key, passphrase }); - result && pass.remember && Passphrases.set(privateKey, passphrase); + result && pass.remember && Passphrases.handle(privateKey, passphrase); return result; } }, diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index cb0010873..748b1cbfe 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1571,7 +1571,7 @@ export class ComposePopupView extends AbstractViewPopup { ); if (null != pass) { params.signPassphrase = pass.password; -// pass.remember && Passphrases.set(identity, pass.password); +// pass.remember && Passphrases.handle(identity, pass.password); } else { sign = false; } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index bb31475fc..60188b7c6 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -655,7 +655,7 @@ export class MailMessageView extends AbstractViewRight { message.smimeDecrypted(true); MimeToMessage(response.Result.data, message); message.html() ? message.viewHtml() : message.viewPlain(); - pass && pass.remember && Passphrases.set(identity, pass.password); + pass && pass.remember && Passphrases.handle(identity, pass.password); if ('signed' in response.Result) { message.smimeSigned(response.Result.signed); }