Skip to content

Commit 8feae38

Browse files
authored
fix(imap-socket-hang): When allocating IMAP connection, check if socket is still alive ZMS-196 (#772)
* when allocating IMAP connection, check if socket is still alive * imap notifier add optional chaining + fallback
1 parent 978ce06 commit 8feae38

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

lib/imap-notifier.js

+20-10
Original file line numberDiff line numberDiff line change
@@ -393,19 +393,29 @@ class ImapNotifier extends EventEmitter {
393393
}
394394

395395
let rlkey = 'lim:' + data.service;
396-
this.counters.limitedcounter(rlkey, data.user, 1, data.limit || 15, (err, res) => {
397-
if (err) {
398-
return callback(err);
399-
}
396+
const { closed: socketClosed, connecting, destroyed } = data.session?.socket || {};
400397

401-
if (!res.success) {
402-
return callback(null, false);
403-
}
398+
if (!socketClosed && !connecting && !destroyed) {
399+
// socket alive, not closed
400+
this.counters.limitedcounter(rlkey, data.user, 1, data.limit || 15, (err, res) => {
401+
if (err) {
402+
return callback(err);
403+
}
404404

405-
this.connectionSessions.set(data.session, { service: data.service, user: data.user });
405+
if (!res.success) {
406+
return callback(null, false);
407+
}
406408

407-
return callback(null, true);
408-
});
409+
this.connectionSessions.set(data.session, { service: data.service, user: data.user });
410+
411+
return callback(null, true);
412+
});
413+
} else {
414+
// socket dead/closed/undefined
415+
const err = new Error('[ALERT] Socket closed unexpectedly before authentication completed.');
416+
err.response = 'NO';
417+
return callback(err, false);
418+
}
409419
}
410420

411421
releaseConnection(data, callback) {

0 commit comments

Comments
 (0)