]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_join.c
Do not penalize for spambot checks if creating a new channel.
[irc/rqf/shadowircd.git] / modules / core / m_join.c
index d4b10361b65a0cba2d4f06a33bedc6df25f1a671..c01aba7791bc42182a780852464e906cd461ab21 100644 (file)
@@ -29,7 +29,7 @@
 #include "client.h"
 #include "common.h"
 #include "hash.h"
-#include "irc_string.h"
+#include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "send.h"
@@ -39,8 +39,8 @@
 #include "msg.h"
 #include "parse.h"
 #include "modules.h"
-#include "sprintf_irc.h"
 #include "packet.h"
+#include "chmode.h"
 
 static int m_join(struct Client *, struct Client *, int, const char **);
 static int ms_join(struct Client *, struct Client *, int, const char **);
@@ -56,7 +56,7 @@ struct Message join_msgtab = {
 
 struct Message sjoin_msgtab = {
        "SJOIN", 0, 0, 0, MFLG_SLOW,
-       {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 0}, mg_ignore, mg_ignore}
+       {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 4}, mg_ignore, mg_ignore}
 };
 
 mapi_clist_av1 join_clist[] = { &join_msgtab, &sjoin_msgtab, NULL };
@@ -76,7 +76,7 @@ static void set_final_mode(struct Mode *mode, struct Mode *oldmode);
 static void remove_our_modes(struct Channel *chptr, struct Client *source_p);
 
 static void remove_ban_list(struct Channel *chptr, struct Client *source_p,
-                           rb_dlink_list * list, char c, int cap, int mems);
+                           rb_dlink_list * list, char c, int mems);
 
 static char modebuf[MODEBUFLEN];
 static char parabuf[MODEBUFLEN];
@@ -125,7 +125,6 @@ check_forward(struct Client *source_p, struct Channel *chptr,
 
 /*
  * m_join
- *      parv[0] = sender prefix
  *      parv[1] = channel
  *      parv[2] = channel password (key)
  */
@@ -137,11 +136,11 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
        struct ConfItem *aconf;
        char *name;
        char *key = NULL;
+       const char *modes;
        int i, flags = 0;
        char *p = NULL, *p2 = NULL;
        char *chanlist;
        char *mykey;
-       int successful_join_count = 0;  /* Number of channels successfully joined */
 
        jbuf[0] = '\0';
 
@@ -149,7 +148,7 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
         * this code has a side effect of losing keys, but..
         */
        chanlist = LOCAL_COPY(parv[1]);
-       for(name = strtoken(&p, chanlist, ","); name; name = strtoken(&p, NULL, ","))
+       for(name = rb_strtok_r(chanlist, ",", &p); name; name = rb_strtok_r(NULL, ",", &p))
        {
                /* check the length and name of channel is ok */
                if(!check_channel_name_loc(source_p, name) || (strlen(name) > LOC_CHANNELLEN))
@@ -205,17 +204,17 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
                if(*jbuf)
                        (void) strcat(jbuf, ",");
-               (void) strlcat(jbuf, name, sizeof(jbuf));
+               (void) rb_strlcat(jbuf, name, sizeof(jbuf));
        }
 
        if(parc > 2)
        {
                mykey = LOCAL_COPY(parv[2]);
-               key = strtoken(&p2, mykey, ",");
+               key = rb_strtok_r(mykey, ",", &p2);
        }
 
-       for(name = strtoken(&p, jbuf, ","); name;
-           key = (key) ? strtoken(&p2, NULL, ",") : NULL, name = strtoken(&p, NULL, ","))
+       for(name = rb_strtok_r(jbuf, ",", &p); name;
+           key = (key) ? rb_strtok_r(NULL, ",", &p2) : NULL, name = rb_strtok_r(NULL, ",", &p))
        {
                hook_data_channel_activity hook_info;
 
@@ -272,14 +271,9 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                {
                        sendto_one(source_p, form_str(ERR_TOOMANYCHANNELS),
                                   me.name, source_p->name, name);
-                       if(successful_join_count)
-                               source_p->localClient->last_join_time = rb_current_time();
                        return 0;
                }
 
-               if(flags == 0)  /* if channel doesn't exist, don't penalize */
-                       successful_join_count++;
-
                if(chptr == NULL)       /* If I already have a chptr, no point doing this */
                {
                        chptr = get_or_create_channel(source_p, name, NULL);
@@ -288,29 +282,33 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        {
                                sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
                                           me.name, source_p->name, name);
-                               if(successful_join_count > 0)
-                                       successful_join_count--;
                                continue;
                        }
                }
 
-               if(!IsOper(source_p) && !IsExemptSpambot(source_p))
-                       check_spambot_warning(source_p, name);
-
                /* can_join checks for +i key, bans etc */
                if((i = can_join(source_p, chptr, key)))
                {
                        if ((i != ERR_NEEDREGGEDNICK && i != ERR_THROTTLE && i != ERR_INVITEONLYCHAN && i != ERR_CHANNELISFULL) ||
                            (!ConfigChannel.use_forward || (chptr = check_forward(source_p, chptr, key)) == NULL))
                        {
-                               sendto_one(source_p, form_str(i), me.name, source_p->name, name);
-                               if(successful_join_count > 0)
-                                       successful_join_count--;
+                               /* might be wrong, but is there any other better location for such?
+                                * see extensions/chm_operonly.c for other comments on this
+                                * -- dwr
+                                */
+                               if(i != ERR_CUSTOM)
+                                       sendto_one(source_p, form_str(i), me.name, source_p->name, name);
+
                                continue;
                        }
+
                        sendto_one_numeric(source_p, ERR_LINKCHANNEL, form_str(ERR_LINKCHANNEL), name, chptr->chname);
                }
 
+               if(flags == 0 &&
+                               !IsOper(source_p) && !IsExemptSpambot(source_p))
+                       check_spambot_warning(source_p, name);
+
                /* add the user to the channel */
                add_user_to_channel(chptr, source_p, flags);
                if (chptr->mode.join_num &&
@@ -334,21 +332,15 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        chptr->channelts = rb_current_time();
                        chptr->mode.mode |= MODE_TOPICLIMIT;
                        chptr->mode.mode |= MODE_NOPRIVMSGS;
+                       modes = channel_modes(chptr, &me);
 
-                       sendto_channel_local(ONLY_CHANOPS, chptr, ":%s MODE %s +nt",
-                                            me.name, chptr->chname);
+                       sendto_channel_local(ONLY_CHANOPS, chptr, ":%s MODE %s %s",
+                                            me.name, chptr->chname, modes);
 
-                       if(*chptr->chname == '#')
-                       {
-                               sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
-                                             ":%s SJOIN %ld %s +nt :@%s",
-                                             me.id, (long) chptr->channelts,
-                                             chptr->chname, source_p->id);
-                               sendto_server(client_p, chptr, NOCAPS, CAP_TS6,
-                                             ":%s SJOIN %ld %s +nt :@%s",
-                                             me.name, (long) chptr->channelts,
-                                             chptr->chname, source_p->name);
-                       }
+                       sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
+                                     ":%s SJOIN %ld %s %s :@%s",
+                                     me.id, (long) chptr->channelts,
+                                     chptr->chname, modes, source_p->id);
                }
                else
                {
@@ -356,11 +348,6 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                                      ":%s JOIN %ld %s +",
                                      use_id(source_p), (long) chptr->channelts,
                                      chptr->chname);
-
-                       sendto_server(client_p, chptr, NOCAPS, CAP_TS6,
-                                     ":%s SJOIN %ld %s + :%s",
-                                     me.name, (long) chptr->channelts,
-                                     chptr->chname, source_p->name);
                }
 
                del_invite(chptr, source_p);
@@ -377,9 +364,6 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
                channel_member_names(chptr, source_p, 1);
 
-               if(successful_join_count)
-                       source_p->localClient->last_join_time = rb_current_time();
-
                hook_info.client = source_p;
                hook_info.chptr = chptr;
                hook_info.key = key;
@@ -391,14 +375,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
 /*
  * ms_join
- *
- * inputs      -
- * output      - none
- * side effects        - handles remote JOIN's sent by servers. In TSora
- *               remote clients are joined using SJOIN, hence a 
- *               JOIN sent by a server on behalf of a client is an error.
- *               here, the initial code is in to take an extra parameter
- *               and use it for the TimeStamp on a new channel.
+ *      parv[1] = channel TS
+ *      parv[2] = channel
+ *      parv[3] = "+", formerly channel modes but now unused
+ * alternatively, a single "0" parameter parts all channels
  */
 static int
 ms_join(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
@@ -519,18 +499,12 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char *
        sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
                      ":%s JOIN %ld %s +",
                      source_p->id, (long) chptr->channelts, chptr->chname);
-       sendto_server(client_p, chptr, NOCAPS, CAP_TS6,
-                     ":%s SJOIN %ld %s %s :%s",
-                     source_p->servptr->name, (long) chptr->channelts,
-                     chptr->chname, keep_new_modes ? "+" : "0",
-                     source_p->name);
        return 0;
 }
 
 static int
 ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
-       static char buf_nick[BUFSIZE];
        static char buf_uid[BUFSIZE];
        static const char empty_modes[] = "0";
        struct Channel *chptr;
@@ -544,13 +518,12 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        int keep_new_modes = 1;
        int fl;
        int isnew;
-       int mlen_nick, mlen_uid;
+       int mlen_uid;
        int len_nick;
        int len_uid;
        int len;
        int joins = 0;
        const char *s;
-       char *ptr_nick;
        char *ptr_uid;
        char *p;
        int i, joinc = 0, timeslice = 0;
@@ -581,50 +554,8 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        {
                switch (*(s++))
                {
-               case 'i':
-                       mode.mode |= MODE_INVITEONLY;
-                       break;
-               case 'n':
-                       mode.mode |= MODE_NOPRIVMSGS;
-                       break;
-               case 'p':
-                       mode.mode |= MODE_PRIVATE;
-                       break;
-               case 's':
-                       mode.mode |= MODE_SECRET;
-                       break;
-               case 'm':
-                       mode.mode |= MODE_MODERATED;
-                       break;
-               case 't':
-                       mode.mode |= MODE_TOPICLIMIT;
-                       break;
-               case 'r':
-                       mode.mode |= MODE_REGONLY;
-                       break;
-               case 'L':
-                       mode.mode |= MODE_EXLIMIT;
-                       break;
-               case 'P':
-                       mode.mode |= MODE_PERMANENT;
-                       break;
-               case 'c':
-                       mode.mode |= MODE_NOCOLOR;
-                       break;
-               case 'g':
-                       mode.mode |= MODE_FREEINVITE;
-                       break;
-               case 'z':
-                       mode.mode |= MODE_OPMODERATE;
-                       break;
-               case 'F':
-                       mode.mode |= MODE_FREETARGET;
-                       break;
-               case 'Q':
-                       mode.mode |= MODE_DISFORWARD;
-                       break;
                case 'f':
-                       strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward));
+                       rb_strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward));
                        args++;
                        if(parc < 5 + args)
                                return 0;
@@ -638,7 +569,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                                return 0;
                        break;
                case 'k':
-                       strlcpy(mode.key, parv[4 + args], sizeof(mode.key));
+                       rb_strlcpy(mode.key, parv[4 + args], sizeof(mode.key));
                        args++;
                        if(parc < 5 + args)
                                return 0;
@@ -649,6 +580,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                        if(parc < 5 + args)
                                return 0;
                        break;
+               default:
+                       if(chmode_flags[(int) *s] != 0)
+                       {
+                               mode.mode |= chmode_flags[(int) *s];
+                       }
                }
        }
 
@@ -714,10 +650,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                        struct membership *msptr;
                        struct Client *who;
                        int l = rb_dlink_list_length(&chptr->members);
-                       int b = rb_dlink_list_length(&chptr->banlist) +
-                               rb_dlink_list_length(&chptr->exceptlist) +
-                               rb_dlink_list_length(&chptr->invexlist) +
-                               rb_dlink_list_length(&chptr->quietlist);
 
                        RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head)
                        {
@@ -730,9 +662,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                                              ":%s KICK %s %s :Net Rider",
                                              me.id, chptr->chname,
                                              who->id);
-                               sendto_server(NULL, chptr, NOCAPS, CAP_TS6,
-                                             ":%s KICK %s %s :Net Rider",
-                                             me.name, chptr->chname, who->name);
                                remove_user_from_channel(msptr);
                                if (--l == 0)
                                        break;
@@ -743,14 +672,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                                if((chptr = get_or_create_channel(source_p, parv[2], &isnew)) == NULL)
                                        return 0;               /* oops! */
 
-                               /* If the source does not do TS6,
-                                * nontimestamped bans have been sent to it,
-                                * but we have just lost those here. Let's
-                                * warn the channel about this. Because
-                                * of the kicks, any users on the channel
-                                * will be at client_p. -- jilles */
-                               if (!has_id(source_p) && b > 0)
-                                       sendto_one(client_p, ":%s NOTICE %s :*** Notice -- possible ban desync on %s, please remove any bans just added by servers", get_id(&me, client_p), parv[2], parv[2]);
                                oldmode = &chptr->mode;
                        }
                }
@@ -797,6 +718,20 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                {
                        del_invite(chptr, ptr->data);
                }
+
+               if(rb_dlink_list_length(&chptr->banlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', ALL_MEMBERS);
+               if(rb_dlink_list_length(&chptr->exceptlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->exceptlist,
+                                       'e', ONLY_CHANOPS);
+               if(rb_dlink_list_length(&chptr->invexlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->invexlist,
+                                       'I', ONLY_CHANOPS);
+               if(rb_dlink_list_length(&chptr->quietlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->quietlist,
+                                       'q', ALL_MEMBERS);
+               chptr->bants++;
+
                sendto_channel_local(ALL_MEMBERS, chptr,
                                     ":%s NOTICE %s :*** Notice -- TS for %s changed from %ld to %ld",
                                     me.name, chptr->chname, chptr->chname,
@@ -817,13 +752,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        else
                modes = empty_modes;
 
-       mlen_nick = rb_sprintf(buf_nick, ":%s SJOIN %ld %s %s :",
-                              source_p->name, (long) chptr->channelts, parv[2], modes);
-       ptr_nick = buf_nick + mlen_nick;
-
-       /* working on the presumption eventually itll be more efficient to
-        * build a TS6 buffer without checking its needed..
-        */
        mlen_uid = rb_sprintf(buf_uid, ":%s SJOIN %ld %s %s :",
                              use_id(source_p), (long) chptr->channelts, parv[2], modes);
        ptr_uid = buf_uid + mlen_uid;
@@ -870,14 +798,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                /* we assume for these we can fit at least one nick/uid in.. */
 
                /* check we can fit another status+nick+space into a buffer */
-               if((mlen_nick + len_nick + NICKLEN + 3) > (BUFSIZE - 3))
-               {
-                       *(ptr_nick - 1) = '\0';
-                       sendto_server(client_p->from, NULL, NOCAPS, CAP_TS6, "%s", buf_nick);
-                       ptr_nick = buf_nick + mlen_nick;
-                       len_nick = 0;
-               }
-
                if((mlen_uid + len_uid + IDLEN + 3) > (BUFSIZE - 3))
                {
                        *(ptr_uid - 1) = '\0';
@@ -890,14 +810,12 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                {
                        if(fl & CHFL_CHANOP)
                        {
-                               *ptr_nick++ = '@';
                                *ptr_uid++ = '@';
                                len_nick++;
                                len_uid++;
                        }
                        if(fl & CHFL_VOICE)
                        {
-                               *ptr_nick++ = '+';
                                *ptr_uid++ = '+';
                                len_nick++;
                                len_uid++;
@@ -905,9 +823,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                }
 
                /* copy the nick to the two buffers */
-               len = rb_sprintf(ptr_nick, "%s ", target_p->name);
-               ptr_nick += len;
-               len_nick += len;
                len = rb_sprintf(ptr_uid, "%s ", use_id(target_p));
                ptr_uid += len;
                len_uid += len;
@@ -1014,36 +929,10 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        /* Keep the colon if we're sending an SJOIN without nicks -- jilles */
        if (joins)
        {
-               *(ptr_nick - 1) = '\0';
                *(ptr_uid - 1) = '\0';
        }
 
        sendto_server(client_p->from, NULL, CAP_TS6, NOCAPS, "%s", buf_uid);
-       sendto_server(client_p->from, NULL, NOCAPS, CAP_TS6, "%s", buf_nick);
-
-       /* if the source does TS6 we have to remove our bans.  Its now safe
-        * to issue -b's to the non-ts6 servers, as the sjoin we've just
-        * sent will kill any ops they have.
-        */
-       if(!keep_our_modes && source_p->id[0] != '\0')
-       {
-               if(rb_dlink_list_length(&chptr->banlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', NOCAPS, ALL_MEMBERS);
-
-               if(rb_dlink_list_length(&chptr->exceptlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->exceptlist,
-                                       'e', CAP_EX, ONLY_CHANOPS);
-
-               if(rb_dlink_list_length(&chptr->invexlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->invexlist,
-                                       'I', CAP_IE, ONLY_CHANOPS);
-
-               if(rb_dlink_list_length(&chptr->quietlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->quietlist,
-                                       'q', NOCAPS, ALL_MEMBERS);
-
-               chptr->bants++;
-       }
 
        return 0;
 }
@@ -1055,8 +944,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
  * output      - NONE
  * side effects        - Use has decided to join 0. This is legacy
  *               from the days when channels were numbers not names. *sigh*
- *               There is a bunch of evilness necessary here due to
- *               anti spambot code.
  */
 static void
 do_join_0(struct Client *client_p, struct Client *source_p)
@@ -1069,16 +956,14 @@ do_join_0(struct Client *client_p, struct Client *source_p)
        if(MyClient(source_p) && !IsFloodDone(source_p))
                flood_endgrace(source_p);
 
-
        sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s JOIN 0", use_id(source_p));
-       sendto_server(client_p, NULL, NOCAPS, CAP_TS6, ":%s JOIN 0", source_p->name);
-
-       if(source_p->user->channel.head && MyConnect(source_p) &&
-          !IsOper(source_p) && !IsExemptSpambot(source_p))
-               check_spambot_warning(source_p, NULL);
 
        while((ptr = source_p->user->channel.head))
        {
+               if(MyConnect(source_p) &&
+                  !IsOper(source_p) && !IsExemptSpambot(source_p))
+                       check_spambot_warning(source_p, NULL);
+
                msptr = ptr->data;
                chptr = msptr->chptr;
                sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@%s PART %s",
@@ -1091,27 +976,36 @@ do_join_0(struct Client *client_p, struct Client *source_p)
 static int
 check_channel_name_loc(struct Client *source_p, const char *name)
 {
+       const char *p;
+
        s_assert(name != NULL);
        if(EmptyString(name))
                return 0;
 
        if(ConfigFileEntry.disable_fake_channels && !IsOper(source_p))
        {
-               for(; *name; ++name)
+               for(p = name; *p; ++p)
                {
-                       if(!IsChanChar(*name) || IsFakeChanChar(*name))
+                       if(!IsChanChar(*p) || IsFakeChanChar(*p))
                                return 0;
                }
        }
        else
        {
-               for(; *name; ++name)
+               for(p = name; *p; ++p)
                {
-                       if(!IsChanChar(*name))
+                       if(!IsChanChar(*p))
                                return 0;
                }
        }
 
+       if(ConfigChannel.only_ascii_channels)
+       {
+               for(p = name; *p; ++p)
+                       if(*p < 33 || *p > 126)
+                               return 0;
+       }
+
        return 1;
 }
 
@@ -1124,30 +1018,30 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode)
        int i;
 
        /* ok, first get a list of modes we need to add */
-       for (i = 0; chmode_flags[i].letter; i++)
+       for (i = 0; i < 256; i++)
        {
-               if((mode->mode & chmode_flags[i].mode) && !(oldmode->mode & chmode_flags[i].mode))
+               if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i]))
                {
                        if(dir != MODE_ADD)
                        {
                                *mbuf++ = '+';
                                dir = MODE_ADD;
                        }
-                       *mbuf++ = chmode_flags[i].letter;
+                       *mbuf++ = i;
                }
        }
 
        /* now the ones we need to remove. */
-       for (i = 0; chmode_flags[i].letter; i++)
+       for (i = 0; i < 256; i++)
        {
-               if((oldmode->mode & chmode_flags[i].mode) && !(mode->mode & chmode_flags[i].mode))
+               if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i]))
                {
                        if(dir != MODE_DEL)
                        {
                                *mbuf++ = '-';
                                dir = MODE_DEL;
                        }
-                       *mbuf++ = chmode_flags[i].letter;
+                       *mbuf++ = i;
                }
        }
 
@@ -1277,7 +1171,7 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p)
                                        *mbuf = '\0';
                                        sendto_channel_local(ALL_MEMBERS, chptr,
                                                             ":%s MODE %s %s %s %s %s %s",
-                                                            me.name, chptr->chname,
+                                                            source_p->name, chptr->chname,
                                                             lmodebuf, lpara[0], lpara[1],
                                                             lpara[2], lpara[3]);
 
@@ -1309,7 +1203,7 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p)
                        *mbuf = '\0';
                        sendto_channel_local(ALL_MEMBERS, chptr,
                                             ":%s MODE %s %s %s %s %s %s",
-                                            me.name, chptr->chname, lmodebuf,
+                                            source_p->name, chptr->chname, lmodebuf,
                                             lpara[0], lpara[1], lpara[2], lpara[3]);
                        mbuf = lmodebuf;
                        *mbuf++ = '-';
@@ -1325,7 +1219,7 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p)
                *mbuf = '\0';
                sendto_channel_local(ALL_MEMBERS, chptr,
                                     ":%s MODE %s %s %s %s %s %s",
-                                    me.name, chptr->chname, lmodebuf,
+                                    source_p->name, chptr->chname, lmodebuf,
                                     EmptyString(lpara[0]) ? "" : lpara[0],
                                     EmptyString(lpara[1]) ? "" : lpara[1],
                                     EmptyString(lpara[2]) ? "" : lpara[2],
@@ -1339,11 +1233,10 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p)
  * inputs      - channel, source, list to remove, char of mode, caps needed
  * outputs     -
  * side effects - given list is removed, with modes issued to local clients
- *               and non-TS6 servers.
  */
 static void
 remove_ban_list(struct Channel *chptr, struct Client *source_p,
-               rb_dlink_list * list, char c, int cap, int mems)
+               rb_dlink_list * list, char c, int mems)
 {
        static char lmodebuf[BUFSIZE];
        static char lparabuf[BUFSIZE];
@@ -1373,11 +1266,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
                        *(pbuf - 1) = '\0';
 
                        sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf);
-                       /* Tricky tricky. If we changed source_p to &me
-                        * in ms_sjoin(), this still won't send stuff
-                        * where it should not be sent, because the
-                        * real source_p does TS6 -- jilles */
-                       sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf);
 
                        cur_len = mlen;
                        mbuf = lmodebuf + mlen;
@@ -1396,7 +1284,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
        *mbuf = '\0';
        *(pbuf - 1) = '\0';
        sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf);
-       sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf);
 
        list->head = list->tail = NULL;
        list->length = 0;