Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ export class ComposeDraftModule extends ViewModule<ComposeView> {
Xss.sanitizeRender(this.view.S.cached('prompt'), `${promptText}<br><br><a href="#" class="action_close">close</a>`).css({ display: 'block', height: '100%' });
}
this.view.S.cached('prompt').find('a.action_open_passphrase_dialog').click(this.view.setHandler(async () => {
const primaryKi = await KeyStore.getFirst(this.view.acctEmail);
const primaryKi = await KeyStore.getFirstRequired(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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ export class ComposeRenderModule extends ViewModule<ComposeView> {
<br><br>I was not able to read your encrypted message because it was encrypted for a wrong key.
<br><br>My current public key is attached below. Please update your records and send me a new encrypted message.
<br><br>Thank you</div>`);
const primaryKi = await KeyStore.getFirst(this.view.acctEmail);
const primaryKi = await KeyStore.getFirstRequired(this.view.acctEmail);
const attachment = Attachment.keyinfoAsPubkeyAtt(primaryKi);
this.view.attsModule.attach.addFile(new File([attachment.getData()], attachment.name));
this.view.sendBtnModule.popover.toggleItemTick($('.action-toggle-encrypt-sending-option'), 'encrypt', false); // don't encrypt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ export class ComposeStorageModule extends ViewModule<ComposeView> {

public passphraseGet = async (senderKi?: KeyInfo) => {
if (!senderKi) {
senderKi = await KeyStore.getFirst(this.view.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(senderKi);
senderKi = await KeyStore.getFirstRequired(this.view.acctEmail);
}
return await PassphraseStore.get(this.view.acctEmail, senderKi.fingerprints[0]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ export class PgpBlockViewDecryptModule {
this.view.renderModule.renderText('Decrypting...');
await this.decryptAndRender(encryptedData, optionalPwd);
} else {
const primaryKi = await KeyStore.getFirst(this.view.acctEmail);
const primaryKi = await KeyStore.getFirstOptional(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) {
Expand Down
2 changes: 1 addition & 1 deletion extension/chrome/settings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ View.run(class SettingsView extends View {
}
}));
$('.action_open_public_key_page').click(this.setHandler(async () => {
const ki = await KeyStore.getFirst(this.acctEmail!);
const ki = await KeyStore.getFirstRequired(this.acctEmail!);
const escapedFp = Xss.escape(ki.fingerprints[0]);
await Settings.renderSubPage(this.acctEmail!, this.tabId, 'modules/my_key.htm', `&fingerprint=${escapedFp}`);
}));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { Settings } from '../../../js/common/settings.js';
import { UnreportableError } from '../../../js/common/platform/catch.js';
import { Ui } from '../../../js/common/browser/ui.js';
import { ApiErr } from '../../../js/common/api/shared/api-error.js';
import { Assert } from '../../../js/common/assert.js';
import { GoogleAuth } from '../../../js/common/api/email-provider/gmail/google-auth.js';
import { KeyStore } from '../../../js/common/platform/store/key-store.js';
import { KeyUtil } from '../../../js/common/core/crypto/key.js';
Expand All @@ -25,12 +24,11 @@ export class BackupAutomaticModule extends ViewModule<BackupView> {
}

private setupCreateSimpleAutomaticInboxBackup = async () => {
const primaryKi = await KeyStore.getFirst(this.view.acctEmail);
const primaryKi = await KeyStore.getFirstRequired(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');
}
Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi);
try {
await this.view.manualModule.doBackupOnEmailProvider(primaryKi.private);
await this.view.renderBackupDone();
Expand Down
4 changes: 1 addition & 3 deletions extension/chrome/settings/modules/backup-manual-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import { ViewModule } from '../../../js/common/view-module.js';
import { Xss } from '../../../js/common/platform/xss.js';
import { BackupView } from './backup.js';
import { Assert } from '../../../js/common/assert.js';
import { Attachment } from '../../../js/common/core/attachment.js';
import { SendableMsg } from '../../../js/common/api/email-provider/sendable-msg.js';
import { GMAIL_RECOVERY_EMAIL_SUBJECTS } from '../../../js/common/core/const.js';
Expand Down Expand Up @@ -56,8 +55,7 @@ export class BackupManualActionModule extends ViewModule<BackupView> {

private actionManualBackupHandler = async () => {
const selected = $('input[type=radio][name=input_backup_choice]:checked').val();
const primaryKi = await KeyStore.getFirst(this.view.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi);
const primaryKi = await KeyStore.getFirstRequired(this.view.acctEmail);
if (! await this.isPrivateKeyEncrypted(primaryKi)) {
await Ui.modal.error('Sorry, cannot back up private key because it\'s not protected with a pass phrase.');
return;
Expand Down
3 changes: 1 addition & 2 deletions extension/chrome/settings/modules/change_passphrase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,8 @@ 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.getFirst(this.acctEmail);
const primaryKi = await KeyStore.getFirstRequired(this.acctEmail);
this.primaryKi = primaryKi;
Assert.abortAndRenderErrorIfKeyinfoEmpty(this.primaryKi);
const storedOrSessionPp = await PassphraseStore.get(this.acctEmail, this.primaryKi.fingerprints[0]);
const key = await KeyUtil.parse(this.primaryKi.private);
this.primaryPrv = key;
Expand Down
6 changes: 2 additions & 4 deletions extension/chrome/settings/modules/keyserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +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.getFirst(this.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi);
const primaryKi = await KeyStore.getFirstRequired(this.acctEmail);
try {
await this.pubLookup.attester.initialLegacySubmit(String($(target).attr('email')), primaryKi.public);
} catch (e) {
Expand All @@ -97,8 +96,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.getFirst(this.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi);
const primaryKi = await KeyStore.getFirstRequired(this.acctEmail);
try {
const responseText = await this.pubLookup.attester.replacePubkey(String($(target).attr('email')), primaryKi.public);
await Ui.modal.info(responseText);
Expand Down
3 changes: 1 addition & 2 deletions extension/chrome/settings/modules/security.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ View.run(class SecurityView extends View {

public render = async () => {
await initPassphraseToggle(['passphrase_entry']);
this.primaryKi = await KeyStore.getFirst(this.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(this.primaryKi);
this.primaryKi = await KeyStore.getFirstRequired(this.acctEmail);
this.authInfo = await AcctStore.authInfo(this.acctEmail);
const storage = await AcctStore.get(this.acctEmail, ['hide_message_password', 'outgoing_language']);
this.orgRules = await OrgRules.newInstance(this.acctEmail);
Expand Down
3 changes: 1 addition & 2 deletions extension/chrome/settings/modules/test_passphrase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ View.run(class TestPassphrase extends View {
}

public render = async () => {
const keyInfo = await KeyStore.getFirst(this.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(keyInfo);
const keyInfo = await KeyStore.getFirstRequired(this.acctEmail);
await initPassphraseToggle(['password']);
this.primaryKey = await KeyUtil.parse(keyInfo.private);
if (!this.primaryKey.fullyEncrypted) {
Expand Down
3 changes: 1 addition & 2 deletions extension/chrome/settings/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,7 @@ export class SetupView extends View {
}

public submitPublicKeysAndFinalizeSetup = async ({ submit_main, submit_all }: { submit_main: boolean, submit_all: boolean }): Promise<void> => {
const primaryKi = await KeyStore.getFirst(this.acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(primaryKi);
const primaryKi = await KeyStore.getFirstRequired(this.acctEmail);
try {
await this.submitPublicKeyIfNeeded(primaryKi.public, { submit_main, submit_all });
} catch (e) {
Expand Down
2 changes: 1 addition & 1 deletion extension/js/common/api/email-provider/sendable-msg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export class SendableMsg {
}

private static create = async (acctEmail: string, { from, recipients, subject, thread, body, attachments, type, isDraft }: SendableMsgDefinition): Promise<SendableMsg> => {
const primaryKi = await KeyStore.getFirst(acctEmail);
const primaryKi = await KeyStore.getFirstRequired(acctEmail);
const headers: Dict<string> = primaryKi ? { OpenPGP: `id=${primaryKi.longid}` } : {}; // todo - use autocrypt format
return new SendableMsg(
acctEmail,
Expand Down
2 changes: 1 addition & 1 deletion extension/js/common/assert.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class Assert {

public static abortAndRenderErrOnUnprotectedKey = async (acctEmail?: string, tabId?: string) => {
if (acctEmail) {
const primaryKi = await KeyStore.getFirst(acctEmail);
const primaryKi = await KeyStore.getFirstOptional(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') {
Expand Down
12 changes: 10 additions & 2 deletions extension/js/common/platform/store/key-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { KeyInfo, KeyInfoWithOptionalPp, KeyUtil } from '../../core/crypto/key.j
import { AcctStore } from './acct-store.js';
import { PassphraseStore } from './passphrase-store.js';
import { AbstractStore } from './abstract-store.js';
import { Assert } from '../../assert.js';

/**
* Local store of account private keys
Expand All @@ -21,11 +22,18 @@ export class KeyStore extends AbstractStore {
return keys.filter(ki => fingerprints.includes(ki.fingerprints[0]));
}

public static getFirst = async (acctEmail: string): Promise<KeyInfo> => {
const keys = await KeyStore.get(acctEmail);
public static getFirstOptional = async (acctEmail: string): Promise<KeyInfo | undefined> => {
const stored = await AcctStore.get(acctEmail, ['keys']);
const keys: KeyInfo[] = stored.keys || [];
return keys[0];
}

public static getFirstRequired = async (acctEmail: string): Promise<KeyInfo> => {
const key = await KeyStore.getFirstOptional(acctEmail);
Assert.abortAndRenderErrorIfKeyinfoEmpty(key);
return key as KeyInfo;
}

public static getAllWithOptionalPassPhrase = async (acctEmail: string): Promise<KeyInfoWithOptionalPp[]> => {
const keys = await KeyStore.get(acctEmail);
const withPp: KeyInfoWithOptionalPp[] = [];
Expand Down