diff options
Diffstat (limited to 'comm/mail/test/browser/openpgp/composition/browser_editDraftTemplate.js')
-rw-r--r-- | comm/mail/test/browser/openpgp/composition/browser_editDraftTemplate.js | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/comm/mail/test/browser/openpgp/composition/browser_editDraftTemplate.js b/comm/mail/test/browser/openpgp/composition/browser_editDraftTemplate.js new file mode 100644 index 0000000000..e1e49927a6 --- /dev/null +++ b/comm/mail/test/browser/openpgp/composition/browser_editDraftTemplate.js @@ -0,0 +1,221 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +/** + * Tests that drafts and templates get the appropriate security properties + * when opened. + */ + +var { open_compose_new_mail, setup_msg_contents } = ChromeUtils.import( + "resource://testing-common/mozmill/ComposeHelpers.jsm" +); + +var { + be_in_folder, + get_about_3pane, + get_special_folder, + mc, + right_click_on_row, + select_click_row, +} = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); +var { OpenPGPTestUtils } = ChromeUtils.import( + "resource://testing-common/mozmill/OpenPGPTestUtils.jsm" +); + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +let aliceAcct; +let aliceIdentity; +let draftsFolder; +let templatesFolder; + +/** + * Helper function to wait for a compose window to get opened. + * + * @returns The opened window. + */ +async function waitForComposeWindow() { + return BrowserTestUtils.domWindowOpened(null, async win => { + await BrowserTestUtils.waitForEvent(win, "load"); + return ( + win.document.documentURI === + "chrome://messenger/content/messengercompose/messengercompose.xhtml" + ); + }); +} + +function clearFolder(folder) { + return new Promise(resolve => { + let msgs = [...folder.msgDatabase.enumerateMessages()]; + + folder.deleteMessages( + msgs, + null, + true, + false, + { OnStopCopy: resolve }, + false + ); + }); +} + +add_setup(async function () { + aliceAcct = MailServices.accounts.createAccount(); + aliceAcct.incomingServer = MailServices.accounts.createIncomingServer( + "alice", + "openpgp.example", + "pop3" + ); + aliceIdentity = MailServices.accounts.createIdentity(); + aliceIdentity.email = "alice@openpgp.example"; + aliceAcct.addIdentity(aliceIdentity); + + let [id] = await OpenPGPTestUtils.importPrivateKey( + window, + new FileUtils.File( + getTestFilePath( + "../data/keys/alice@openpgp.example-0xf231550c4f47e38e-secret.asc" + ) + ) + ); + + Assert.ok(id, "private key imported"); + + aliceIdentity.setUnicharAttribute("openpgp_key_id", id.split("0x").join("")); + + draftsFolder = await get_special_folder( + Ci.nsMsgFolderFlags.Drafts, + true, + aliceAcct.incomingServer.localFoldersServer + ); + + templatesFolder = await get_special_folder( + Ci.nsMsgFolderFlags.Templates, + true, + aliceAcct.incomingServer.localFoldersServer + ); +}); + +/** + * Create draft, make sure the sec properties are as they should after + * opening. + */ +add_task(async function testDraftSec() { + await be_in_folder(draftsFolder); + await doTestSecState(true, false); // draft, not secure + await doTestSecState(true, true); // draft, secure +}); + +/** + * Create template, make sure the sec properties are as they should after + * opening. + */ +add_task(async function testTemplSec() { + await be_in_folder(templatesFolder); + await doTestSecState(false, false); // template, not secure + await doTestSecState(false, true); // template, secure +}); + +/** + * Drafts/templates are stored encrypted before sent. Test that when composing + * and the reopening, the correct encryption states get set. + */ +async function doTestSecState(isDraft, secure) { + // Make sure to compose from alice. + let inbox = aliceAcct.incomingServer.rootFolder.getFolderWithFlags( + Ci.nsMsgFolderFlags.Inbox + ); + await be_in_folder(inbox); + + let cwc = open_compose_new_mail(); + let type = isDraft ? "draft" : "template"; + let theFolder = isDraft ? draftsFolder : templatesFolder; + let subject = `test ${type}; 🤐; secure=${secure}`; + setup_msg_contents( + cwc, + "test@example.invalid", + subject, + `This is a ${type}; secure=${secure}` + ); + info(`Testing ${type}; secure=${secure}`); + + if (secure) { + // Tick "Require encryption". + // Encryption and signing should get turned on. + await OpenPGPTestUtils.toggleMessageEncryption(cwc.window); + } + + if (isDraft) { + cwc.window.SaveAsDraft(); + } else { + cwc.window.SaveAsTemplate(); + } + + await TestUtils.waitForCondition( + () => !cwc.window.gSaveOperationInProgress && !cwc.window.gWindowLock, + "timeout waiting for saving to finish." + ); + + info(`Saved as ${type} with secure=${secure}`); + cwc.window.close(); + + await be_in_folder(theFolder); + select_click_row(0); + + info(`Will open the ${type}`); + let draftWindowPromise = waitForComposeWindow(); + select_click_row(0); + await right_click_on_row(0); + + let about3Pane = get_about_3pane(); + let mailContext = about3Pane.document.getElementById("mailContext"); + if (isDraft) { + mailContext.activateItem( + about3Pane.document.getElementById("mailContext-editDraftMsg") + ); + } else { + mailContext.activateItem( + about3Pane.document.getElementById("mailContext-newMsgFromTemplate") + ); + } + + let draftWindow = await draftWindowPromise; + + Assert.equal( + draftWindow.document.getElementById("msgSubject").value, + subject, + "subject should be decrypted" + ); + + info(`Checking security props in the UI...`); + + if (!secure) { + // Wait some to make sure it won't (soon) be showing. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + await new Promise(resolve => setTimeout(resolve, 100)); + Assert.ok( + !draftWindow.document.getElementById("button-encryption").checked, + "should not use encryption" + ); + } else { + await TestUtils.waitForCondition( + () => draftWindow.document.getElementById("button-encryption").checked, + "waited for encryption to get turned on" + ); + } + + draftWindow.close(); + clearFolder(theFolder); +} + +registerCleanupFunction(async function () { + MailServices.accounts.removeAccount(aliceAcct, true); + await OpenPGPTestUtils.removeKeyById("0xf231550c4f47e38e", true); +}); |