]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
MAXMODES wasn't being enforced
[user/henk/code/inspircd.git] / src / mode.cpp
index 898492f38e607385f0c67b0ffcb26127059ebbb0..b2abd0563545d367ed78903d17b4d567d662b0a7 100644 (file)
@@ -96,13 +96,13 @@ char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status)
                        if ((d->chans[i].channel != NULL) && (chan != NULL))
                        if (!strcasecmp(d->chans[i].channel->name,chan->name))
                        {
-                       if (d->chans[i].uc_modes & UCMODE_OP)
+                               if (d->chans[i].uc_modes & UCMODE_OP)
                                {
                                        /* mode already set on user, dont allow multiple */
-                                       log(DEFAULT,"The target user given to GiveOps was already opped on the channel");
                                        return NULL;
                                }
                                d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_OP;
+                               d->chans[i].channel->AddOppedUser((char*)d);
                                log(DEBUG,"gave ops: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -158,6 +158,7 @@ char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status)
                                        return NULL;
                                }
                                d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_HOP;
+                               d->chans[i].channel->AddHalfoppedUser((char*)d);
                                log(DEBUG,"gave h-ops: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -212,6 +213,7 @@ char* ModeParser::GiveVoice(userrec *user,char *dest,chanrec *chan,int status)
                                        return NULL;
                                }
                                d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_VOICE;
+                               d->chans[i].channel->AddVoicedUser((char*)d);
                                log(DEBUG,"gave voice: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -267,6 +269,7 @@ char* ModeParser::TakeOps(userrec *user,char *dest,chanrec *chan,int status)
                                        return NULL;
                                }
                                d->chans[i].uc_modes ^= UCMODE_OP;
+                               d->chans[i].channel->DelOppedUser((char*)d);
                                log(DEBUG,"took ops: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -323,6 +326,7 @@ char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status)
                                        return NULL;
                                }
                                d->chans[i].uc_modes ^= UCMODE_HOP;
+                               d->chans[i].channel->DelHalfoppedUser((char*)d);
                                log(DEBUG,"took h-ops: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -377,6 +381,7 @@ char* ModeParser::TakeVoice(userrec *user,char *dest,chanrec *chan,int status)
                                        return NULL;
                                }
                                d->chans[i].uc_modes ^= UCMODE_VOICE;
+                               d->chans[i].channel->DelVoicedUser((char*)d);
                                log(DEBUG,"took voice: %s %s",d->chans[i].channel->name,d->nick);
                                return d->nick;
                        }
@@ -446,7 +451,14 @@ char* ModeParser::AddBan(userrec *user,char *dest,chanrec *chan,int status)
 
        b.set_time = TIME;
        strlcpy(b.data,dest,MAXBUF);
-       strlcpy(b.set_by,user->nick,NICKMAX);
+       if (*user->nick)
+       {
+               strlcpy(b.set_by,user->nick,NICKMAX);
+       }
+       else
+       {
+               strlcpy(b.set_by,Config->ServerName,NICKMAX);
+       }
        chan->bans.push_back(b);
        return dest;
 }
@@ -577,6 +589,12 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int
        {
                r = NULL;
 
+               /* If we have more than MAXMODES changes in one line,
+                * drop all after the MAXMODES
+                */
+               if (pc > MAXMODES)
+                       break;
+
                {
                        switch (*modechar)
                        {
@@ -617,6 +635,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int
                                        log(DEBUG,"Ops");
                                        if ((param >= pcnt)) break;
                                        log(DEBUG,"Enough parameters left");
+                                       r = NULL;
                                        if (mdir == 1)
                                        {
                                                MOD_RESULT = 0;
@@ -648,6 +667,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int
                        
                                case 'h':
                                        if (((param >= pcnt)) || (!Config->AllowHalfop)) break;
+                                       r = NULL;
                                        if (mdir == 1)
                                        {
                                                 MOD_RESULT = 0;
@@ -678,6 +698,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int
                                
                                case 'v':
                                        if ((param >= pcnt)) break;
+                                       r = NULL;
                                        if (mdir == 1)
                                        {
                                                 MOD_RESULT = 0;
@@ -707,6 +728,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int
                                
                                case 'b':
                                        if ((param >= pcnt)) break;
+                                       r = NULL;
                                        if (mdir == 1)
                                        {
                                                 MOD_RESULT = 0;