From 57363546cfeb782dd84ca3862adefb086ace9a1d Mon Sep 17 00:00:00 2001 From: Randy Sommerfeld <cyan@synchro.net> Date: Tue, 24 Oct 2023 08:59:53 +0700 Subject: [PATCH] Fix https://gitlab.synchro.net/main/sbbs/-/issues/650 --- exec/load/ircd/server.js | 51 ++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/exec/load/ircd/server.js b/exec/load/ircd/server.js index 0ec273e1b7..59824e32a3 100644 --- a/exec/load/ircd/server.js +++ b/exec/load/ircd/server.js @@ -420,26 +420,47 @@ function Server_Work(cmdline) { )); break; case "MODE": - if (typeof p[1] === undefined) + if (typeof p[1] === undefined) { + umode_notice(USERMODE_OPER,"Notice",format( + "Origin %s sent MODE without enough arguments.", + this.nick + )); break; - if (p[0][0] != "#") { /* Setting a user mode */ - tmp = origin.setusermode(p[1]); - if (tmp) { - this.bcast_to_servers_raw(format( - ":%s MODE %s %s", - origin.nick, - origin.nick, - tmp + } + /* Detect TS-style MODE and stuff the real TS in j */ + j = parseInt(p[0]); + if (p[0] == j) { + if (!this.hub) + j = Epoch(); + p.shift(); + } + if (p[0][0] == "#") { + /* Setting a channel mode */ + tmp = Channels[p[0].toUpperCase()]; + if (!tmp) { + umode_notice(USERMODE_OPER,"Notice",format( + "Origin %s sent MODE with invalid channel %s", + this.nick, + p[0] )); + break; } + if (!j) + j = tmp.created; + p.shift(); + origin.set_chanmode(tmp,p,j); break; } - /* Setting a channel mode */ - tmp = Channels[p[0].toUpperCase()]; - if (!tmp) - break; - p.shift(); - origin.set_chanmode(tmp,p,parseInt(p[1])); + /* Setting a user mode */ + tmp = origin.setusermode(p[1]); + if (tmp) { + this.bcast_to_servers_raw(format( + ":%s MODE %s %s", + origin.nick, + origin.nick, + tmp + )); + } break; case "MOTD": if (!p[0] || origin.server) -- GitLab