fixes
This commit is contained in:
@@ -91,7 +91,7 @@ class WTVIRC {
|
|||||||
this.awaylen = this.irc_config.away_len || 200;
|
this.awaylen = this.irc_config.away_len || 200;
|
||||||
this.enable_tls = this.irc_config.enable_ssl || false;
|
this.enable_tls = this.irc_config.enable_ssl || false;
|
||||||
this.maxtargets = this.irc_config.max_targets || 4;
|
this.maxtargets = this.irc_config.max_targets || 4;
|
||||||
this.socket_timeout = 90000; // Default socket timeout to 120 seconds
|
this.socket_timeout = 75; // Default socket timeout to 75 seconds, most clients will send PINGs every 60 seconds, so this should be enough to catch lost connections
|
||||||
this.server_hello = this.irc_config.server_hello || `zefIRCd v${this.version} IRC server powered by minisrv`;
|
this.server_hello = this.irc_config.server_hello || `zefIRCd v${this.version} IRC server powered by minisrv`;
|
||||||
this.enable_eval = this.debug || false; // Enable eval in debug mode only
|
this.enable_eval = this.debug || false; // Enable eval in debug mode only
|
||||||
this.serverId = this.irc_config.server_id || '00A'; // Default server ID, can be overridden in config
|
this.serverId = this.irc_config.server_id || '00A'; // Default server ID, can be overridden in config
|
||||||
@@ -302,18 +302,23 @@ class WTVIRC {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
if ((now - socket.lastseen) > this.socket_timeout + 10000) {
|
if ((now - socket.lastseen) > (this.socket_timeout * 1000) + 10000) {
|
||||||
// Over 10 seconds has passed since we sent our PING, assume lost
|
// Over 10 seconds has passed since we sent our PING, assume lost
|
||||||
this.debugLog('warn', `Socket ${socket.remoteAddress} has been idle for too long, terminating session`);
|
this.debugLog('warn', `Socket ${socket.remoteAddress} has been idle for too long, terminating session`);
|
||||||
if (socket.nickname) {
|
if (socket.nickname) {
|
||||||
this.broadcastUser(socket.nickname, `:${socket.nickname}!${socket.username}@${socket.host} QUIT :Ping timeout (${Math.floor((now - socket.lastseen) / 1000)} seconds)\r\n`, socket);
|
this.broadcastUser(socket.nickname, `:${socket.nickname}!${socket.username}@${socket.host} QUIT :Ping timeout (${Math.floor((now - socket.lastseen) / 1000)} seconds)\r\n`, socket);
|
||||||
|
this.broadcastToAllServers(`:${socket.uniqueId} QUIT :Ping timeout (${Math.floor((now - socket.lastseen) / 1000)} seconds)\r\n`, serverSocket);
|
||||||
}
|
}
|
||||||
|
socket.signedoff = true;
|
||||||
this.terminateSession(socket, true);
|
this.terminateSession(socket, true);
|
||||||
return;
|
return;
|
||||||
} else if ((now - socket.lastseen) > this.socket_timeout) {
|
} else if ((now - socket.lastseen) > (this.socket_timeout * 1000)) {
|
||||||
// Client has been idle for too long, send PING
|
// Client has been idle for too long, send PING
|
||||||
this.safeWriteToSocket(socket, `PING :${this.servername}\r\n`);
|
if (socket.isserver) {
|
||||||
this.debugLog('info', `Sent PING to ${socket.remoteAddress} due to inactivity`);
|
this.safeWriteToSocket(socket, `:${this.serverId} PING ${this.serverId} ${this.servername}\r\n`);
|
||||||
|
} else {
|
||||||
|
this.safeWriteToSocket(socket, `PING :${this.servername}\r\n`);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}, 10000); // check every 5 seconds
|
}, 10000); // check every 5 seconds
|
||||||
@@ -411,7 +416,7 @@ class WTVIRC {
|
|||||||
socket.uniqueId = serverId;
|
socket.uniqueId = serverId;
|
||||||
socket.serverIdent = line;
|
socket.serverIdent = line;
|
||||||
this.servers.set(socket, serverName)
|
this.servers.set(socket, serverName)
|
||||||
this.safeWriteToSocket(socket, `SERVER ${this.servername} 1 ${this.serverId} + :${this.server_hello}\r\n`);
|
this.safeWriteToSocket(socket, `SERVER ${serverName} 1 ${serverId} + :${this.server_hello}\r\n`);
|
||||||
for (const [sock, nickname] of this.nicknames.entries()) {
|
for (const [sock, nickname] of this.nicknames.entries()) {
|
||||||
if (!sock || !nickname) continue;
|
if (!sock || !nickname) continue;
|
||||||
const uniqueId = sock.uniqueId;
|
const uniqueId = sock.uniqueId;
|
||||||
@@ -451,7 +456,7 @@ class WTVIRC {
|
|||||||
this.debugLog('warn', 'Invalid SVINFO command from server');
|
this.debugLog('warn', 'Invalid SVINFO command from server');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const serverInfoMessage = `:${this.serverId} SVINFO 6 6 0 :${this.getDate()}\r\n`;
|
const serverInfoMessage = `:${this.serverId} SVINFO 6 6 0 ${this.getDate()}\r\n`;
|
||||||
this.safeWriteToSocket(socket, serverInfoMessage);
|
this.safeWriteToSocket(socket, serverInfoMessage);
|
||||||
break
|
break
|
||||||
case 'PING':
|
case 'PING':
|
||||||
@@ -460,7 +465,7 @@ class WTVIRC {
|
|||||||
if (pong.startsWith(':')) {
|
if (pong.startsWith(':')) {
|
||||||
pong = pong.slice(1); // Remove leading ':'
|
pong = pong.slice(1); // Remove leading ':'
|
||||||
}
|
}
|
||||||
this.safeWriteToSocket(socket, `PONG :${pong}\r\n`);
|
this.safeWriteToSocket(socket, `:${this.serverId} PONG ${pong}\r\n`);
|
||||||
break;
|
break;
|
||||||
case 'PONG':
|
case 'PONG':
|
||||||
// Ignore PONG from server
|
// Ignore PONG from server
|
||||||
@@ -2962,8 +2967,8 @@ class WTVIRC {
|
|||||||
const nickname = this.nicknames.get(socket);
|
const nickname = this.nicknames.get(socket);
|
||||||
if (nickname) {
|
if (nickname) {
|
||||||
this.cleanupUserSession(nickname);
|
this.cleanupUserSession(nickname);
|
||||||
}
|
this.nicknames.delete(socket);
|
||||||
this.nicknames.delete(socket);
|
}
|
||||||
if (!socket.signedoff) {
|
if (!socket.signedoff) {
|
||||||
var serverSocket = null;
|
var serverSocket = null;
|
||||||
for (const [srvSocket, users] of this.serverusers.entries()) {
|
for (const [srvSocket, users] of this.serverusers.entries()) {
|
||||||
@@ -2976,7 +2981,12 @@ class WTVIRC {
|
|||||||
this.broadcastToAllServers(`:${socket.uniqueId} QUIT :Client disconnected\r\n`, serverSocket);
|
this.broadcastToAllServers(`:${socket.uniqueId} QUIT :Client disconnected\r\n`, serverSocket);
|
||||||
socket.signedoff = true; // Just in case
|
socket.signedoff = true; // Just in case
|
||||||
}
|
}
|
||||||
this.clients = this.clients.filter(c => c !== socket);
|
if (socket.isserver) {
|
||||||
|
this.servers.delete(socket);
|
||||||
|
this.serverusers.delete(socket);
|
||||||
|
} else {
|
||||||
|
this.clients.delete(socket);
|
||||||
|
}
|
||||||
if (socket._idleInterval) {
|
if (socket._idleInterval) {
|
||||||
clearInterval(socket._idleInterval);
|
clearInterval(socket._idleInterval);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ class WTVSec {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setTicketData(key, value) {
|
setTicketData(key, value) {
|
||||||
if (key === null) throw ("WTVSec.ssetTicketDataet(): invalid key provided");
|
if (key === null) throw ("WTVSec.setTicketData(): invalid key provided");
|
||||||
if (typeof (this.ticket_store) === 'undefined') this.ticket_store = {};
|
if (typeof (this.ticket_store) === 'undefined') this.ticket_store = {};
|
||||||
this.ticket_store[key] = value;
|
this.ticket_store[key] = value;
|
||||||
if (this.ticket_b64) this.PrepareTicket();
|
if (this.ticket_b64) this.PrepareTicket();
|
||||||
|
|||||||
Reference in New Issue
Block a user