Revision control

Copy as Markdown

Other Tools

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/**
* Server which advertises CRAM-MD5, but fails when it's tried.
* This reportedly happens for some misconfigured servers.
*/
var server;
var daemon;
var incomingServer;
test = "Server which advertises CRAM-MD5, but fails when it's tried";
var expectedTransaction = [
"AUTH",
"CAPA",
"AUTH CRAM-MD5",
"AUTH PLAIN",
"STAT",
];
const kStateAuthNeeded = 1; // the same value as in Pop3d.sys.mjs
var urlListener = {
OnStartRunningUrl() {},
OnStopRunningUrl(url, result) {
try {
Assert.equal(result, 0);
var transaction = server.playTransaction();
do_check_transaction(transaction, expectedTransaction);
do_timeout(0, checkBusy);
} catch (e) {
server.stop();
var thread = Services.tm.currentThread;
while (thread.hasPendingEvents()) {
thread.processNextEvent(true);
}
do_throw(e);
}
},
};
function checkBusy() {
// If the server hasn't quite finished, just delay a little longer.
if (incomingServer.serverBusy) {
do_timeout(20, checkBusy);
return;
}
endTest();
}
function endTest() {
incomingServer.closeCachedConnections();
// No more tests, let everything finish
server.stop();
var thread = Services.tm.currentThread;
while (thread.hasPendingEvents()) {
thread.processNextEvent(true);
}
do_test_finished();
}
function CRAMFail_handler(daemon_) {
POP3_RFC5034_handler.call(this, daemon_);
this._kAuthSchemeStartFunction["CRAM-MD5"] = this.killConn;
}
CRAMFail_handler.prototype = {
__proto__: POP3_RFC5034_handler.prototype, // inherit
killConn() {
this._multiline = false;
this._state = kStateAuthNeeded;
return "-ERR I just pretended to implement CRAM-MD5";
},
};
function run_test() {
try {
do_test_pending();
// Disable new mail notifications
Services.prefs.setBoolPref("mail.biff.play_sound", false);
Services.prefs.setBoolPref("mail.biff.show_alert", false);
Services.prefs.setBoolPref("mail.biff.show_tray_icon", false);
Services.prefs.setBoolPref("mail.biff.animate_dock_icon", false);
daemon = new Pop3Daemon();
function createHandler(d) {
return new CRAMFail_handler(d);
}
server = new nsMailServer(createHandler, daemon);
server.start();
incomingServer = createPop3ServerAndLocalFolders(server.port);
const msgServer = incomingServer;
msgServer.QueryInterface(Ci.nsIMsgIncomingServer);
// Need to allow any auth here, although that's not use in TB really,
// because we need to fall back to something after CRAM-MD5 and
// check that login works after we fell back.
msgServer.authMethod = Ci.nsMsgAuthMethod.anything;
MailServices.pop3.GetNewMail(
null,
urlListener,
localAccountUtils.inboxFolder,
incomingServer
);
server.performTest();
} catch (e) {
server.stop();
do_throw(e);
} finally {
var thread = Services.tm.currentThread;
while (thread.hasPendingEvents()) {
thread.processNextEvent(true);
}
}
}