]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Make chm_staff (staff only modes) only settable if you have ops in the channel in...
authorB.Greenham <redacted>
Wed, 31 Mar 2010 15:22:32 +0000 (11:22 -0400)
committerB.Greenham <redacted>
Wed, 31 Mar 2010 15:22:32 +0000 (11:22 -0400)
If operators need to set such modes in a channel where they don't have ops, that's what override/omode are for.

src/chmode.c

index 3161b645c7a683fc3e3adfda696b22877141974e..5aa618f863a6ee820b7d11a56cbe4c5fb691760b 100644 (file)
@@ -660,6 +660,8 @@ chm_staff(struct Client *source_p, struct Channel *chptr,
          int alevel, int parc, int *parn,
          const char **parv, int *errors, int dir, char c, long mode_type)
 {
+       int override = 0;
+
        if(!IsOper(source_p) && !IsServer(source_p))
        {
                if(!(*errors & SM_ERR_NOPRIVS))
@@ -676,6 +678,20 @@ chm_staff(struct Client *source_p, struct Channel *chptr,
                return;
        }
 
+       if(alevel != CHFL_CHANOP && alevel != CHFL_ADMIN && alevel != CHFL_HALFOP)
+       {
+               if (IsOverride(source_p))
+                       override = 1;
+               else
+               {
+                       if(!(*errors & SM_ERR_NOOPS))
+                               sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
+                                               me.name, source_p->name, chptr->chname);
+                       *errors |= SM_ERR_NOOPS;
+                       return;
+               }
+       }
+
        if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
                return;
 
@@ -690,7 +706,7 @@ chm_staff(struct Client *source_p, struct Channel *chptr,
                mode_changes[mode_count].nocaps = 0;
                mode_changes[mode_count].id = NULL;
                mode_changes[mode_count].mems = ALL_MEMBERS;
-               mode_changes[mode_count].override = 0;
+               mode_changes[mode_count].override = override;
                mode_changes[mode_count++].arg = NULL;
        }
        else if((dir == MODE_DEL) && (chptr->mode.mode & mode_type))
@@ -702,7 +718,7 @@ chm_staff(struct Client *source_p, struct Channel *chptr,
                mode_changes[mode_count].caps = 0;
                mode_changes[mode_count].nocaps = 0;
                mode_changes[mode_count].mems = ALL_MEMBERS;
-               mode_changes[mode_count].override = 0;
+               mode_changes[mode_count].override = override;
                mode_changes[mode_count].id = NULL;
                mode_changes[mode_count++].arg = NULL;
        }