]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_kick.c
Fix +J not checking for local clients properly.
[irc/rqf/shadowircd.git] / modules / core / m_kick.c
index 8ed49f4dc685acd6bdfcabf3512c6a059964bbf7..a85b7a7f4a771465b3f86af89a954b2d4bfa4f9b 100644 (file)
@@ -173,6 +173,17 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
+               if (MyClient(source_p) && chptr->mode.mode & MODE_NOOPERKICK && IsOper(who))
+               {
+                       sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
+                                       "Overriding KICK from %s on %s in %s (channel is +M)",
+                                       source_p->name, who->name, chptr->chname);
+                       sendto_one_numeric(source_p, ERR_ISCHANSERVICE,
+                                       "%s %s :Cannot kick IRC operators from that channel.",
+                                       who->name, chptr->chname);
+                       return 0;
+               }
+
                if(MyClient(source_p))
                {
                        hook_data_channel_approval hookdata;
@@ -217,6 +228,10 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                              ":%s KICK %s %s :%s",
                              use_id(source_p), chptr->chname, use_id(who), comment);
                remove_user_from_channel(msptr);
+
+               /* we don't need to track NOREJOIN stuff unless it's our client being kicked */
+               if(MyClient(who) && chptr->mode.mode & MODE_NOREJOIN)
+                       channel_metadata_time_add(chptr, "KICKNOREJOIN", rb_current_time(), who->id);
        }
        else if (MyClient(source_p))
                sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,