diff --git a/extension/chrome/elements/compose-modules/compose-draft-module.ts b/extension/chrome/elements/compose-modules/compose-draft-module.ts index 278c4703429..1a7daa5006e 100644 --- a/extension/chrome/elements/compose-modules/compose-draft-module.ts +++ b/extension/chrome/elements/compose-modules/compose-draft-module.ts @@ -315,8 +315,9 @@ export class ComposeDraftModule extends ViewModule { } else { Xss.sanitizeRender(this.view.S.cached('prompt'), `${promptText}

close`).css({ display: 'block', height: '100%' }); } - this.view.S.cached('prompt').find('a.action_open_passphrase_dialog').click(this.view.setHandler(() => { - BrowserMsg.send.passphraseDialog(this.view.parentTabId, { type: 'draft', longids: ['primary'] }); + this.view.S.cached('prompt').find('a.action_open_passphrase_dialog').click(this.view.setHandler(async () => { + const primaryKi = await KeyStore.getFirst(this.view.acctEmail); + BrowserMsg.send.passphraseDialog(this.view.parentTabId, { type: 'draft', longids: [primaryKi.longid] }); })); this.view.S.cached('prompt').find('a.action_close').click(this.view.setHandler(() => this.view.renderModule.closeMsg())); await this.view.storageModule.whenMasterPassphraseEntered(); diff --git a/extension/chrome/elements/compose-modules/compose-render-module.ts b/extension/chrome/elements/compose-modules/compose-render-module.ts index f0ae407ee75..669a8e4ceab 100644 --- a/extension/chrome/elements/compose-modules/compose-render-module.ts +++ b/extension/chrome/elements/compose-modules/compose-render-module.ts @@ -198,7 +198,7 @@ export class ComposeRenderModule extends ViewModule {

I was not able to read your encrypted message because it was encrypted for a wrong key.

My current public key is attached below. Please update your records and send me a new encrypted message.

Thank you`); - const [primaryKi] = await KeyStore.get(this.view.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.view.acctEmail); const att = Att.keyinfoAsPubkeyAtt(primaryKi); this.view.attsModule.attach.addFile(new File([att.getData()], att.name)); this.view.sendBtnModule.popover.toggleItemTick($('.action-toggle-encrypt-sending-option'), 'encrypt', false); // don't encrypt diff --git a/extension/chrome/elements/compose-modules/compose-storage-module.ts b/extension/chrome/elements/compose-modules/compose-storage-module.ts index 1b712f78710..1fb9e05c634 100644 --- a/extension/chrome/elements/compose-modules/compose-storage-module.ts +++ b/extension/chrome/elements/compose-modules/compose-storage-module.ts @@ -39,7 +39,7 @@ export class ComposeStorageModule extends ViewModule { let result = await this.view.myPubkeyModule.chooseMyPublicKeyBySenderEmail(keys, senderEmail); if (!result) { this.view.errModule.debug(`ComposerStorage.getKey: could not find key based on senderEmail: ${senderEmail}, using primary instead`); - result = keys.find(ki => ki.primary); + result = keys[0]; Assert.abortAndRenderErrorIfKeyinfoEmpty(result); } else { this.view.errModule.debug(`ComposerStorage.getKey: found key based on senderEmail: ${senderEmail}`); @@ -100,7 +100,7 @@ export class ComposeStorageModule extends ViewModule { public passphraseGet = async (senderKi?: KeyInfo) => { if (!senderKi) { - [senderKi] = await KeyStore.get(this.view.acctEmail, ['primary']); + senderKi = await KeyStore.getFirst(this.view.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(senderKi); } return await PassphraseStore.get(this.view.acctEmail, senderKi.fingerprint); diff --git a/extension/chrome/elements/compose-modules/formatters/encrypted-mail-msg-formatter.ts b/extension/chrome/elements/compose-modules/formatters/encrypted-mail-msg-formatter.ts index fe5aa6756cc..8a59d4d6777 100644 --- a/extension/chrome/elements/compose-modules/formatters/encrypted-mail-msg-formatter.ts +++ b/extension/chrome/elements/compose-modules/formatters/encrypted-mail-msg-formatter.ts @@ -7,7 +7,7 @@ import { BaseMailFormatter } from './base-mail-formatter.js'; import { ComposerResetBtnTrigger } from '../compose-err-module.js'; import { Mime, SendableMsgBody } from '../../../../js/common/core/mime.js'; import { NewMsgData } from '../compose-types.js'; -import { Str, Value } from '../../../../js/common/core/common.js'; +import { Str, Url, Value } from '../../../../js/common/core/common.js'; import { ApiErr } from '../../../../js/common/api/shared/api-error.js'; import { Att } from '../../../../js/common/core/att.js'; import { Buf } from '../../../../js/common/core/buf.js'; @@ -143,8 +143,12 @@ export class EncryptedMsgMailFormatter extends BaseMailFormatter { return undefined; } for (const myKey of pubs.filter(ap => ap.isMine)) { - if (await myKey.pubkey.usableButExpired) { - const path = chrome.runtime.getURL(`chrome/settings/index.htm?acctEmail=${encodeURIComponent(myKey.email)}&page=%2Fchrome%2Fsettings%2Fmodules%2Fmy_key_update.htm`); + if (myKey.pubkey.usableButExpired) { + const path = Url.create(chrome.runtime.getURL('chrome/settings/index.htm'), { + acctEmail: myKey.email, + page: '/chrome/settings/modules/my_key_update.htm', + pageUrlParams: JSON.stringify({ fingerprint: myKey.pubkey.id }), + }); const errModalLines = [ 'This message could not be encrypted because your own Private Key is expired.', '', diff --git a/extension/chrome/elements/passphrase.ts b/extension/chrome/elements/passphrase.ts index 09c4a0c428f..23732dc1237 100644 --- a/extension/chrome/elements/passphrase.ts +++ b/extension/chrome/elements/passphrase.ts @@ -20,7 +20,7 @@ View.run(class PassphraseView extends View { private readonly parentTabId: string; private readonly longids: string[]; private readonly type: string; - private myPrivateKeys: KeyInfo[] | undefined; + private keysWeNeedPassPhraseFor: KeyInfo[] | undefined; constructor() { super(); @@ -35,7 +35,7 @@ View.run(class PassphraseView extends View { Ui.event.protect(); await initPassphraseToggle(['passphrase']); const allPrivateKeys = await KeyStore.get(this.acctEmail); - this.myPrivateKeys = allPrivateKeys.filter(ki => this.longids.includes(ki.longid) || (ki.primary && this.longids.includes('primary'))); + this.keysWeNeedPassPhraseFor = allPrivateKeys.filter(ki => this.longids.includes(ki.longid)); if (this.type === 'embedded') { $('h1').parent().css('display', 'none'); $('div.separator').css('display', 'none'); @@ -55,12 +55,12 @@ View.run(class PassphraseView extends View { $('#passphrase').focus(); if (allPrivateKeys.length > 1) { let html: string; - if (this.myPrivateKeys.length === 1) { - html = `For key Fingerprint: ${Xss.escape(Str.spaced(this.myPrivateKeys[0].fingerprint || ''))}`; + if (this.keysWeNeedPassPhraseFor.length === 1) { + html = `For key Fingerprint: ${Xss.escape(Str.spaced(this.keysWeNeedPassPhraseFor[0].fingerprint || ''))}`; } else { html = 'Pass phrase needed for any of the following keys:'; - for (const i of this.myPrivateKeys.keys()) { - html += `
Fingerprint ${String(i + 1)}: ${Xss.escape(Str.spaced(this.myPrivateKeys[i].fingerprint) || '')}
`; + for (const i of this.keysWeNeedPassPhraseFor.keys()) { + html += `
Fingerprint ${String(i + 1)}: ${Xss.escape(Str.spaced(this.keysWeNeedPassPhraseFor[i].fingerprint) || '')}
`; } } Xss.sanitizeRender('.which_key', html); @@ -106,7 +106,7 @@ View.run(class PassphraseView extends View { const pass = String($('#passphrase').val()); const storageType: StorageType = $('.forget').prop('checked') ? 'session' : 'local'; let atLeastOneMatched = false; - for (const keyinfo of this.myPrivateKeys!) { // if passphrase matches more keys, it will save the pass phrase for all keys + for (const keyinfo of this.keysWeNeedPassPhraseFor!) { // if passphrase matches more keys, it will save the pass phrase for all keys const prv = await KeyUtil.parse(keyinfo.private); try { if (await KeyUtil.decrypt(prv, pass) === true) { diff --git a/extension/chrome/elements/pgp_block_modules/pgp-block-decrypt-module.ts b/extension/chrome/elements/pgp_block_modules/pgp-block-decrypt-module.ts index b74b399f912..7d3cb546ff0 100644 --- a/extension/chrome/elements/pgp_block_modules/pgp-block-decrypt-module.ts +++ b/extension/chrome/elements/pgp_block_modules/pgp-block-decrypt-module.ts @@ -93,7 +93,7 @@ export class PgpBlockViewDecryptModule { this.view.renderModule.renderText('Decrypting...'); await this.decryptAndRender(encryptedData, optionalPwd); } else { - const [primaryKi] = await KeyStore.get(this.view.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.view.acctEmail); if (!result.longids.chosen && !primaryKi) { await this.view.errorModule.renderErr(Lang.pgpBlock.notProperlySetUp + this.view.errorModule.btnHtml('FlowCrypt settings', 'green settings'), undefined); } else if (result.error.type === DecryptErrTypes.keyMismatch) { diff --git a/extension/chrome/settings/index.htm b/extension/chrome/settings/index.htm index a7c3947ab92..79d0eadb14c 100644 --- a/extension/chrome/settings/index.htm +++ b/extension/chrome/settings/index.htm @@ -159,7 +159,7 @@

FlowCrypt Settings

- + Your Public Keys diff --git a/extension/chrome/settings/index.ts b/extension/chrome/settings/index.ts index 44c527e59dc..3ac06990e12 100644 --- a/extension/chrome/settings/index.ts +++ b/extension/chrome/settings/index.ts @@ -149,6 +149,11 @@ View.run(class SettingsView extends View { Catch.report(`Unknown target page in element: ${target.outerHTML}`); } })); + $('.action_open_public_key_page').click(this.setHandler(async target => { + const ki = await KeyStore.getFirst(this.acctEmail!); + const escapedFp = Xss.escape(ki.fingerprint); + await Settings.renderSubPage(this.acctEmail!, this.tabId, 'modules/my_key.htm', `&fingerprint=${escapedFp}`); + })); $('.action_show_encrypted_inbox').click(this.setHandler(target => { window.location.href = Url.create('/chrome/settings/inbox/inbox.htm', { acctEmail: this.acctEmail! }); })); @@ -425,18 +430,16 @@ View.run(class SettingsView extends View { const created = new Date(prv.created); const date = Str.monthName(created.getMonth()) + ' ' + created.getDate() + ', ' + created.getFullYear(); const escapedFp = Xss.escape(ki.fingerprint); - let escapedPrimaryOrRm = ''; - if (ki.primary) { - escapedPrimaryOrRm = '(primary)'; - } else if (canRemoveKey) { - escapedPrimaryOrRm = `(remove)`; + let removeKeyBtn = ''; + if (canRemoveKey && privateKeys.length > 1) { + removeKeyBtn = `(remove)`; } const escapedEmail = Xss.escape(prv.emails[0] || ''); const escapedLink = `${escapedEmail}`; const fpHtml = `fingerprint: ${Str.spaced(escapedFp)}`; const space = `        `; html += `
`; - html += `
${escapedLink} from ${Xss.escape(date)}${space}${fpHtml}${space}${escapedPrimaryOrRm}
`; + html += `
${escapedLink} from ${Xss.escape(date)}${space}${fpHtml}${space}${removeKeyBtn}
`; html += `
`; } Xss.sanitizeAppend('.key_list', html); diff --git a/extension/chrome/settings/modules/backup-automatic-module.ts b/extension/chrome/settings/modules/backup-automatic-module.ts index 819d3cf6bf2..06624b4d545 100644 --- a/extension/chrome/settings/modules/backup-automatic-module.ts +++ b/extension/chrome/settings/modules/backup-automatic-module.ts @@ -25,7 +25,7 @@ export class BackupAutomaticModule extends ViewModule { } private setupCreateSimpleAutomaticInboxBackup = async () => { - const [primaryKi] = await KeyStore.get(this.view.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.view.acctEmail); if (!(await KeyUtil.parse(primaryKi.private)).fullyEncrypted) { await Ui.modal.warning('Key not protected with a pass phrase, skipping'); throw new UnreportableError('Key not protected with a pass phrase, skipping'); diff --git a/extension/chrome/settings/modules/backup-manual-module.ts b/extension/chrome/settings/modules/backup-manual-module.ts index 77e2819c2c6..1d27f138b10 100644 --- a/extension/chrome/settings/modules/backup-manual-module.ts +++ b/extension/chrome/settings/modules/backup-manual-module.ts @@ -61,7 +61,7 @@ export class BackupManualActionModule extends ViewModule { private actionManualBackupHandler = async () => { const selected = $('input[type=radio][name=input_backup_choice]:checked').val(); - const [primaryKi] = await KeyStore.get(this.view.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.view.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi); if (! await this.isPrivateKeyEncrypted(primaryKi)) { await Ui.modal.error('Sorry, cannot back up private key because it\'s not protected with a pass phrase.'); diff --git a/extension/chrome/settings/modules/change_passphrase.ts b/extension/chrome/settings/modules/change_passphrase.ts index 00dec66fa1e..956f09b7b10 100644 --- a/extension/chrome/settings/modules/change_passphrase.ts +++ b/extension/chrome/settings/modules/change_passphrase.ts @@ -38,7 +38,7 @@ View.run(class ChangePassPhraseView extends View { $('#step_0_enter_current #current_pass_phrase').attr('placeholder', 'Current primary key pass phrase'); $('#step_1_enter_new #new_pass_phrase').attr('placeholder', 'Enter a new primary key pass phrase'); } - const [primaryKi] = await KeyStore.get(this.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.acctEmail); this.primaryKi = primaryKi; Assert.abortAndRenderErrorIfKeyinfoEmpty(this.primaryKi); const storedOrSessionPp = await PassphraseStore.get(this.acctEmail, this.primaryKi.fingerprint); diff --git a/extension/chrome/settings/modules/experimental.ts b/extension/chrome/settings/modules/experimental.ts index 24f6fff2673..8fc038fee9a 100644 --- a/extension/chrome/settings/modules/experimental.ts +++ b/extension/chrome/settings/modules/experimental.ts @@ -144,7 +144,6 @@ View.run(class ExperimentalView extends View { for (const keyinfo of keyinfos) { text.push(''); text.push('key_longid: ' + keyinfo.longid); - text.push('key_primary: ' + keyinfo.primary); text.push(keyinfo.private); } text.push(''); diff --git a/extension/chrome/settings/modules/keyserver.ts b/extension/chrome/settings/modules/keyserver.ts index 59d1611c7dd..d43dd5ee9d1 100644 --- a/extension/chrome/settings/modules/keyserver.ts +++ b/extension/chrome/settings/modules/keyserver.ts @@ -80,7 +80,7 @@ View.run(class KeyserverView extends View { return await Ui.modal.error('Disallowed by your organisation rules'); } Xss.sanitizeRender(target, Ui.spinner('white')); - const [primaryKi] = await KeyStore.get(this.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi); try { await this.pubLookup.attester.initialLegacySubmit(String($(target).attr('email')), primaryKi.public); @@ -97,7 +97,7 @@ View.run(class KeyserverView extends View { return await Ui.modal.error('Disallowed by your organisation rules'); } Xss.sanitizeRender(target, Ui.spinner('white')); - const [primaryKi] = await KeyStore.get(this.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi); try { const responseText = await this.pubLookup.attester.replacePubkey(String($(target).attr('email')), primaryKi.public); diff --git a/extension/chrome/settings/modules/my_key.ts b/extension/chrome/settings/modules/my_key.ts index 665e49158e6..0baa98c4229 100644 --- a/extension/chrome/settings/modules/my_key.ts +++ b/extension/chrome/settings/modules/my_key.ts @@ -36,7 +36,7 @@ View.run(class MyKeyView extends View { super(); const uncheckedUrlParams = Url.parse(['acctEmail', 'fingerprint', 'parentTabId']); this.acctEmail = Assert.urlParamRequire.string(uncheckedUrlParams, 'acctEmail'); - this.fingerprint = Assert.urlParamRequire.optionalString(uncheckedUrlParams, 'fingerprint') || 'primary'; + this.fingerprint = Assert.urlParamRequire.string(uncheckedUrlParams, 'fingerprint'); this.myKeyUserIdsUrl = Url.create('my_key_user_ids.htm', uncheckedUrlParams); this.myKeyUpdateUrl = Url.create('my_key_update.htm', uncheckedUrlParams); } @@ -45,8 +45,8 @@ View.run(class MyKeyView extends View { this.orgRules = await OrgRules.newInstance(this.acctEmail); this.pubLookup = new PubLookup(this.orgRules); [this.keyInfo] = await KeyStore.get(this.acctEmail, [this.fingerprint]); - this.pubKey = await KeyUtil.parse(this.keyInfo.public); Assert.abortAndRenderErrorIfKeyinfoEmpty(this.keyInfo); + this.pubKey = await KeyUtil.parse(this.keyInfo.public); $('.action_view_user_ids').attr('href', this.myKeyUserIdsUrl); $('.action_view_update').attr('href', this.myKeyUpdateUrl); $('.fingerprint').text(Str.spaced(this.keyInfo.fingerprint)); diff --git a/extension/chrome/settings/modules/my_key_update.ts b/extension/chrome/settings/modules/my_key_update.ts index 7c79e963adc..0c2372df825 100644 --- a/extension/chrome/settings/modules/my_key_update.ts +++ b/extension/chrome/settings/modules/my_key_update.ts @@ -31,7 +31,7 @@ View.run(class MyKeyUpdateView extends View { super(); const uncheckedUrlParams = Url.parse(['acctEmail', 'fingerprint', 'parentTabId']); this.acctEmail = Assert.urlParamRequire.string(uncheckedUrlParams, 'acctEmail'); - this.fingerprint = Assert.urlParamRequire.optionalString(uncheckedUrlParams, 'fingerprint') || 'primary'; + this.fingerprint = Assert.urlParamRequire.string(uncheckedUrlParams, 'fingerprint'); this.showKeyUrl = Url.create('my_key.htm', uncheckedUrlParams); } diff --git a/extension/chrome/settings/modules/security.ts b/extension/chrome/settings/modules/security.ts index 1f4780b5937..652db537225 100644 --- a/extension/chrome/settings/modules/security.ts +++ b/extension/chrome/settings/modules/security.ts @@ -37,7 +37,7 @@ View.run(class SecurityView extends View { public render = async () => { await initPassphraseToggle(['passphrase_entry']); - [this.primaryKi] = await KeyStore.get(this.acctEmail, ['primary']); + this.primaryKi = await KeyStore.getFirst(this.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(this.primaryKi); this.authInfo = await AcctStore.authInfo(this.acctEmail); const storage = await AcctStore.get(this.acctEmail, ['hide_message_password', 'outgoing_language']); diff --git a/extension/chrome/settings/modules/test_passphrase.ts b/extension/chrome/settings/modules/test_passphrase.ts index 79917ccf6ce..bac41c331d1 100644 --- a/extension/chrome/settings/modules/test_passphrase.ts +++ b/extension/chrome/settings/modules/test_passphrase.ts @@ -27,7 +27,7 @@ View.run(class TestPassphrase extends View { } public render = async () => { - const [keyInfo] = await KeyStore.get(this.acctEmail, ['primary']); + const keyInfo = await KeyStore.getFirst(this.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(keyInfo); await initPassphraseToggle(['password']); this.primaryKey = await KeyUtil.parse(keyInfo.private); diff --git a/extension/chrome/settings/setup.ts b/extension/chrome/settings/setup.ts index 41df736b0ca..2f6917850dd 100644 --- a/extension/chrome/settings/setup.ts +++ b/extension/chrome/settings/setup.ts @@ -183,7 +183,7 @@ export class SetupView extends View { } public submitPublicKeysAndFinalizeSetup = async ({ submit_main, submit_all }: { submit_main: boolean, submit_all: boolean }): Promise => { - const [primaryKi] = await KeyStore.get(this.acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(this.acctEmail); Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi); try { await this.submitPublicKeyIfNeeded(primaryKi.public, { submit_main, submit_all }); diff --git a/extension/js/common/api/email-provider/sendable-msg.ts b/extension/js/common/api/email-provider/sendable-msg.ts index 7f89e8a3652..5512324bfb1 100644 --- a/extension/js/common/api/email-provider/sendable-msg.ts +++ b/extension/js/common/api/email-provider/sendable-msg.ts @@ -28,7 +28,7 @@ export class SendableMsg { public sign?: (signable: string) => Promise; public static create = async (acctEmail: string, { from, recipients, subject, body, atts, thread, type, isDraft }: SendableMsgDefinition): Promise => { - const [primaryKi] = await KeyStore.get(acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(acctEmail); const headers: Dict = primaryKi ? { OpenPGP: `id=${primaryKi.longid}` } : {}; // todo - use autocrypt format return new SendableMsg( acctEmail, diff --git a/extension/js/common/assert.ts b/extension/js/common/assert.ts index a891e772bea..ad2b5679793 100644 --- a/extension/js/common/assert.ts +++ b/extension/js/common/assert.ts @@ -35,7 +35,7 @@ export class Assert { public static abortAndRenderErrOnUnprotectedKey = async (acctEmail?: string, tabId?: string) => { if (acctEmail) { - const [primaryKi] = await KeyStore.get(acctEmail, ['primary']); + const primaryKi = await KeyStore.getFirst(acctEmail); const { setup_done } = await AcctStore.get(acctEmail, ['setup_done']); if (setup_done && primaryKi && !(await KeyUtil.parse(primaryKi.private)).fullyEncrypted) { if (window.location.pathname === '/chrome/settings/index.htm') { diff --git a/extension/js/common/core/crypto/key.ts b/extension/js/common/core/crypto/key.ts index 14e6a1fa28a..31cf753560f 100644 --- a/extension/js/common/core/crypto/key.ts +++ b/extension/js/common/core/crypto/key.ts @@ -76,7 +76,6 @@ export interface KeyInfo extends PrvKeyInfo { // this cannot be Pubkey has it's being passed to localstorage public: string; fingerprint: string; - primary: boolean; } export type PrvPacket = (OpenPGP.packet.SecretKey | OpenPGP.packet.SecretSubkey); diff --git a/extension/js/common/platform/store/key-store.ts b/extension/js/common/platform/store/key-store.ts index c7ef08de98c..a64ac2e0d16 100644 --- a/extension/js/common/platform/store/key-store.ts +++ b/extension/js/common/platform/store/key-store.ts @@ -17,15 +17,13 @@ export class KeyStore extends AbstractStore { if (!fingerprints) { return keys; } - return keys.filter(ki => { - if (fingerprints.includes('primary') && ki.primary) { - return true; - } - if (fingerprints.includes(ki.fingerprint)) { - return true; - } - return false; - }); + return keys.filter(ki => fingerprints.includes(ki.fingerprint)); + } + + public static getFirst = async (acctEmail: string): Promise => { + const stored = await AcctStore.get(acctEmail, ['keys']); + const keys: KeyInfo[] = stored.keys || []; + return keys[0]; } public static getAllWithPp = async (acctEmail: string): Promise => { @@ -45,12 +43,12 @@ export class KeyStore extends AbstractStore { } for (const i in keyinfos) { if (prv.id === keyinfos[i].fingerprint) { // replacing a key - keyinfos[i] = await KeyStore.keyInfoObj(prv, keyinfos[i].primary); + keyinfos[i] = await KeyStore.keyInfoObj(prv); updated = true; } } if (!updated) { - keyinfos.push(await KeyStore.keyInfoObj(prv, keyinfos.length === 0)); + keyinfos.push(await KeyStore.keyInfoObj(prv)); } await AcctStore.set(acctEmail, { keys: keyinfos }); } @@ -75,10 +73,10 @@ export class KeyStore extends AbstractStore { return result; } - public static keyInfoObj = async (prv: Key, primary = false): Promise => { + public static keyInfoObj = async (prv: Key): Promise => { const pubArmor = KeyUtil.armor(await KeyUtil.asPublicKey(prv)); const longid = OpenPGPKey.fingerprintToLongid(prv.id); - return { private: KeyUtil.armor(prv), public: pubArmor, primary, longid, fingerprint: prv.id }; + return { private: KeyUtil.armor(prv), public: pubArmor, longid, fingerprint: prv.id }; } } diff --git a/test/source/platform/store/key-store.ts b/test/source/platform/store/key-store.ts deleted file mode 100644 index 0af1dc5fce4..00000000000 --- a/test/source/platform/store/key-store.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* ©️ 2016 - present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com */ - -export interface PrvKeyInfo { - private: string; - longid: string; - decrypted?: OpenPGP.key.Key; -} - -export interface KeyInfo extends PrvKeyInfo { - public: string; - fingerprint: string; - primary: boolean; -} - -export type KeyInfosWithPassphrases = { keys: PrvKeyInfo[]; passphrases: string[]; };