]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Segfault-causing typo (wrong var used for a loop, whoops)
[user/henk/code/inspircd.git] / src / mode.cpp
index 7d5a81d6969f12ab854372582576080ac810c519..dbbb4228930d7d4434abf018e15c549bb5082e87 100644 (file)
@@ -72,29 +72,31 @@ userrec* ModeParser::SanityChecks(userrec *user,char *dest,chanrec *chan,int sta
 
 char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
 {
-       for (unsigned int i = 0; i < d->chans.size(); i++)
+       if (!chan)
+               return NULL;
+
+       for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
        {
-               if ((d->chans[i].channel != NULL) && (chan != NULL))
-               if (d->chans[i].channel == chan)
+               if (((ucrec*)(*i))->channel == chan)
                {
-                       if (d->chans[i].uc_modes & MASK)
+                       if (((ucrec*)(*i))->uc_modes & MASK)
                        {
                                return NULL;
                        }
-                       d->chans[i].uc_modes = d->chans[i].uc_modes | MASK;
+                       ((ucrec*)(*i))->uc_modes = ((ucrec*)(*i))->uc_modes | MASK;
                        switch (MASK)
                        {
                                case UCMODE_OP:
-                                       d->chans[i].channel->AddOppedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->AddOppedUser(d);
                                break;
                                case UCMODE_HOP:
-                                       d->chans[i].channel->AddHalfoppedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->AddHalfoppedUser(d);
                                break;
                                case UCMODE_VOICE:
-                                       d->chans[i].channel->AddVoicedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->AddVoicedUser(d);
                                break;
                        }
-                       log(DEBUG,"grant: %s %s",d->chans[i].channel->name,d->nick);
+                       log(DEBUG,"grant: %s %s",((ucrec*)(*i))->channel->name,d->nick);
                        return d->nick;
                }
        }
@@ -103,29 +105,31 @@ char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK)
 
 char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK)
 {
-       for (unsigned int i = 0; i < d->chans.size(); i++)
+       if (!chan)
+               return NULL;
+
+       for (std::vector<ucrec*>::const_iterator i = d->chans.begin(); i != d->chans.end(); i++)
        {
-               if ((d->chans[i].channel != NULL) && (chan != NULL))
-               if (d->chans[i].channel == chan)
+               if (((ucrec*)(*i))->channel == chan)
                {
-                       if ((d->chans[i].uc_modes & MASK) == 0)
+                       if ((((ucrec*)(*i))->uc_modes & MASK) == 0)
                        {
                                return NULL;
                        }
-                       d->chans[i].uc_modes ^= MASK;
+                       ((ucrec*)(*i))->uc_modes ^= MASK;
                        switch (MASK)
                        {
                                case UCMODE_OP:
-                                       d->chans[i].channel->DelOppedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->DelOppedUser(d);
                                break;
                                case UCMODE_HOP:
-                                       d->chans[i].channel->DelHalfoppedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->DelHalfoppedUser(d);
                                break;
                                case UCMODE_VOICE:
-                                       d->chans[i].channel->DelVoicedUser((char*)d);
+                                       ((ucrec*)(*i))->channel->DelVoicedUser(d);
                                break;
                        }
-                       log(DEBUG,"revoke: %s %s",d->chans[i].channel->name,d->nick);
+                       log(DEBUG,"revoke: %s %s",((ucrec*)(*i))->channel->name,d->nick);
                        return d->nick;
                }
        }
@@ -1235,9 +1239,22 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
                                                                {
                                                                        charlcat(dmodes,*i,53);
                                                                        charlcat(outpars,*i,MAXMODES);
-                                                                       if (*i == 'o')
+                                                                       switch (*i)
                                                                        {
-                                                                               FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
+                                                                               case 'o':
+                                                                                       FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
+                                                                               break;
+                                                                               case 'i':
+                                                                                       dest->modebits |= UM_INVISIBLE;
+                                                                               break;
+                                                                               case 's':
+                                                                                       dest->modebits |= UM_SERVERNOTICE;
+                                                                               break;
+                                                                               case 'w':
+                                                                                       dest->modebits |= UM_WALLOPS;
+                                                                               break;
+                                                                               default:
+                                                                               break;
                                                                        }
                                                                }
                                                        }
@@ -1250,10 +1267,23 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
                                                                {
                                                                        charlcat(outpars,*i,MAXMODES);
                                                                        charremove(dmodes,*i);
-                                                                       if (*i == 'o')
+                                                                       switch (*i)
                                                                        {
-                                                                               *dest->oper = 0;
-                                                                               DeleteOper(dest);
+                                                                               case 'o':
+                                                                                       *dest->oper = 0;
+                                                                                       DeleteOper(dest);
+                                                                               break;
+                                                                               case 'i':
+                                                                                       dest->modebits &= ~UM_INVISIBLE;
+                                                                               break;
+                                                                               case 's':
+                                                                                       dest->modebits &= ~UM_SERVERNOTICE;
+                                                                               break;
+                                                                               case 'w':
+                                                                                       dest->modebits &= ~UM_WALLOPS;
+                                                                               break;
+                                                                               default:
+                                                                               break;
                                                                        }
                                                                }
                                                        }
@@ -1310,7 +1340,7 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
                        if (pcnt == 1)
                        {
                                /* just /modes #channel */
-                               WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr,has_channel(user,Ptr)));
+                               WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr,Ptr->HasUser(user)));
                                WriteServ(user->fd,"329 %s %s %d", user->nick, Ptr->name, Ptr->created);
                                return;
                        }
@@ -1342,7 +1372,7 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
                                }
                        }
 
-                       if (((Ptr) && (!has_channel(user,Ptr))) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+                       if ((IS_LOCAL(user)) && (!is_uline(user->server)) && (!Ptr->HasUser(user)))
                        {
                                WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
                                return;
@@ -1357,7 +1387,7 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user)
                                        return;
                                if (MOD_RESULT == ACR_DEFAULT)
                                {
-                                       if ((cstatus(user,Ptr) < STATUS_HOP) && (IS_LOCAL(user)))
+                                       if ((IS_LOCAL(user)) && (cstatus(user,Ptr) < STATUS_HOP))
                                        {
                                                WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, Ptr->name);
                                                return;