summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js')
-rw-r--r--comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js217
1 files changed, 217 insertions, 0 deletions
diff --git a/comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js b/comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js
new file mode 100644
index 0000000000..20e63d1358
--- /dev/null
+++ b/comm/mailnews/local/test/unit/test_pop3PasswordFailure_rfc5034.js
@@ -0,0 +1,217 @@
+/* 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/. */
+
+/**
+ * Tests password failure with RFC5034 auth.
+ *
+ * This test checks to see if the pop3 password failure is handled correctly
+ * in the case of the server dropping the connection during auth login.
+ * We use POP3_RFC5034_handler so auth=login will be supported.
+ * The steps are:
+ * - Have an invalid password in the password database.
+ * - Check we get a prompt asking what to do.
+ * - Check retry does what it should do.
+ * - Check cancel does what it should do.
+ * - Re-initiate connection, this time select enter new password, check that
+ * we get a new password prompt and can enter the password.
+ */
+
+/* import-globals-from ../../../test/resources/alertTestUtils.js */
+/* import-globals-from ../../../test/resources/passwordStorage.js */
+load("../../../resources/alertTestUtils.js");
+load("../../../resources/passwordStorage.js");
+
+var { PromiseTestUtils } = ChromeUtils.import(
+ "resource://testing-common/mailnews/PromiseTestUtils.jsm"
+);
+
+var server;
+var daemon;
+var incomingServer;
+var attempt = 0;
+
+var kUserName = "testpop3";
+var kInvalidPassword = "pop3test";
+var kValidPassword = "testpop3";
+
+add_setup(async function () {
+ // Enable debug for the sign on.
+ Services.prefs.setBoolPref("signon.debug", true);
+
+ // Prepare files for passwords (generated by a script in bug 1018624).
+ await setupForPassword("signons-mailnews1.8.json");
+
+ registerAlertTestUtils();
+
+ // Set up the Server
+ daemon = new Pop3Daemon();
+ function createHandler(d) {
+ var handler = new POP3_RFC5034_handler(d);
+ handler.dropOnAuthFailure = true;
+ // Login information needs to match the one stored in the signons json file.
+ handler.kUsername = kUserName;
+ handler.kPassword = kValidPassword;
+ return handler;
+ }
+ server = new nsMailServer(createHandler, daemon);
+ server.start();
+
+ // Set up the basic accounts and folders.
+ // We would use createPop3ServerAndLocalFolders() however we want to have
+ // a different username and NO password for this test (as we expect to load
+ // it from the signons json file in which the login information is stored).
+ localAccountUtils.loadLocalMailAccount();
+
+ incomingServer = MailServices.accounts.createIncomingServer(
+ kUserName,
+ "localhost",
+ "pop3"
+ );
+
+ incomingServer.port = server.port;
+
+ // Check that we haven't got any messages in the folder, if we have its a test
+ // setup issue.
+ Assert.equal(localAccountUtils.inboxFolder.getTotalMessages(false), 0);
+
+ daemon.setMessages(["message1.eml"]);
+});
+
+add_task(async function getMail1() {
+ // Now get the mail.
+ let urlListener = new PromiseTestUtils.PromiseUrlListener();
+ MailServices.pop3.GetNewMail(
+ gDummyMsgWindow,
+ urlListener,
+ localAccountUtils.inboxFolder,
+ incomingServer
+ );
+ server.performTest();
+ await Assert.rejects(
+ urlListener.promise,
+ reason => {
+ return reason === Cr.NS_ERROR_FAILURE;
+ },
+ "Check that wrong password is entered and thrown"
+ );
+ // We shouldn't have emails as the auth failed.
+ Assert.equal(localAccountUtils.inboxFolder.getTotalMessages(false), 0);
+ // Sanity check that we are at attempt 2.
+ Assert.equal(attempt, 2);
+
+ // Check that we haven't forgotten the login even though we've retried and cancelled.
+ let logins = Services.logins.findLogins(
+ "mailbox://localhost",
+ null,
+ "mailbox://localhost"
+ );
+
+ Assert.equal(logins.length, 1);
+ Assert.equal(logins[0].username, kUserName);
+ Assert.equal(logins[0].password, kInvalidPassword);
+
+ server.resetTest();
+});
+
+add_task(async function getMail2() {
+ // Now get the mail.
+ let urlListener = new PromiseTestUtils.PromiseUrlListener();
+ MailServices.pop3.GetNewMail(
+ gDummyMsgWindow,
+ urlListener,
+ localAccountUtils.inboxFolder,
+ incomingServer
+ );
+ server.performTest();
+ await urlListener.promise;
+ Assert.equal(attempt, 4);
+ // On the last attempt (4th), we should have successfully got one mail.
+ Assert.equal(localAccountUtils.inboxFolder.getTotalMessages(false), 1);
+
+ // Now check the new one has been saved.
+ let logins = Services.logins.findLogins(
+ "mailbox://localhost",
+ null,
+ "mailbox://localhost"
+ );
+
+ Assert.equal(logins.length, 1);
+ Assert.equal(logins[0].username, kUserName);
+ Assert.equal(logins[0].password, kValidPassword);
+});
+
+add_task(function endTest() {
+ // Cleanup for potential Sockets/Ports leakage.
+ server.stop();
+ server = null;
+ daemon = null;
+ incomingServer = null;
+ var thread = gThreadManager.currentThread;
+ while (thread.hasPendingEvents()) {
+ thread.processNextEvent(true);
+ }
+});
+
+/* exported alert, confirmEx, promptPasswordPS */
+function alertPS(parent, aDialogText, aText) {
+ // The first few attempts may prompt about the password problem, the last
+ // attempt shouldn't.
+ Assert.ok(attempt < 4);
+
+ // Log the fact we've got an alert, but we don't need to test anything here.
+ info("Alert Title: " + aDialogText + "\nAlert Text: " + aText);
+}
+
+function confirmExPS(
+ parent,
+ aDialogTitle,
+ aText,
+ aButtonFlags,
+ aButton0Title,
+ aButton1Title,
+ aButton2Title,
+ aCheckMsg,
+ aCheckState
+) {
+ switch (++attempt) {
+ // First attempt, retry.
+ case 1:
+ info("Attempting retry");
+ return 0;
+ // Second attempt, cancel.
+ case 2:
+ info("Cancelling login attempt");
+ return 1;
+ // Third attempt, retry.
+ case 3:
+ info("Attempting Retry");
+ return 0;
+ // Fourth attempt, enter a new password.
+ case 4:
+ info("Enter new password");
+ return 2;
+ default:
+ throw new Error("unexpected attempt number " + attempt);
+ }
+}
+
+/**
+ * Extension for alertTestUtils.
+ * Make sure that at the 4th attempt the correct password is used.
+ */
+function promptPasswordPS(
+ aParent,
+ aDialogTitle,
+ aText,
+ aPassword,
+ aCheckMsg,
+ aCheckState
+) {
+ if (attempt == 4) {
+ aPassword.value = kValidPassword;
+ aCheckState.value = true;
+ return true;
+ }
+ return false;
+}