Cache S/MIME passphrases when "remember" is checked

This commit is contained in:
the-djmaze 2024-02-21 23:28:53 +01:00
parent 9941ff61f7
commit 453e73f71a
5 changed files with 46 additions and 32 deletions

View file

@ -34,6 +34,7 @@ import { OpenPGPUserStore } from 'Stores/User/OpenPGP';
import { GnuPGUserStore } from 'Stores/User/GnuPG';
//import { OpenPgpImportPopupView } from 'View/Popup/OpenPgpImport';
import { SMimeUserStore } from 'Stores/User/SMime';
import { Passphrases } from 'Storage/Passphrases';
import { MessageUserStore } from 'Stores/User/Message';
import { MessagelistUserStore } from 'Stores/User/Messagelist';
@ -470,7 +471,8 @@ export class ComposePopupView extends AbstractViewPopup {
}
sendCommand() {
let sSentFolder = this.currentIdentity()?.sentFolder?.() || FolderUserStore.sentFolder();
const identity = this.currentIdentity();
let sSentFolder = identity?.sentFolder?.() || FolderUserStore.sentFolder();
this.attachmentsInProcessError(false);
this.attachmentsInErrorError(false);
@ -520,6 +522,7 @@ export class ComposePopupView extends AbstractViewPopup {
}
this.savedErrorDesc(msg);
} else {
params.signPassphrase && Passphrases.delete(identity);
this.sendError(true);
this.sendErrorDesc(getNotification(iError, data?.ErrorMessage)
|| getNotification(Notifications.CantSendMessage));
@ -1539,8 +1542,13 @@ export class ComposePopupView extends AbstractViewPopup {
params.signCertificate = identity.smimeCertificate();
params.signPrivateKey = identity.smimeKey();
if (identity.smimeKeyEncrypted()) {
const pass = await AskPopupView.password('S/MIME private key', 'CRYPTO/SIGN');
const pass = await Passphrases.ask(
params.signPrivateKey,
'S/MIME private key ' + identity.email(),
'CRYPTO/DECRYPT'
);
params.signPassphrase = pass?.password;
// pass && pass.remember && Passphrases.set(identity, pass.password);
}
}
}

View file

@ -56,7 +56,7 @@ import { GnuPGUserStore } from 'Stores/User/GnuPG';
import { OpenPGPUserStore } from 'Stores/User/OpenPGP';
import { IdentityUserStore } from 'Stores/User/Identity';
import { AskPopupView } from 'View/Popup/Ask';
import { Passphrases } from 'Storage/Passphrases';
const
oMessageScrollerDom = () => elementById('messageItem') || {},
@ -624,7 +624,7 @@ export class MailMessageView extends AbstractViewRight {
async smimeDecrypt() {
const message = currentMessage();
let data = message.smimeEncrypted(); // { partId: "1" }
let pass, data = message.smimeEncrypted(); // { partId: "1" }
const addresses = message.from.concat(message.to, message.cc, message.bcc).map(item => item.email),
identity = IdentityUserStore.find(item => addresses.includes(item.email()));
if (data && identity) {
@ -635,15 +635,18 @@ export class MailMessageView extends AbstractViewRight {
data.certificate = identity.smimeCertificate();
data.privateKey = identity.smimeKey();
if (identity.smimeKeyEncrypted()) {
const pass = await AskPopupView.password('S/MIME private key', 'CRYPTO/DECRYPT');
pass = await Passphrases.ask(identity, 'S/MIME private key ' + identity.email(), 'CRYPTO/DECRYPT');
if (!pass) {
return;
}
data.passphrase = pass?.password;
}
Remote.post('SMimeDecryptMessage', null, data).then(response => {
if (response?.Result) {
message.smimeDecrypted(true);
MimeToMessage(response.Result, message);
message.html() ? message.viewHtml() : message.viewPlain();
pass && pass.remember && Passphrases.set(identity, pass.password);
}
});
}