From 2cdadf3a6ccb4540dae0c6638bf0c7b7f8630336 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 1 Nov 2022 12:05:44 +0100 Subject: [PATCH] Improvements for PGP decryption #600 --- dev/Stores/User/Pgp.js | 81 ++++++++++++++++------------ dev/View/User/MailBox/MessageView.js | 26 ++++----- 2 files changed, 61 insertions(+), 46 deletions(-) diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js index f21a1cfe9..71ef1f5b4 100644 --- a/dev/Stores/User/Pgp.js +++ b/dev/Stores/User/Pgp.js @@ -132,51 +132,64 @@ export const } async decrypt(message) { - const sender = message.from[0].email, - armoredText = message.plain(); - + const armoredText = message.plain(), + emails = [...message.from,...message.to,...message.cc].validUnique(); if (!this.isEncrypted(armoredText)) { - return; + throw Error('Not armored text'); } // Try OpenPGP.js - let result = await OpenPGPUserStore.decrypt(armoredText, sender); - if (result) { + let email = emails.find(email => { + let result = OpenPGPUserStore.getPrivateKeyFor(email.email); + if (result) { + console.log('Trying decrypt with '+result.id+' of '+email.email); + } return result; + }); + if (email) { + let result = await OpenPGPUserStore.decrypt(armoredText, email.email); + if (result?.data) { + return result; + } + console.error('OpenPGP decrypt failed'); } // Try Mailvelope (does not support inline images) try { - let key = await this.getMailvelopePrivateKeyFor(message.to[0].email); - if (key) { - /** - * https://mailvelope.github.io/mailvelope/Mailvelope.html#createEncryptedFormContainer - * Creates an iframe to display an encrypted form - */ - // mailvelope.createEncryptedFormContainer('#mailvelope-form'); - /** - * https://mailvelope.github.io/mailvelope/Mailvelope.html#createDisplayContainer - * Creates an iframe to display the decrypted content of the encrypted mail. - */ - const body = message.body; - body.textContent = ''; - result = await mailvelope.createDisplayContainer( - '#'+body.id, - armoredText, - this.mailvelopeKeyring, - { - senderAddress: sender - } - ); - if (result) { - if (result.error?.message) { - if ('PWD_DIALOG_CANCEL' !== result.error.code) { - alert(result.error.code + ': ' + result.error.message); + let i = emails.length; + while (i--) { + if (await this.getMailvelopePrivateKeyFor(emails[i].email)) { + /** + * https://mailvelope.github.io/mailvelope/Mailvelope.html#createEncryptedFormContainer + * Creates an iframe to display an encrypted form + */ + // mailvelope.createEncryptedFormContainer('#mailvelope-form'); + /** + * https://mailvelope.github.io/mailvelope/Mailvelope.html#createDisplayContainer + * Creates an iframe to display the decrypted content of the encrypted mail. + */ + const body = message.body; + body.textContent = ''; + let result = await mailvelope.createDisplayContainer( + '#'+body.id, + armoredText, + this.mailvelopeKeyring, + { + senderAddress: message.from[0].email + // emails[i].email + } + ); + if (result) { + if (result.error?.message) { + if ('PWD_DIALOG_CANCEL' !== result.error.code) { + alert(result.error.code + ': ' + result.error.message); + } + } else { + body.classList.add('mailvelope'); + return true; } - } else { - body.classList.add('mailvelope'); - return true; } + break; } } } catch (err) { diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index b7a855ff9..13c2824a1 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -529,21 +529,23 @@ export class MailMessageView extends AbstractViewRight { pgpDecrypt() { const oMessage = currentMessage(); PgpUserStore.decrypt(oMessage).then(result => { - if (result) { + if (result?.data) { oMessage.pgpDecrypted(true); - if (result.data) { - MimeToMessage(result.data, oMessage); - oMessage.html() ? oMessage.viewHtml() : oMessage.viewPlain(); - if (result.signatures?.length) { - oMessage.pgpSigned(true); - oMessage.pgpVerified({ - signatures: result.signatures, - success: !!result.signatures.length - }); - } + MimeToMessage(result.data, oMessage); + oMessage.html() ? oMessage.viewHtml() : oMessage.viewPlain(); + if (result.signatures?.length) { + oMessage.pgpSigned(true); + oMessage.pgpVerified({ + signatures: result.signatures, + success: !!result.signatures.length + }); } + } else { + // TODO: translate + alert('Decryption failed, canceled or not possible'); } - }); + }) + .catch(e => console.error(e)); } pgpVerify(/*self, event*/) {