From 17cb093b320e1a384b1bc980e74f3a01eb212e4d Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Sun, 11 Feb 2024 19:23:09 +0100 Subject: [PATCH] Automaticaly add PGP key from Autocrypt #89 --- dev/Stores/User/Pgp.js | 18 +++++++++++++++ dev/View/Popup/Compose.js | 40 ++++++++++++++++++++++++++++----- dev/View/Popup/OpenPgpImport.js | 19 ++-------------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js index 59178b277..15ba95bf7 100644 --- a/dev/Stores/User/Pgp.js +++ b/dev/Stores/User/Pgp.js @@ -9,6 +9,8 @@ import { SettingsCapa, SettingsGet } from 'Common/Globals'; import { GnuPGUserStore } from 'Stores/User/GnuPG'; import { OpenPGPUserStore } from 'Stores/User/OpenPGP'; +import Remote from 'Remote/User/Fetch'; + // https://mailvelope.github.io/mailvelope/Keyring.html let mailvelopeKeyring = null; @@ -75,6 +77,22 @@ export const return 0 === text.trim().indexOf(BEGIN_PGP_MESSAGE); } + importKey(key, gnuPG, backup) { + if (gnuPG || backup) { + Remote.request('PgpImportKey', + (iError, oData) => { + if (gnuPG && oData?.Result/* && (oData.Result.imported || oData.Result.secretimported)*/) { + GnuPGUserStore.loadKeyrings(); + } + iError && alert(oData.ErrorMessage); + }, { + key, gnuPG, backup + } + ); + } + OpenPGPUserStore.isSupported() && OpenPGPUserStore.importKey(key); + } + async mailvelopeHasPublicKeyForEmails(recipients) { const mailvelope = mailvelopeKeyring && await mailvelopeKeyring.validKeyForAddress(recipients) diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 34a08babf..c90cbbc4d 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -28,9 +28,12 @@ import { SettingsUserStore } from 'Stores/User/Settings'; import { IdentityUserStore } from 'Stores/User/Identity'; import { AccountUserStore } from 'Stores/User/Account'; import { FolderUserStore } from 'Stores/User/Folder'; + import { PgpUserStore } from 'Stores/User/Pgp'; import { OpenPGPUserStore } from 'Stores/User/OpenPGP'; import { GnuPGUserStore } from 'Stores/User/GnuPG'; +//import { OpenPgpImportPopupView } from 'View/Popup/OpenPgpImport'; + import { MessageUserStore } from 'Stores/User/Message'; import { MessagelistUserStore } from 'Stores/User/Messagelist'; @@ -46,6 +49,7 @@ import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { FolderSystemPopupView } from 'View/Popup/FolderSystem'; import { AskPopupView } from 'View/Popup/Ask'; import { ContactsPopupView } from 'View/Popup/Contacts'; + /* import { ThemeStore } from 'Stores/Theme'; @@ -350,10 +354,11 @@ export class ComposePopupView extends AbstractViewPopup { value && PgpUserStore.getKeyForSigning(value).then(result => { console.log({ email: value, - canPgpSign:result + canPgpSign:!!result }); - this.canPgpSign(result) + this.canPgpSign(!!result) }); + this.initPgpEncrypt(); }, cc: value => { @@ -858,7 +863,10 @@ export class ComposePopupView extends AbstractViewPopup { switch (options.mode) { case ComposeType.Reply: - case ComposeType.ReplyAll: + case ComposeType.ReplyAll: { +// if (1 == oLastMessage.to.length) { +// setTimeout(() => this.from(emailArrayToStringLineHelper(oLastMessage.to)), 1); +// } if (ComposeType.Reply === options.mode) { this.to(emailArrayToStringLineHelper(oLastMessage.replyEmails(excludeEmail))); } else { @@ -872,8 +880,30 @@ export class ComposePopupView extends AbstractViewPopup { this.sInReplyTo = oLastMessage.messageId; this.sReferences = (oLastMessage.references + ' ' + oLastMessage.messageId).trim(); // OpenPGP “Transferable Public Key” -// oLastMessage.autocrypt?.keydata - break; + let autocrypt = {}, value = oLastMessage.headers().valueByName('autocrypt'); + if (value) { + value.split(';').forEach(entry => { + entry = entry.split('=', 2); + autocrypt[entry[0].trim()] = entry[1].trim(); + }); + if (autocrypt.addr && autocrypt.keydata) { + PgpUserStore.hasPublicKeyForEmails([autocrypt.addr]).then(result => + result || PgpUserStore.importKey( + '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n' + + autocrypt.keydata + + '\n-----END PGP PUBLIC KEY BLOCK-----', + true, true) +/* + result || showScreenPopup(OpenPgpImportPopupView, + ['-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n' + + autocrypt.keydata + + '\n-----END PGP PUBLIC KEY BLOCK-----'] + ) +*/ + ); + } + } + } break; case ComposeType.Forward: case ComposeType.ForwardAsAttachment: diff --git a/dev/View/Popup/OpenPgpImport.js b/dev/View/Popup/OpenPgpImport.js index a59378fc8..c62695f74 100644 --- a/dev/View/Popup/OpenPgpImport.js +++ b/dev/View/Popup/OpenPgpImport.js @@ -1,6 +1,6 @@ import { addObservablesTo } from 'External/ko'; import { GnuPGUserStore } from 'Stores/User/GnuPG'; -import { OpenPGPUserStore } from 'Stores/User/OpenPGP'; +import { PgpUserStore } from 'Stores/User/Pgp'; import { AbstractViewPopup } from 'Knoin/AbstractViews'; @@ -94,23 +94,8 @@ export class OpenPgpImportPopupView extends AbstractViewPopup { if (match[0] && match[1] && match[2] && match[1] === match[2]) { const GnuPG = this.saveGnuPG() && GnuPGUserStore.isSupported(), backup = this.saveServer(); - if (GnuPG || backup()) { - Remote.request('PgpImportKey', - (iError, oData) => { - if (GnuPG && oData?.Result/* && (oData.Result.imported || oData.Result.secretimported)*/) { - GnuPGUserStore.loadKeyrings(); - } - iError && alert(oData.ErrorMessage); - }, { - key: this.key(), - gnuPG: GnuPG, - backup: backup - } - ); - } - OpenPGPUserStore.isSupported() && OpenPGPUserStore.importKey(this.key()); + PgpUserStore.importKey(this.key(), GnuPG, backup); } - --count; done = false; } else {