From 2981485551237b52c75cc702d5dc0d17949b7707 Mon Sep 17 00:00:00 2001 From: Kevin Locke Date: Wed, 4 Sep 2013 15:29:17 -0600 Subject: [PATCH] Fix for servers with LOGINDISABLED before STARTTLS When connecting to a server that advertises LOGINDISABLED in its CAPABILITIES before STARTTLS, the connection raises an error and destroys the socket before completing STARTTLS. This is demonstrated in the following debug output: debug: [connection] Connected to host debug: <= '* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS LOGINDISABLED] Dovecot ready.' debug: => 'A0 CAPABILITY' debug: <= '* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS LOGINDISABLED' debug: <= 'A0 OK Pre-login capabilities listed, post-login capabilities have more.' error: Error: Logging in is disabled on this server source=authentication debug: [connection] Closed It appears that a return after _starttls was overlooked (since _starttls will call _login again once the STARTTLS has completed). Signed-off-by: Kevin Locke --- lib/Connection.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Connection.js b/lib/Connection.js index 11ea916..f60772e 100644 --- a/lib/Connection.js +++ b/lib/Connection.js @@ -1463,8 +1463,10 @@ Connection.prototype._login = function() { if (self.serverSupports('STARTTLS') && (self._config.autotls === 'always' || (self._config.autotls === 'required' - && self.serverSupports('LOGINDISABLED')))) + && self.serverSupports('LOGINDISABLED')))) { self._starttls(); + return; + } if (self.serverSupports('LOGINDISABLED')) { err = new Error('Logging in is disabled on this server');