From edad96e5d5ee9acc7d0c16cdabce36f078043a6c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 16 Mar 2021 15:01:59 -0400 Subject: [PATCH 1/6] auto include pubkey based on rules discussed in #3445 --- .../compose-my-pubkey-module.ts | 36 ++++++++++--- .../compose-recipients-module.ts | 8 ++- extension/chrome/elements/compose.htm | 2 +- .../api/email-provider/gmail/google-auth.ts | 4 +- extension/js/common/api/key-server/wkd.ts | 28 ++++++---- extension/js/common/core/common.ts | 5 ++ extension/js/common/org-rules.ts | 4 +- test/source/mock/backend/backend-data.ts | 3 ++ .../mock/key-manager/key-manager-endpoints.ts | 4 ++ test/source/mock/wkd/wkd-endpoints.ts | 9 +++- test/source/tests/compose.ts | 31 +++++++++++ test/source/tests/tooling/consts.ts | 52 ++++++++++++++++++- 12 files changed, 159 insertions(+), 27 deletions(-) diff --git a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts index 094a49fa718..29656a789e3 100644 --- a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts +++ b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts @@ -8,11 +8,13 @@ import { Lang } from '../../../js/common/lang.js'; import { Ui } from '../../../js/common/browser/ui.js'; import { ViewModule } from '../../../js/common/view-module.js'; import { ComposeView } from '../compose.js'; -import { ContactStore } from '../../../js/common/platform/store/contact-store.js'; +import { Str } from '../../../js/common/core/common.js'; +import { OpenPGPKey } from '../../../js/common/core/crypto/pgp/openpgp-key.js'; export class ComposeMyPubkeyModule extends ViewModule { private toggledManually = false; + private wkdLongids: { [acctEmail: string]: string[] } = {}; public setHandlers = () => { this.view.S.cached('icon_pubkey').attr('title', Lang.compose.includePubkeyIconTitle); @@ -44,18 +46,40 @@ export class ComposeMyPubkeyModule extends ViewModule { return; } (async () => { - const contacts = await ContactStore.get(undefined, this.view.recipientsModule.getRecipients().map(r => r.email)); - for (const contact of contacts) { - if (contact?.has_pgp && contact.client !== 'cryptup') { + const senderEmail = this.view.senderModule.getSender(); + const senderKi = await this.view.storageModule.getKey(senderEmail); + // if we have cashed this longid in this.wkdLongids, setAttachPreference(false) rightaway and return + const cached = this.wkdLongids[senderEmail]; + if (Array.isArray(cached) && cached.some(id => id === senderKi.longid)) { + this.setAttachPreference(false); + return; + } + const myDomain = Str.getDomainFromEmailAddress(senderEmail); + const foreignRecipients = this.view.recipientsModule.getRecipients().map(r => r.email) + .filter(Boolean) + .filter(email => myDomain !== Str.getDomainFromEmailAddress(email)); + if (foreignRecipients.length > 0) { + if (!Array.isArray(cached)) { + // slow operation -- test WKD for our own key and cache the result + const { keys } = await this.view.pubLookup.wkd.rawLookupEmail(senderEmail); + const longids = keys.map(key => OpenPGPKey.fingerprintToLongid(key.id)); + this.wkdLongids[senderEmail] = longids; + // check fingerprint + if (longids.some(id => id === senderKi.longid)) { + this.setAttachPreference(false); + return; + } + } + for (const recipient of foreignRecipients) { // new message, and my key is not uploaded where the recipient would look for it - if (! await this.view.recipientsModule.doesRecipientHaveMyPubkey(contact.email)) { + if (! await this.view.recipientsModule.doesRecipientHaveMyPubkey(recipient)) { // either don't know if they need pubkey (can_read_emails false), or they do need pubkey this.setAttachPreference(true); return; } } + this.setAttachPreference(false); } - this.setAttachPreference(false); })().catch(ApiErr.reportIfSignificant); } diff --git a/extension/chrome/elements/compose-modules/compose-recipients-module.ts b/extension/chrome/elements/compose-modules/compose-recipients-module.ts index d94fc18fbf9..d23ce43063a 100644 --- a/extension/chrome/elements/compose-modules/compose-recipients-module.ts +++ b/extension/chrome/elements/compose-modules/compose-recipients-module.ts @@ -7,7 +7,7 @@ import { Contact } from '../../../js/common/core/crypto/key.js'; import { PUBKEY_LOOKUP_RESULT_FAIL, PUBKEY_LOOKUP_RESULT_WRONG } from './compose-err-module.js'; import { ProviderContactsQuery, Recipients } from '../../../js/common/api/email-provider/email-provider-api.js'; import { RecipientElement, RecipientStatus } from './compose-types.js'; -import { Str, Value } from '../../../js/common/core/common.js'; +import { Str } from '../../../js/common/core/common.js'; import { ApiErr } from '../../../js/common/api/shared/api-error.js'; import { Bm, BrowserMsg } from '../../../js/common/browser/browser-msg.js'; import { Catch } from '../../../js/common/platform/catch.js'; @@ -38,8 +38,6 @@ export class ComposeRecipientsModule extends ViewModule { private contactSearchInProgress = false; private addedPubkeyDbLookupInterval?: number; - private recipientsMissingMyKey: string[] = []; - private onRecipientAddedCallbacks: ((rec: RecipientElement[]) => void)[] = []; private dragged: Element | undefined = undefined; @@ -300,6 +298,7 @@ export class ComposeRecipientsModule extends ViewModule { this.onRecipientAddedCallbacks.push(callback); } + // todo: shouldn't we check longid? public doesRecipientHaveMyPubkey = async (theirEmailUnchecked: string): Promise => { const theirEmail = Str.parseEmail(theirEmailUnchecked).email; if (!theirEmail) { @@ -316,7 +315,7 @@ export class ComposeRecipientsModule extends ViewModule { const qReceivedMsg = `from:${theirEmail} "BEGIN PGP MESSAGE" "END PGP MESSAGE"`; try { const response = await this.view.emailProvider.msgList(`(${qSentPubkey}) OR (${qReceivedMsg})`, true); - if (response.messages) { + if (response.messages && response.messages.length > 0) { await AcctStore.set(this.view.acctEmail, { pubkey_sent_to: (storage.pubkey_sent_to || []).concat(theirEmail) }); return true; } else { @@ -857,7 +856,6 @@ export class ComposeRecipientsModule extends ViewModule { } private removeRecipient = (element: HTMLElement) => { - this.recipientsMissingMyKey = Value.arr.withoutVal(this.recipientsMissingMyKey, $(element).parent().text()); const index = this.addedRecipients.findIndex(r => r.element.isEqualNode(element)); this.addedRecipients[index].element.remove(); const container = element.parentElement?.parentElement; // Get Container, e.g. '.input-container-cc' diff --git a/extension/chrome/elements/compose.htm b/extension/chrome/elements/compose.htm index 05b02c25543..1713a5c640f 100644 --- a/extension/chrome/elements/compose.htm +++ b/extension/chrome/elements/compose.htm @@ -153,7 +153,7 @@

New Secure Message

- diff --git a/extension/js/common/api/email-provider/gmail/google-auth.ts b/extension/js/common/api/email-provider/gmail/google-auth.ts index 3e4aea1ad79..1a404dbe36c 100644 --- a/extension/js/common/api/email-provider/gmail/google-auth.ts +++ b/extension/js/common/api/email-provider/gmail/google-auth.ts @@ -6,7 +6,7 @@ // tslint:disable:oneliner-object-literal import { GOOGLE_API_HOST, GOOGLE_OAUTH_SCREEN_HOST, FLAVOR } from '../../../core/const.js'; -import { Url, Value } from '../../../core/common.js'; +import { Str, Url, Value } from '../../../core/common.js'; import { tabsQuery, windowsCreate } from '../../../browser/chrome.js'; import { Api } from './../../shared/api.js'; import { ApiErr } from '../../shared/api-error.js'; @@ -158,7 +158,7 @@ export class GoogleAuth { * Happens on enterprise builds */ public static isFesUnreachableErr = (e: any, email: string): boolean => { - const domain = email.split('@')[1].toLowerCase(); + const domain = Str.getDomainFromEmailAddress(email); const errString = String(e); if (errString.includes(`-1 when GET-ing https://${domain}/.well-known/host-meta.json`)) { return true; // err trying to get FES url from .well-known diff --git a/extension/js/common/api/key-server/wkd.ts b/extension/js/common/api/key-server/wkd.ts index c42fec84a9b..2d3661dc3df 100644 --- a/extension/js/common/api/key-server/wkd.ts +++ b/extension/js/common/api/key-server/wkd.ts @@ -7,7 +7,8 @@ import { ApiErr } from '../shared/api-error.js'; import { opgp } from '../../core/crypto/pgp/openpgpjs-custom.js'; import { Buf } from '../../core/buf.js'; import { PubkeySearchResult } from './../pub-lookup.js'; -import { KeyUtil } from '../../core/crypto/key.js'; +import { Key, KeyUtil } from '../../core/crypto/key.js'; +import { Str } from '../../core/common.js'; // tslint:disable:no-null-keyword // tslint:disable:no-direct-ajax @@ -22,23 +23,28 @@ export class Wkd extends Api { constructor(private myOwnDomain: string) { super(); + if (myOwnDomain === 'wkd.mock.flowcryptlocal.com') { + this.port = 8001; + } } - public lookupEmail = async (email: string): Promise => { + // returns all the received keys + public rawLookupEmail = async (email: string): Promise<{ keys: Key[], errs: Error[] }> => { + // todo: should we return errs on network failures etc.? const parts = email.split('@'); if (parts.length !== 2) { - return { pubkey: null, pgpClient: null }; + return { keys: [], errs: [] }; } const [user, recipientDomain] = parts; if (!user || !recipientDomain) { - return { pubkey: null, pgpClient: null }; + return { keys: [], errs: [] }; } if (!opgp) { // pgp_block.htm does not have openpgp loaded // the particular usecase (auto-loading pubkeys to verify signatures) is not that important, // the user typically gets the key loaded from composing anyway // the proper fix would be to run encodeZBase32 through background scripts - return { pubkey: null, pgpClient: null }; + return { keys: [], errs: [] }; } const directDomain = recipientDomain.toLowerCase(); const advancedDomainPrefix = (directDomain === 'localhost') ? '' : 'openpgpkey.'; @@ -50,15 +56,19 @@ export class Wkd extends Api { const directUrl = `https://${directHost}/.well-known/openpgpkey`; let response = await this.urlLookup(advancedUrl, userPart); if (!response.buf && response.hasPolicy) { - return { pubkey: null, pgpClient: null }; // do not retry direct if advanced had a policy file + return { keys: [], errs: [] }; // do not retry direct if advanced had a policy file } if (!response.buf) { response = await this.urlLookup(directUrl, userPart); } if (!response.buf) { - return { pubkey: null, pgpClient: null }; // do not retry direct if advanced had a policy file + return { keys: [], errs: [] }; // do not retry direct if advanced had a policy file } - const { keys, errs } = await KeyUtil.readMany(response.buf); + return await KeyUtil.readMany(response.buf); + } + + public lookupEmail = async (email: string): Promise => { + const { keys, errs } = await this.rawLookupEmail(email); if (errs.length) { return { pubkey: null, pgpClient: null }; } @@ -67,7 +77,7 @@ export class Wkd extends Api { return { pubkey: null, pgpClient: null }; } // if recipient uses same domain, we assume they use flowcrypt - const pgpClient = this.myOwnDomain === recipientDomain ? 'flowcrypt' : 'pgp-other'; + const pgpClient = this.myOwnDomain === Str.getDomainFromEmailAddress(email) ? 'flowcrypt' : 'pgp-other'; try { const pubkey = KeyUtil.armor(key); return { pubkey, pgpClient }; diff --git a/extension/js/common/core/common.ts b/extension/js/common/core/common.ts index f4490da8518..f7ac137307c 100644 --- a/extension/js/common/core/common.ts +++ b/extension/js/common/core/common.ts @@ -33,6 +33,11 @@ export class Str { return { email, name, full }; } + public static getDomainFromEmailAddress = (emailAddr: string) => { + // todo: parseEmail()? + return emailAddr.toLowerCase().split('@')[1]; + } + public static rmSpecialCharsKeepUtf = (str: string, mode: 'ALLOW-SOME' | 'ALLOW-NONE'): string => { // not a whitelist because we still want utf chars str = str.replace(/[@&#`();:'",<>\{\}\[\]\\\/\n\t\r]/gi, ''); diff --git a/extension/js/common/org-rules.ts b/extension/js/common/org-rules.ts index 0fcac3a057b..03a4171b045 100644 --- a/extension/js/common/org-rules.ts +++ b/extension/js/common/org-rules.ts @@ -33,7 +33,7 @@ export class OrgRules { throw new Error(`Not a valid email`); } const storage = await AcctStore.get(email, ['rules']); - return new OrgRules(storage.rules || OrgRules.default, acctEmail.split('@')[1]); + return new OrgRules(storage.rules || OrgRules.default, Str.getDomainFromEmailAddress(acctEmail)); } public static isPublicEmailProviderDomain = (emailAddrOrDomain: string) => { @@ -173,7 +173,7 @@ export class OrgRules { * This is because they already have other means to obtain public keys for these domains, such as from their own internal keyserver */ public canLookupThisRecipientOnAttester = (emailAddr: string): boolean => { - return !(this.domainRules.disallow_attester_search_for_domains || []).includes(emailAddr.split('@')[1] || 'NONE'); + return !(this.domainRules.disallow_attester_search_for_domains || []).includes(Str.getDomainFromEmailAddress(emailAddr) || 'NONE'); } /** diff --git a/test/source/mock/backend/backend-data.ts b/test/source/mock/backend/backend-data.ts index 7aec0edac82..ad541d06e6b 100644 --- a/test/source/mock/backend/backend-data.ts +++ b/test/source/mock/backend/backend-data.ts @@ -87,6 +87,9 @@ export class BackendData { "enforce_keygen_algo": "rsa2048", "disallow_attester_search_for_domains": [] }; + if (domain === 'wkd.mock.flowcryptlocal.com') { + return { ...keyManagerAutogenRules, flags: [...keyManagerAutogenRules.flags, 'NO_ATTESTER_SUBMIT'] }; + } if (domain === 'key-manager-autogen.flowcrypt.com') { return keyManagerAutogenRules; } diff --git a/test/source/mock/key-manager/key-manager-endpoints.ts b/test/source/mock/key-manager/key-manager-endpoints.ts index aaf80c06084..d989d84dccf 100644 --- a/test/source/mock/key-manager/key-manager-endpoints.ts +++ b/test/source/mock/key-manager/key-manager-endpoints.ts @@ -7,6 +7,7 @@ import { oauth } from '../lib/oauth'; import { Dict } from '../../core/common'; import { expect } from 'chai'; import { KeyUtil } from '../../core/crypto/key'; +import { wkdAtwkdmockflowcryptlocalcomPrivate } from '../../tests/tooling/consts'; // tslint:disable:max-line-length /* eslint-disable max-len */ @@ -193,6 +194,9 @@ export const mockKeyManagerEndpoints: HandlersDefinition = { '/flowcrypt-email-key-manager/keys/private': async ({ body }, req) => { const acctEmail = oauth.checkAuthorizationHeaderWithIdToken(req.headers.authorization); if (isGet(req)) { + if (acctEmail === 'wkd@wkd.mock.flowcryptlocal.com') { + return { privateKeys: [{ decryptedPrivateKey: wkdAtwkdmockflowcryptlocalcomPrivate }] }; + } if (acctEmail === 'get.key@key-manager-autogen.flowcrypt.com') { return { privateKeys: [{ decryptedPrivateKey: existingPrv }] }; } diff --git a/test/source/mock/wkd/wkd-endpoints.ts b/test/source/mock/wkd/wkd-endpoints.ts index 7884be09b8b..af61dcb1fb0 100644 --- a/test/source/mock/wkd/wkd-endpoints.ts +++ b/test/source/mock/wkd/wkd-endpoints.ts @@ -1,6 +1,8 @@ /* ©️ 2016 - present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com */ +import { KeyUtil } from '../../core/crypto/key.js'; import { PgpArmor } from '../../core/crypto/pgp/pgp-armor.js'; +import { wkdAtwkdmockflowcryptlocalcomPrivate } from '../../tests/tooling/consts.js'; import { HandlersDefinition } from '../all-apis-mock'; const alice = `-----BEGIN PGP PUBLIC KEY BLOCK----- @@ -190,6 +192,11 @@ ctnWuBzRDeI0n6XDaPv5TpKpS7uqy/fTlJLGE9vZTFUKzeGkQFomBoXNVWs= // todo - add a not found test with: throw new HttpClientErr('Pubkey not found', 404); export const mockWkdEndpoints: HandlersDefinition = { + '/.well-known/openpgpkey/hu/st5or5guodbnsiqbzp6i34xw59h1sgmw?l=wkd': async () => { + // direct for wkd@wkd.mock.flowcryptlocal.com + const pub = await KeyUtil.asPublicKey(await KeyUtil.parse(wkdAtwkdmockflowcryptlocalcomPrivate)); + return Buffer.from((await PgpArmor.dearmor(KeyUtil.armor(pub))).data); + }, '/.well-known/openpgpkey/hu/ihyath4noz8dsckzjbuyqnh4kbup6h4i?l=john.doe': async () => { return Buffer.from((await PgpArmor.dearmor(johnDoe1)).data); // direct for john.doe@localhost }, @@ -219,6 +226,6 @@ export const mockWkdEndpoints: HandlersDefinition = { return ''; // allow advanced for localhost }, '/.well-known/openpgpkey/policy': async () => { - return ''; // allow direct for localhost + return ''; // allow direct for all }, }; diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts index 04377256aa6..958f96de826 100644 --- a/test/source/tests/compose.ts +++ b/test/source/tests/compose.ts @@ -120,6 +120,37 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te expect(recipients).to.eq(['recip1@corp.co', 'recip2@corp.co', 'сс1@corp.co', 'bсс1@corp.co', '1 more'].join('')); })); + ava.default(`compose - auto include pubkey when our key is not available on Wkd`, testWithBrowser('ci.tests.gmail', async (t, browser) => { + const composePage = await ComposePageRecipe.openStandalone(t, browser, 'compose'); + await composePage.page.setViewport({ width: 540, height: 606 }); + await ComposePageRecipe.fillMsg(composePage, { to: 'flowcrypt.compatibility@gmail.com' }, 'testing auto include pubkey'); + await composePage.waitTillGone('@spinner'); + await Util.sleep(3); // wait for the Wkd lookup to complete + expect(await composePage.hasClass('@action-include-pubkey', 'active')).to.be.false; + await composePage.waitAndType(`@input-to`, 'some.unknown@unknown.com'); + await composePage.waitAndFocus('@input-body'); + await composePage.waitTillGone('@spinner'); + await Util.sleep(3); // allow some time to search for messages + expect(await composePage.hasClass('@action-include-pubkey', 'active')).to.be.true; + })); + + ava.default(`compose - auto include pubkey is inactive when our key is available on Wkd`, testWithBrowser(undefined, async (t, browser) => { + const acct = 'wkd@wkd.mock.flowcryptlocal.com'; + const settingsPage = await BrowserRecipe.openSettingsLoginApprove(t, browser, acct); + await SetupPageRecipe.autoKeygen(settingsPage); + const composePage = await ComposePageRecipe.openStandalone(t, browser, acct); + await composePage.page.setViewport({ width: 540, height: 606 }); + await ComposePageRecipe.fillMsg(composePage, { to: 'ci.tests.gmail@flowcrypt.dev' }, 'testing auto include pubkey'); + await composePage.waitTillGone('@spinner'); + await Util.sleep(3); // wait for the Wkd lookup to complete + expect(await composePage.hasClass('@action-include-pubkey', 'active')).to.be.false; + await composePage.waitAndType('@input-to', 'some.unknown@unknown.com'); + await composePage.waitAndFocus('@input-body'); + await composePage.waitTillGone('@spinner'); + await Util.sleep(3); // allow some time to search for messages + expect(await composePage.hasClass('@action-include-pubkey', 'active')).to.be.false; + })); + ava.default(`compose - freshly loaded pubkey`, testWithBrowser('ci.tests.gmail', async (t, browser) => { const composePage = await ComposePageRecipe.openStandalone(t, browser, 'compose'); await ComposePageRecipe.fillMsg(composePage, { to: 'human@flowcrypt.com' }, 'freshly loaded pubkey'); diff --git a/test/source/tests/tooling/consts.ts b/test/source/tests/tooling/consts.ts index acdf1a7aac4..e8376ddeeb5 100644 --- a/test/source/tests/tooling/consts.ts +++ b/test/source/tests/tooling/consts.ts @@ -368,4 +368,54 @@ QxptAWCHHIlAK9Q4VRJcvqxiwImhg55jORNB/MpywzNpH9rC4ffG6roCYQvryqmpmTvmNRZjCtso jz0glYBgSVo77aVfLvdtSXWsmsO9qCN/wII7UccKFGcu/wxqA/eWqiVle1oGlvbetswL8LtGtLTv lstiX22h/LfRGVPpuuH0cdxEMmEtTn7LcV3dK5Ynt8eiQdUN8akg3sO2rNbXRA== =WgF7 ------END PGP PRIVATE KEY BLOCK-----`; \ No newline at end of file +-----END PGP PRIVATE KEY BLOCK-----`; + +export const wkdAtwkdmockflowcryptlocalcomPrivate = `-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +HXHzkdHNV+VDeaa+U1c1OA== +=jiXa +-----END PGP PRIVATE KEY BLOCK-----`; From 097808c53f3d3f6ca58317b1745db3c355adc995 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 17 Mar 2021 06:13:07 -0400 Subject: [PATCH 2/6] fingerprint comparison, put 8001 into e-mail domain --- .../compose-my-pubkey-module.ts | 19 ++-- extension/js/common/api/key-server/wkd.ts | 3 - test/source/mock/backend/backend-data.ts | 2 +- .../mock/key-manager/key-manager-endpoints.ts | 6 +- test/source/tests/compose.ts | 2 +- test/source/tests/tooling/consts.ts | 92 +++++++++---------- 6 files changed, 60 insertions(+), 64 deletions(-) diff --git a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts index 29656a789e3..9a2408de5a5 100644 --- a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts +++ b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts @@ -3,18 +3,17 @@ 'use strict'; import { ApiErr } from '../../../js/common/api/shared/api-error.js'; -import { KeyInfo } from '../../../js/common/core/crypto/key.js'; +import { KeyInfo, KeyUtil } from '../../../js/common/core/crypto/key.js'; import { Lang } from '../../../js/common/lang.js'; import { Ui } from '../../../js/common/browser/ui.js'; import { ViewModule } from '../../../js/common/view-module.js'; import { ComposeView } from '../compose.js'; import { Str } from '../../../js/common/core/common.js'; -import { OpenPGPKey } from '../../../js/common/core/crypto/pgp/openpgp-key.js'; export class ComposeMyPubkeyModule extends ViewModule { private toggledManually = false; - private wkdLongids: { [acctEmail: string]: string[] } = {}; + private wkdFingerprints: { [acctEmail: string]: string[] } = {}; public setHandlers = () => { this.view.S.cached('icon_pubkey').attr('title', Lang.compose.includePubkeyIconTitle); @@ -48,9 +47,10 @@ export class ComposeMyPubkeyModule extends ViewModule { (async () => { const senderEmail = this.view.senderModule.getSender(); const senderKi = await this.view.storageModule.getKey(senderEmail); - // if we have cashed this longid in this.wkdLongids, setAttachPreference(false) rightaway and return - const cached = this.wkdLongids[senderEmail]; - if (Array.isArray(cached) && cached.some(id => id === senderKi.longid)) { + const primaryFingerprint = (await KeyUtil.parse(senderKi.private)).id; + // if we have cashed this fingerprint, setAttachPreference(false) rightaway and return + const cached = this.wkdFingerprints[senderEmail]; + if (Array.isArray(cached) && cached.includes(primaryFingerprint)) { this.setAttachPreference(false); return; } @@ -62,10 +62,9 @@ export class ComposeMyPubkeyModule extends ViewModule { if (!Array.isArray(cached)) { // slow operation -- test WKD for our own key and cache the result const { keys } = await this.view.pubLookup.wkd.rawLookupEmail(senderEmail); - const longids = keys.map(key => OpenPGPKey.fingerprintToLongid(key.id)); - this.wkdLongids[senderEmail] = longids; - // check fingerprint - if (longids.some(id => id === senderKi.longid)) { + const fingerprints = keys.map(key => key.id); + this.wkdFingerprints[senderEmail] = fingerprints; + if (fingerprints.includes(primaryFingerprint)) { this.setAttachPreference(false); return; } diff --git a/extension/js/common/api/key-server/wkd.ts b/extension/js/common/api/key-server/wkd.ts index 2d3661dc3df..d2f3087e661 100644 --- a/extension/js/common/api/key-server/wkd.ts +++ b/extension/js/common/api/key-server/wkd.ts @@ -23,9 +23,6 @@ export class Wkd extends Api { constructor(private myOwnDomain: string) { super(); - if (myOwnDomain === 'wkd.mock.flowcryptlocal.com') { - this.port = 8001; - } } // returns all the received keys diff --git a/test/source/mock/backend/backend-data.ts b/test/source/mock/backend/backend-data.ts index ad541d06e6b..6503840d83a 100644 --- a/test/source/mock/backend/backend-data.ts +++ b/test/source/mock/backend/backend-data.ts @@ -87,7 +87,7 @@ export class BackendData { "enforce_keygen_algo": "rsa2048", "disallow_attester_search_for_domains": [] }; - if (domain === 'wkd.mock.flowcryptlocal.com') { + if (domain === 'wkd.mock.flowcryptlocal.com:8001') { return { ...keyManagerAutogenRules, flags: [...keyManagerAutogenRules.flags, 'NO_ATTESTER_SUBMIT'] }; } if (domain === 'key-manager-autogen.flowcrypt.com') { diff --git a/test/source/mock/key-manager/key-manager-endpoints.ts b/test/source/mock/key-manager/key-manager-endpoints.ts index d989d84dccf..2871636a960 100644 --- a/test/source/mock/key-manager/key-manager-endpoints.ts +++ b/test/source/mock/key-manager/key-manager-endpoints.ts @@ -7,7 +7,7 @@ import { oauth } from '../lib/oauth'; import { Dict } from '../../core/common'; import { expect } from 'chai'; import { KeyUtil } from '../../core/crypto/key'; -import { wkdAtwkdmockflowcryptlocalcomPrivate } from '../../tests/tooling/consts'; +import { wkdAtwkdmockflowcryptlocalcomPrivate as wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts'; // tslint:disable:max-line-length /* eslint-disable max-len */ @@ -194,8 +194,8 @@ export const mockKeyManagerEndpoints: HandlersDefinition = { '/flowcrypt-email-key-manager/keys/private': async ({ body }, req) => { const acctEmail = oauth.checkAuthorizationHeaderWithIdToken(req.headers.authorization); if (isGet(req)) { - if (acctEmail === 'wkd@wkd.mock.flowcryptlocal.com') { - return { privateKeys: [{ decryptedPrivateKey: wkdAtwkdmockflowcryptlocalcomPrivate }] }; + if (acctEmail === 'wkd@wkd.mock.flowcryptlocal.com:8001') { + return { privateKeys: [{ decryptedPrivateKey: wkdAtwkdmockflowcryptlocalcom8001Private }] }; } if (acctEmail === 'get.key@key-manager-autogen.flowcrypt.com') { return { privateKeys: [{ decryptedPrivateKey: existingPrv }] }; diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts index 958f96de826..534697bfea7 100644 --- a/test/source/tests/compose.ts +++ b/test/source/tests/compose.ts @@ -135,7 +135,7 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te })); ava.default(`compose - auto include pubkey is inactive when our key is available on Wkd`, testWithBrowser(undefined, async (t, browser) => { - const acct = 'wkd@wkd.mock.flowcryptlocal.com'; + const acct = 'wkd@wkd.mock.flowcryptlocal.com:8001'; const settingsPage = await BrowserRecipe.openSettingsLoginApprove(t, browser, acct); await SetupPageRecipe.autoKeygen(settingsPage); const composePage = await ComposePageRecipe.openStandalone(t, browser, acct); diff --git a/test/source/tests/tooling/consts.ts b/test/source/tests/tooling/consts.ts index e8376ddeeb5..eab319c2491 100644 --- a/test/source/tests/tooling/consts.ts +++ b/test/source/tests/tooling/consts.ts @@ -372,50 +372,50 @@ lstiX22h/LfRGVPpuuH0cdxEMmEtTn7LcV3dK5Ynt8eiQdUN8akg3sO2rNbXRA== export const wkdAtwkdmockflowcryptlocalcomPrivate = `-----BEGIN PGP PRIVATE KEY BLOCK----- -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 -HXHzkdHNV+VDeaa+U1c1OA== -=jiXa +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 +N/1eZIIXV7eCdv3vtap+7BTfV0uP +=KrOR -----END PGP PRIVATE KEY BLOCK-----`; From f615cbec989be5ef795d05bebaced338a0820202 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 17 Mar 2021 06:26:02 -0400 Subject: [PATCH 3/6] niceties --- .../elements/compose-modules/compose-my-pubkey-module.ts | 2 +- test/source/mock/key-manager/key-manager-endpoints.ts | 2 +- test/source/mock/wkd/wkd-endpoints.ts | 6 +++--- test/source/tests/tooling/consts.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts index 9a2408de5a5..b0a471cfdbd 100644 --- a/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts +++ b/extension/chrome/elements/compose-modules/compose-my-pubkey-module.ts @@ -72,7 +72,7 @@ export class ComposeMyPubkeyModule extends ViewModule { for (const recipient of foreignRecipients) { // new message, and my key is not uploaded where the recipient would look for it if (! await this.view.recipientsModule.doesRecipientHaveMyPubkey(recipient)) { - // either don't know if they need pubkey (can_read_emails false), or they do need pubkey + // they do need pubkey this.setAttachPreference(true); return; } diff --git a/test/source/mock/key-manager/key-manager-endpoints.ts b/test/source/mock/key-manager/key-manager-endpoints.ts index 2871636a960..92e471d6e82 100644 --- a/test/source/mock/key-manager/key-manager-endpoints.ts +++ b/test/source/mock/key-manager/key-manager-endpoints.ts @@ -7,7 +7,7 @@ import { oauth } from '../lib/oauth'; import { Dict } from '../../core/common'; import { expect } from 'chai'; import { KeyUtil } from '../../core/crypto/key'; -import { wkdAtwkdmockflowcryptlocalcomPrivate as wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts'; +import { wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts'; // tslint:disable:max-line-length /* eslint-disable max-len */ diff --git a/test/source/mock/wkd/wkd-endpoints.ts b/test/source/mock/wkd/wkd-endpoints.ts index af61dcb1fb0..e298f06e7c7 100644 --- a/test/source/mock/wkd/wkd-endpoints.ts +++ b/test/source/mock/wkd/wkd-endpoints.ts @@ -2,7 +2,7 @@ import { KeyUtil } from '../../core/crypto/key.js'; import { PgpArmor } from '../../core/crypto/pgp/pgp-armor.js'; -import { wkdAtwkdmockflowcryptlocalcomPrivate } from '../../tests/tooling/consts.js'; +import { wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts.js'; import { HandlersDefinition } from '../all-apis-mock'; const alice = `-----BEGIN PGP PUBLIC KEY BLOCK----- @@ -193,8 +193,8 @@ ctnWuBzRDeI0n6XDaPv5TpKpS7uqy/fTlJLGE9vZTFUKzeGkQFomBoXNVWs= export const mockWkdEndpoints: HandlersDefinition = { '/.well-known/openpgpkey/hu/st5or5guodbnsiqbzp6i34xw59h1sgmw?l=wkd': async () => { - // direct for wkd@wkd.mock.flowcryptlocal.com - const pub = await KeyUtil.asPublicKey(await KeyUtil.parse(wkdAtwkdmockflowcryptlocalcomPrivate)); + // direct for wkd@wkd.mock.flowcryptlocal.com:8001 + const pub = await KeyUtil.asPublicKey(await KeyUtil.parse(wkdAtwkdmockflowcryptlocalcom8001Private)); return Buffer.from((await PgpArmor.dearmor(KeyUtil.armor(pub))).data); }, '/.well-known/openpgpkey/hu/ihyath4noz8dsckzjbuyqnh4kbup6h4i?l=john.doe': async () => { diff --git a/test/source/tests/tooling/consts.ts b/test/source/tests/tooling/consts.ts index eab319c2491..655faa78d9e 100644 --- a/test/source/tests/tooling/consts.ts +++ b/test/source/tests/tooling/consts.ts @@ -370,7 +370,7 @@ lstiX22h/LfRGVPpuuH0cdxEMmEtTn7LcV3dK5Ynt8eiQdUN8akg3sO2rNbXRA== =WgF7 -----END PGP PRIVATE KEY BLOCK-----`; -export const wkdAtwkdmockflowcryptlocalcomPrivate = `-----BEGIN PGP PRIVATE KEY BLOCK----- +export const wkdAtwkdmockflowcryptlocalcom8001Private = `-----BEGIN PGP PRIVATE KEY BLOCK----- xcLYBGBRztMBCADE7kTkXDVZt5zoCr2rhvE6LrDNeMCN5u4gHX+MuYj1Fw5RyR5scGwxCkFnOjYe xAwgijhuqBRaXXi3rWhwTqu6T6kH1tYTqi/HojSCI226nYKmvPiaoJdwhk8DEFuJnq1ZELaxNJqu From 84496037df828e78a634abb9c52283d7d30bcffb Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 17 Mar 2021 06:34:43 -0400 Subject: [PATCH 4/6] configure wkd.mock.flowcryptlocal.com on Semaphore --- .semaphore/semaphore.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index b9b69e9c940..d9c96b7c190 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -27,6 +27,7 @@ blocks: - npm run-script pretest - sudo sh -c "echo '209.250.232.81 cron.flowcrypt.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 google.mock.flowcryptlocal.com' >> /etc/hosts" + - sudo sh -c "echo '127.0.0.1 wkd.mock.flowcryptlocal.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 fes.standardsubdomainfes.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 standardsubdomainfes.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 wellknownfes.com' >> /etc/hosts" From 9367019abbb58962288ef14da95c99ac0f65e968 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 17 Mar 2021 13:38:18 -0400 Subject: [PATCH 5/6] reuse google.mock.flowcryptlocal.com domain for wkd for easier enterprise configuration --- .semaphore/semaphore.yml | 1 - test/source/mock/backend/backend-data.ts | 2 +- .../mock/key-manager/key-manager-endpoints.ts | 6 +- test/source/mock/wkd/wkd-endpoints.ts | 6 +- test/source/tests/tooling/consts.ts | 97 ++++++++++--------- 5 files changed, 56 insertions(+), 56 deletions(-) diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index d9c96b7c190..b9b69e9c940 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -27,7 +27,6 @@ blocks: - npm run-script pretest - sudo sh -c "echo '209.250.232.81 cron.flowcrypt.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 google.mock.flowcryptlocal.com' >> /etc/hosts" - - sudo sh -c "echo '127.0.0.1 wkd.mock.flowcryptlocal.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 fes.standardsubdomainfes.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 standardsubdomainfes.com' >> /etc/hosts" - sudo sh -c "echo '127.0.0.1 wellknownfes.com' >> /etc/hosts" diff --git a/test/source/mock/backend/backend-data.ts b/test/source/mock/backend/backend-data.ts index 6503840d83a..5f354ead2e6 100644 --- a/test/source/mock/backend/backend-data.ts +++ b/test/source/mock/backend/backend-data.ts @@ -87,7 +87,7 @@ export class BackendData { "enforce_keygen_algo": "rsa2048", "disallow_attester_search_for_domains": [] }; - if (domain === 'wkd.mock.flowcryptlocal.com:8001') { + if (domain === 'google.mock.flowcryptlocal.com:8001') { return { ...keyManagerAutogenRules, flags: [...keyManagerAutogenRules.flags, 'NO_ATTESTER_SUBMIT'] }; } if (domain === 'key-manager-autogen.flowcrypt.com') { diff --git a/test/source/mock/key-manager/key-manager-endpoints.ts b/test/source/mock/key-manager/key-manager-endpoints.ts index 92e471d6e82..de95d25818b 100644 --- a/test/source/mock/key-manager/key-manager-endpoints.ts +++ b/test/source/mock/key-manager/key-manager-endpoints.ts @@ -7,7 +7,7 @@ import { oauth } from '../lib/oauth'; import { Dict } from '../../core/common'; import { expect } from 'chai'; import { KeyUtil } from '../../core/crypto/key'; -import { wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts'; +import { wkdAtgooglemockflowcryptlocalcom8001Private } from '../../tests/tooling/consts'; // tslint:disable:max-line-length /* eslint-disable max-len */ @@ -194,8 +194,8 @@ export const mockKeyManagerEndpoints: HandlersDefinition = { '/flowcrypt-email-key-manager/keys/private': async ({ body }, req) => { const acctEmail = oauth.checkAuthorizationHeaderWithIdToken(req.headers.authorization); if (isGet(req)) { - if (acctEmail === 'wkd@wkd.mock.flowcryptlocal.com:8001') { - return { privateKeys: [{ decryptedPrivateKey: wkdAtwkdmockflowcryptlocalcom8001Private }] }; + if (acctEmail === 'wkd@google.mock.flowcryptlocal.com:8001') { + return { privateKeys: [{ decryptedPrivateKey: wkdAtgooglemockflowcryptlocalcom8001Private }] }; } if (acctEmail === 'get.key@key-manager-autogen.flowcrypt.com') { return { privateKeys: [{ decryptedPrivateKey: existingPrv }] }; diff --git a/test/source/mock/wkd/wkd-endpoints.ts b/test/source/mock/wkd/wkd-endpoints.ts index e298f06e7c7..5a264d20dbc 100644 --- a/test/source/mock/wkd/wkd-endpoints.ts +++ b/test/source/mock/wkd/wkd-endpoints.ts @@ -2,7 +2,7 @@ import { KeyUtil } from '../../core/crypto/key.js'; import { PgpArmor } from '../../core/crypto/pgp/pgp-armor.js'; -import { wkdAtwkdmockflowcryptlocalcom8001Private } from '../../tests/tooling/consts.js'; +import { wkdAtgooglemockflowcryptlocalcom8001Private } from '../../tests/tooling/consts.js'; import { HandlersDefinition } from '../all-apis-mock'; const alice = `-----BEGIN PGP PUBLIC KEY BLOCK----- @@ -193,8 +193,8 @@ ctnWuBzRDeI0n6XDaPv5TpKpS7uqy/fTlJLGE9vZTFUKzeGkQFomBoXNVWs= export const mockWkdEndpoints: HandlersDefinition = { '/.well-known/openpgpkey/hu/st5or5guodbnsiqbzp6i34xw59h1sgmw?l=wkd': async () => { - // direct for wkd@wkd.mock.flowcryptlocal.com:8001 - const pub = await KeyUtil.asPublicKey(await KeyUtil.parse(wkdAtwkdmockflowcryptlocalcom8001Private)); + // direct for wkd@google.mock.flowcryptlocal.com:8001 + const pub = await KeyUtil.asPublicKey(await KeyUtil.parse(wkdAtgooglemockflowcryptlocalcom8001Private)); return Buffer.from((await PgpArmor.dearmor(KeyUtil.armor(pub))).data); }, '/.well-known/openpgpkey/hu/ihyath4noz8dsckzjbuyqnh4kbup6h4i?l=john.doe': async () => { diff --git a/test/source/tests/tooling/consts.ts b/test/source/tests/tooling/consts.ts index 655faa78d9e..d8c25aaf510 100644 --- a/test/source/tests/tooling/consts.ts +++ b/test/source/tests/tooling/consts.ts @@ -370,52 +370,53 @@ lstiX22h/LfRGVPpuuH0cdxEMmEtTn7LcV3dK5Ynt8eiQdUN8akg3sO2rNbXRA== =WgF7 -----END PGP PRIVATE KEY BLOCK-----`; -export const wkdAtwkdmockflowcryptlocalcom8001Private = `-----BEGIN PGP PRIVATE KEY BLOCK----- +export const wkdAtgooglemockflowcryptlocalcom8001Private = `-----BEGIN PGP PRIVATE KEY BLOCK----- -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 -N/1eZIIXV7eCdv3vtap+7BTfV0uP -=KrOR ------END PGP PRIVATE KEY BLOCK-----`; +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 +ZcbMsfmsjQ2xERPJauMielisgbxBIIQs +=idfp +-----END PGP PRIVATE KEY BLOCK----- +`; From fd614d1fe101e59233904f173c0547f1d6b88012 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 17 Mar 2021 14:06:11 -0400 Subject: [PATCH 6/6] fix: reuse google.mock.flowcryptlocal.com domain for wkd for easier enterprise configuration --- test/source/tests/compose.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts index 534697bfea7..a970fff8d63 100644 --- a/test/source/tests/compose.ts +++ b/test/source/tests/compose.ts @@ -135,7 +135,7 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te })); ava.default(`compose - auto include pubkey is inactive when our key is available on Wkd`, testWithBrowser(undefined, async (t, browser) => { - const acct = 'wkd@wkd.mock.flowcryptlocal.com:8001'; + const acct = 'wkd@google.mock.flowcryptlocal.com:8001'; const settingsPage = await BrowserRecipe.openSettingsLoginApprove(t, browser, acct); await SetupPageRecipe.autoKeygen(settingsPage); const composePage = await ComposePageRecipe.openStandalone(t, browser, acct);