]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_kick.c
Fix m_kick so that it checks if you're trying to kick the target, not yourself.
[irc/rqf/shadowircd.git] / modules / core / m_kick.c
index a7d5e2a7399ef83f17180af32bbe9e0c6ecffd5d..7efabbb0c253de93b2d979b9c1b6223d3c4ae1c1 100644 (file)
@@ -37,6 +37,7 @@
 #include "hash.h"
 #include "packet.h"
 #include "s_serv.h"
+#include "hook.h"
 
 static int m_kick(struct Client *, struct Client *, int, const char **);
 #define mg_kick { m_kick, 3 }
@@ -52,7 +53,6 @@ DECLARE_MODULE_AV1(kick, NULL, NULL, kick_clist, NULL, NULL, "$Revision: 3317 $"
 
 /*
 ** m_kick
-**      parv[0] = sender prefix
 **      parv[1] = channel
 **      parv[2] = client to kick
 **      parv[3] = kick comment
@@ -86,6 +86,13 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                return 0;
        }
 
+       user = parv[2];         /* strtoken(&p2, parv[2], ","); */
+
+       if(!(who = find_chasing(source_p, user, &chasing)))
+       {
+               return 0;
+       }
+
        if(!IsServer(source_p))
        {
                msptr = find_channel_membership(chptr, source_p);
@@ -97,7 +104,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        return 0;
                }
 
-               if(!is_chanop(msptr))
+               if(!can_kick_deop(msptr, find_channel_membership(chptr, who)) && !IsOverride(source_p))
                {
                        if(MyConnect(source_p))
                        {
@@ -140,13 +147,6 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
        if((p = strchr(parv[2], ',')))
                *p = '\0';
 
-       user = parv[2];         /* strtoken(&p2, parv[2], ","); */
-
-       if(!(who = find_chasing(source_p, user, &chasing)))
-       {
-               return 0;
-       }
-
        msptr = find_channel_membership(chptr, who);
 
        if(msptr != NULL)
@@ -158,6 +158,29 @@ 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_NOKICK)
+               {
+                       sendto_one_numeric(source_p, ERR_NOKICK,
+                                       form_str(ERR_NOKICK),
+                                       chptr->chname);
+                       return 0;
+               }
+
+               if(MyClient(source_p))
+               {
+                       hook_data_channel_approval hookdata;
+
+                       hookdata.client = source_p;
+                       hookdata.chptr = chptr;
+                       hookdata.target = who;
+                       hookdata.approved = 1;
+
+                       call_hook(h_can_kick, &hookdata);
+
+                       if (!hookdata.approved)
+                               return 0;
+               }
+
                comment = LOCAL_COPY((EmptyString(parv[3])) ? who->name : parv[3]);
                if(strlen(comment) > (size_t) REASONLEN)
                        comment[REASONLEN] = '\0';
@@ -181,9 +204,6 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
                sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
                              ":%s KICK %s %s :%s",
                              use_id(source_p), chptr->chname, use_id(who), comment);
-               sendto_server(client_p, chptr, NOCAPS, CAP_TS6,
-                             ":%s KICK %s %s :%s",
-                             source_p->name, chptr->chname, who->name, comment);
                remove_user_from_channel(msptr);
        }
        else if (MyClient(source_p))