diff --git a/exec/ircd.js b/exec/ircd.js index 74961460498de18af3dcc98545723fb3c01471cc..4c5f9037309b38b965ac5091c329912fec53486a 100644 --- a/exec/ircd.js +++ b/exec/ircd.js @@ -68,13 +68,12 @@ var enable_users_summon = true; // what our server is capable of from a server point of view. // TS3 = Version 3 of accepted interserver timestamp protocol. -// NOQUIT = NOQUIT interserver command supported. +// NOQUIT = QUIT clients on behalf of a SQUIT server? (no netsplit spam) // SSJOIN = SJOIN interserver command supported without dual TS, single TS only. // BURST = Sending of network synch data is done in a 3-stage burst (BURST cmd) // UNCONNECT = UNCONNECT interserver command supported. // NICKIP = 9th parameter of interserver NICK command is an integer IP. -// TSMODE = Timestamps are given on plain MODE commands. -// ZIP = server supports gzip on the fly for interserver communication. +// TSMODE = 2nd arg to standard MODE is the channel's TS. var server_capab = "TS3 NOQUIT SSJOIN BURST UNCONNECT NICKIP TSMODE"; // EVERY server on the network MUST have the same values in ALL of these @@ -1615,7 +1614,7 @@ function IRCClient_numeric322(chan,show_modes) { if ((chan.mode&CHANMODE_PRIVATE) && !(this.mode&USERMODE_OPER) && !this.onchannel(chan.nam.toUpperCase()) ) { - channel_name = "Priv"; + channel_name = "*"; } else { channel_name = chan.nam; if (disp_topic) @@ -2074,7 +2073,7 @@ function IRCClient_global(target,type_str,send_str) { global_str = ":" + this.nick + " " + global_str; if(this.parent) Clients[this.parent].bcast_to_servers_raw(global_str); - else + else if (this.flags&OLINE_CAN_GGNOTICE) server_bcast_to_servers(global_str); return 1; } @@ -2092,10 +2091,11 @@ function IRCClient_globops(str) { } function IRCClient_do_msg(target,type_str,send_str) { - if ((target[0] == "$") && (this.mode&USERMODE_OPER)) + if ((target[0] == "$") && (this.mode&USERMODE_OPER) && + (this.flags&OLINE_CAN_LGNOTICE)) return this.global(target,type_str,send_str); - send_to_list = -1; + var send_to_list = -1; if (target[0] == "@" && ( (target[1] == "#") || target[1] == "&") ) { send_to_list = CHANMODE_OP; target = target.slice(1); @@ -2105,10 +2105,11 @@ function IRCClient_do_msg(target,type_str,send_str) { } if ((target[0] == "#") || (target[0] == "&")) { - chan = searchbychannel(target); + var chan = searchbychannel(target); if (!chan) { // check to see if it's a #*hostmask* oper message - if ((target[0] == "#") && (this.mode&USERMODE_OPER)) { + if ((target[0] == "#") && (this.mode&USERMODE_OPER) && + (this.flags&OLINE_CAN_LGNOTICE)) { return this.global(target,type_str,send_str); } else { this.numeric401(target); @@ -2133,15 +2134,16 @@ function IRCClient_do_msg(target,type_str,send_str) { return 0; } if(send_to_list == -1) { - str = type_str +" "+ chan.nam +" :"+ send_str; + var str = type_str +" "+ chan.nam +" :"+ send_str; this.bcast_to_channel(chan.nam, str, false); this.bcast_to_channel_servers(chan.nam, str); } else { + var prefix_chr; if (send_to_list == CHANMODE_OP) prefix_chr="@"; else if (send_to_list == CHANMODE_VOICE) prefix_chr="+"; - str = type_str +" " + prefix_chr + chan.nam + " :"+ send_str; + var str = type_str +" " + prefix_chr + chan.nam + " :"+ send_str; this.bcast_to_list(chan, str, false, send_to_list); this.bcast_to_channel_servers(chan.nam, str); } @@ -2162,7 +2164,7 @@ function IRCClient_do_msg(target,type_str,send_str) { } else { var real_target = target; } - target_socket = searchbynick(real_target); + var target_socket = searchbynick(real_target); if (target_socket) { if (target_server && (target_server.parent != target_socket.parent)) { @@ -2172,7 +2174,7 @@ function IRCClient_do_msg(target,type_str,send_str) { if (target_server && (target_server.id == target_socket.parent) ) target = real_target; - str = type_str + " " + target + " :" + send_str; + var str = type_str + " " + target + " :" + send_str; target_socket.originatorout(str,this); if (target_socket.away && (type_str == "PRIVMSG") && !this.server && this.local) @@ -4318,7 +4320,8 @@ function IRCClient_registered_commands(command, cmdline) { nickid.rmchan(Channels[chanid.nam.toUpperCase()]); break; case "KILL": - if (!(this.mode&USERMODE_OPER)) { + if (!(this.mode&USERMODE_OPER) || + !(this.flags&OLINE_CAN_LKILL)) { this.numeric481(); break; } @@ -4344,6 +4347,10 @@ function IRCClient_registered_commands(command, cmdline) { if (target && target.local) { target.quit("Local kill by " + this.nick + " (" + reason + ")"); } else if (target) { + if (!(this.flags&OLINE_CAN_GKILL)) { + this.numeric481(); + break; + } var trg_srv = searchbyserver( target.servername); if (trg_srv && trg_srv.isulined) {