return moduledata.approved;
}
+/* allow_mode_change()
+ *
+ * Checks if mlock and chanops permit a mode change.
+ *
+ * inputs - client, channel, access level, errors pointer, mode char
+ * outputs - 0 on failure, 1 on success
+ * side effects - error message sent on failure
+ */
+static int
+allow_mode_change(struct Client *source_p, struct Channel *chptr, int alevel,
+ int *errors, char c)
+{
+ /* If this mode char is locked, don't allow local users to change it. */
+ if (MyClient(source_p) && chptr->mode_lock && strchr(chptr->mode_lock, c))
+ {
+ if (!(*errors & SM_ERR_MLOCK))
+ sendto_one_numeric(source_p,
+ ERR_MLOCKRESTRICTED,
+ form_str(ERR_MLOCKRESTRICTED),
+ chptr->chname,
+ c,
+ chptr->mode_lock);
+ *errors |= SM_ERR_MLOCK;
+ return 0;
+ }
+ if(alevel != CHFL_CHANOP)
+ {
+ 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 0;
+ }
+ return 1;
+}
+
/* add_id()
*
* inputs - client, channel, id to add, type, forward
int alevel, int parc, int *parn,
const char **parv, int *errors, int dir, char c, long mode_type)
{
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
return;
*errors |= errorval;
/* non-ops cant see +eI lists.. */
+ /* note that this is still permitted if +e/+I are mlocked. */
if(alevel != CHFL_CHANOP && mode_type != CHFL_BAN &&
mode_type != CHFL_QUIET)
{
return;
}
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
+
if(MyClient(source_p) && (++mode_limit > MAXMODEPARAMS))
return;
const char *opnick;
struct Client *targ_p;
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if((dir == MODE_QUERY) || (parc <= *parn))
return;
const char *opnick;
struct Client *targ_p;
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if((dir == MODE_QUERY) || parc <= *parn)
return;
static char limitstr[30];
int limit;
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if(dir == MODE_QUERY)
return;
{
int joins = 0, timeslice = 0;
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if(dir == MODE_QUERY)
return;
}
#ifndef FORWARD_OPERONLY
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
#else
if(!IsOper(source_p) && !IsServer(source_p))
{
{
char *key;
- if(alevel != CHFL_CHANOP)
- {
- if(!(*errors & SM_ERR_NOOPS))
- sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
- me.name, source_p->name, chptr->chname);
- *errors |= SM_ERR_NOOPS;
+ if(!allow_mode_change(source_p, chptr, alevel, errors, c))
return;
- }
if(dir == MODE_QUERY)
return;
dir = MODE_QUERY;
break;
default:
- /* If this mode char is locked, don't allow local users to change it. */
- if (MyClient(source_p) && chptr->mode_lock && strchr(chptr->mode_lock, c))
- {
- if (!(errors & SM_ERR_MLOCK))
- sendto_one_numeric(source_p,
- ERR_MLOCKRESTRICTED,
- form_str(ERR_MLOCKRESTRICTED),
- chptr->chname,
- c,
- chptr->mode_lock);
- errors |= SM_ERR_MLOCK;
- continue;
- }
chmode_table[(unsigned char) c].set_func(fakesource_p, chptr, alevel,
parc, &parn, parv,
&errors, dir, c,