* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
* E-mail:
* <brain@chatspike.net>
* <Craig@chatspike.net>
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** GiveOps was given an invalid parameter");
return NULL;
}
-
- if (!isnick(dest))
- {
- log(DEFAULT,"the target nickname given to GiveOps was invalid");
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
d = Find(dest);
if (!d)
{
}
else
{
-
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_OP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)))
- {
- log(DEBUG,"%s cant give ops to %s because they nave status %d and needs %d",user->nick,dest,status,STATUS_OP);
- WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ {
+ log(DEBUG,"%s cant give ops to %s because they nave status %d and needs %d",user->nick,dest,status,STATUS_OP);
+ WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** GiveHops was given an invalid parameter");
return NULL;
}
d = Find(dest);
- if (!isnick(dest))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
if (!d)
{
WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
}
else
{
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_HALFOP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_HALFOP));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You're not a channel operator",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** GiveVoice was given an invalid parameter");
return NULL;
}
d = Find(dest);
- if (!isnick(dest))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
if (!d)
{
WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
}
else
{
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_VOICE));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_HOP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_VOICE));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_HOP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** TakeOps was given an invalid parameter");
return NULL;
}
d = Find(dest);
- if (!isnick(dest))
- {
- log(DEBUG,"TakeOps was given an invalid target nickname of %s",dest);
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
if (!d)
{
log(DEBUG,"TakeOps couldnt resolve the target nickname: %s",dest);
}
else
{
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_DEOP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** TakeHops was given an invalid parameter");
return NULL;
}
d = Find(dest);
- if (!isnick(dest))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
if (!d)
{
WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
}
else
{
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_DEHALFOP));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_OP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEHALFOP));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ /* Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves */
+ if ((user != d) && ((status < STATUS_OP) && (!is_uline(user->server))) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You are not a channel operator",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
{
userrec *d;
- if ((!user) || (!dest) || (!chan))
+ if ((!user) || (!dest) || (!chan) || (!*dest))
{
log(DEFAULT,"*** BUG *** TakeVoice was given an invalid parameter");
return NULL;
}
d = Find(dest);
- if (!isnick(dest))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
- return NULL;
- }
if (!d)
{
WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, dest);
}
else
{
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,d,chan,AC_DEVOICE));
-
- if (MOD_RESULT == ACR_DENY)
- return NULL;
- if (MOD_RESULT == ACR_DEFAULT)
+ if (user->server == d->server)
{
- if ((status < STATUS_HOP) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEVOICE));
+
+ if (MOD_RESULT == ACR_DENY)
return NULL;
+ if (MOD_RESULT == ACR_DEFAULT)
+ {
+ if ((status < STATUS_HOP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
+ {
+ WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, chan->name);
+ return NULL;
+ }
}
}
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;
}
char* ModeParser::AddBan(userrec *user,char *dest,chanrec *chan,int status)
{
- if ((!user) || (!dest) || (!chan)) {
+ BanItem b;
+ int toomanyexclamation = 0;
+ int toomanyat = 0;
+
+ if ((!user) || (!dest) || (!chan) || (!*dest))
+ {
log(DEFAULT,"*** BUG *** AddBan was given an invalid parameter");
return NULL;
}
- BanItem b;
- if ((!user) || (!dest) || (!chan))
- return NULL;
- unsigned int l = strlen(dest);
- if (strchr(dest,'!')==0)
- return NULL;
- if (strchr(dest,'@')==0)
- return NULL;
- for (unsigned int i = 0; i < l; i++)
- if (dest[i] < 32)
- return NULL;
- for (unsigned int i = 0; i < l; i++)
- if (dest[i] > 126)
+ for (char* i = dest; *i; i++)
+ {
+ if ((*i < 32) || (*i > 126))
+ {
return NULL;
- int c = 0;
- for (unsigned int i = 0; i < l; i++)
- if (dest[i] == '!')
- c++;
- if (c>1)
- return NULL;
- c = 0;
- for (unsigned int i = 0; i < l; i++)
- if (dest[i] == '@')
- c++;
- if (c>1)
+ }
+ else if (*i == '!')
+ {
+ toomanyexclamation++;
+ }
+ else if (*i == '@')
+ {
+ toomanyat++;
+ }
+ }
+
+ if (toomanyexclamation != 1 || toomanyat != 1)
+ /*
+ * this stops sillyness like n!u!u!u@h, though note that most
+ * ircds don't actually verify banmask validity. --w00t
+ */
return NULL;
long maxbans = GetMaxBans(chan->name);
log(DEBUG,"AddBan: %s %s",chan->name,user->nick);
int MOD_RESULT = 0;
- FOREACH_RESULT(OnAddBan(user,chan,dest));
+ FOREACH_RESULT(I_OnAddBan,OnAddBan(user,chan,dest));
if (MOD_RESULT)
return NULL;
}
b.set_time = TIME;
- strncpy(b.data,dest,MAXBUF);
- strncpy(b.set_by,user->nick,NICKMAX);
+ strlcpy(b.data,dest,MAXBUF);
+ if (*user->nick)
+ {
+ strlcpy(b.set_by,user->nick,NICKMAX-1);
+ }
+ else
+ {
+ strlcpy(b.set_by,Config->ServerName,NICKMAX-1);
+ }
chan->bans.push_back(b);
return dest;
}
char* ModeParser::TakeBan(userrec *user,char *dest,chanrec *chan,int status)
{
- if ((!user) || (!dest) || (!chan)) {
+ if ((!user) || (!dest) || (!chan) || (!*dest)) {
log(DEFAULT,"*** BUG *** TakeBan was given an invalid parameter");
return 0;
}
if (!strcasecmp(i->data,dest))
{
int MOD_RESULT = 0;
- FOREACH_RESULT(OnDelBan(user,chan,dest));
+ FOREACH_RESULT(I_OnDelBan,OnDelBan(user,chan,dest));
if (MOD_RESULT)
return NULL;
chan->bans.erase(i);
}
int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,NULL,chan,AC_GENERAL_MODE));
- if (MOD_RESULT == ACR_DENY)
- return;
+ if (IS_LOCAL(user))
+ {
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,NULL,chan,AC_GENERAL_MODE));
+ if (MOD_RESULT == ACR_DENY)
+ return;
+ }
log(DEBUG,"process_modes: start: parameters=%d",pcnt);
strlcpy(modelist,parameters[1],MAXBUF); /* mode list, e.g. +oo-o *
* parameters[2] onwards are parameters for
* modes that require them :) */
- strlcpy(outlist,"+",MAXBUF);
+ *outlist = '+';
+ *(outlist+1) = 0;
mdir = 1;
log(DEBUG,"process_modes: modelist: %s",modelist);
std::string tidied = this->CompressModes(modelist,true);
strlcpy(modelist,tidied.c_str(),MAXBUF);
- int len = strlen(modelist);
+ int len = tidied.length();
while (modelist[len-1] == ' ')
modelist[--len] = '\0';
- for (ptr = 0; ptr < len; ptr++)
+
+ for (char* modechar = modelist; *modechar; ptr++, modechar++)
{
r = NULL;
- {
- log(DEBUG,"process_modes: modechar: %c",modelist[ptr]);
+ /* If we have more than MAXMODES changes in one line,
+ * drop all after the MAXMODES
+ */
+ if (pc > MAXMODES-1)
+ break;
- char modechar = modelist[ptr];
- switch (modelist[ptr])
+ {
+ switch (*modechar)
{
case '-':
if (mdir != 0)
log(DEBUG,"Ops");
if ((param >= pcnt)) break;
log(DEBUG,"Enough parameters left");
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'o', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], true, 1));
if (!MOD_RESULT)
{
log(DEBUG,"calling GiveOps");
else
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'o', parameters[param], false, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], false, 1));
if (!MOD_RESULT)
{
log(DEBUG,"calling TakeOps");
case 'h':
if (((param >= pcnt)) || (!Config->AllowHalfop)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'h', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'h', parameters[param], true, 1));
if (!MOD_RESULT)
{
r = GiveHops(user,parameters[param++],chan,status);
else
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'h', parameters[param], false, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'h', parameters[param], false, 1));
if (!MOD_RESULT)
{
r = TakeHops(user,parameters[param++],chan,status);
case 'v':
if ((param >= pcnt)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'v', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'v', parameters[param], true, 1));
if (!MOD_RESULT)
{
r = GiveVoice(user,parameters[param++],chan,status);
else
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'v', parameters[param], false, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'v', parameters[param], false, 1));
if (!MOD_RESULT)
{
r = TakeVoice(user,parameters[param++],chan,status);
case 'b':
if ((param >= pcnt)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'b', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'b', parameters[param], true, 1));
if (!MOD_RESULT)
{
r = AddBan(user,parameters[param++],chan,status);
else
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'b', parameters[param], false, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'b', parameters[param], false, 1));
if (!MOD_RESULT)
{
r = TakeBan(user,parameters[param++],chan,status);
break;
previously_set_k = true;
- if (!strcmp(chan->key,""))
+ if (!*chan->key)
{
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'k', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'k', parameters[param], true, 1));
if (!MOD_RESULT)
{
strcat(outlist,"k");
char key[MAXBUF];
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'k', parameters[param], false, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'k', parameters[param], false, 1));
if (!MOD_RESULT)
{
strlcpy(key,parameters[param++],32);
break;
previously_unset_l = true;
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'l', "", false, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'l', "", false, 0));
if (!MOD_RESULT)
{
if (chan->limit)
break;
previously_set_l = true;
bool invalid = false;
- for (unsigned int i = 0; i < strlen(parameters[param]); i++)
+ for (char* f = parameters[param]; *f; f++)
{
- if ((parameters[param][i] < '0') || (parameters[param][i] > '9'))
+ if ((*f < '0') || (*f > '9'))
{
invalid = true;
}
}
- if (atoi(parameters[param]) < 1)
+ /* If the limit is < 1, or the new limit is the current limit, dont allow */
+ if ((atoi(parameters[param]) < 1) || ((chan->limit > 0) && (atoi(parameters[param]) == chan->limit)))
{
invalid = true;
}
break;
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'l', parameters[param], true, 1));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'l', parameters[param], true, 1));
if (!MOD_RESULT)
{
case 'i':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'i', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'i', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
case 't':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 't', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 't', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
}
else
{
- if (chan->binarymodes & CM_NOEXTERNAL) strlcat(outlist,"t",MAXBUF);
+ if (chan->binarymodes & CM_TOPICLOCK) strlcat(outlist,"t",MAXBUF);
chan->binarymodes &= ~CM_TOPICLOCK;
}
}
case 'n':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'n', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'n', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
case 'm':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'm', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'm', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
case 's':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 's', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 's', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
case 'p':
MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'p', "", mdir, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'p', "", mdir, 0));
if (!MOD_RESULT)
{
if (mdir)
break;
default:
- log(DEBUG,"Preprocessing custom mode %c: modelist: %s",modechar,chan->custom_modes);
+ log(DEBUG,"Preprocessing custom mode %c: modelist: %s",*modechar,chan->custom_modes);
string_list p;
p.clear();
- if (((!strchr(chan->custom_modes,modechar)) && (!mdir)) || ((strchr(chan->custom_modes,modechar)) && (mdir)))
+ if (((!strchr(chan->custom_modes,*modechar)) && (!mdir)) || ((strchr(chan->custom_modes,*modechar)) && (mdir)))
{
- if (!ModeIsListMode(modechar,MT_CHANNEL))
+ if (!ModeIsListMode(*modechar,MT_CHANNEL))
{
- log(DEBUG,"Mode %c isnt set on %s but trying to remove!",modechar,chan->name);
+ log(DEBUG,"Mode %c isnt set on %s but trying to remove!",*modechar,chan->name);
break;
}
}
- if (ModeDefined(modechar,MT_CHANNEL))
+ if (ModeDefined(*modechar,MT_CHANNEL))
{
log(DEBUG,"A module has claimed this mode");
if (param<pcnt)
{
- if ((ModeDefinedOn(modechar,MT_CHANNEL)>0) && (mdir))
+ if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
{
p.push_back(parameters[param]);
}
- if ((ModeDefinedOff(modechar,MT_CHANNEL)>0) && (!mdir))
+ if ((ModeDefinedOff(*modechar,MT_CHANNEL)>0) && (!mdir))
{
p.push_back(parameters[param]);
}
if (param>=pcnt)
{
// we're supposed to have a parameter, but none was given... so dont handle the mode.
- if (((ModeDefinedOn(modechar,MT_CHANNEL)>0) && (mdir)) || ((ModeDefinedOff(modechar,MT_CHANNEL)>0) && (!mdir)))
+ if (((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir)) || ((ModeDefinedOff(*modechar,MT_CHANNEL)>0) && (!mdir)))
{
- log(DEBUG,"Not enough parameters for module-mode %c",modechar);
+ log(DEBUG,"Not enough parameters for module-mode %c",*modechar);
handled = true;
param++;
}
std::string para = "";
if (p.size())
para = p[0];
- FOREACH_RESULT(OnRawMode(user, chan, modechar, para, mdir, pcnt));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, *modechar, para, mdir, pcnt));
if (!MOD_RESULT)
{
for (int i = 0; i <= MODCOUNT; i++)
{
if (!handled)
{
- int t = modules[i]->OnExtendedMode(user,chan,modechar,MT_CHANNEL,mdir,p);
+ int t = modules[i]->OnExtendedMode(user,chan,*modechar,MT_CHANNEL,mdir,p);
if (t != 0)
{
log(DEBUG,"OnExtendedMode returned nonzero for a module");
- char app[] = {modechar, 0};
- if (ModeIsListMode(modechar,MT_CHANNEL))
+ char app[] = {*modechar, 0};
+ if (ModeIsListMode(*modechar,MT_CHANNEL))
{
if (t == -1)
{
{
strlcat(outlist, app,MAXBUF);
}
- else if (!strchr(outlist,modechar))
+ else if (!strchr(outlist,*modechar))
{
strlcat(outlist, app,MAXBUF);
}
}
- chan->SetCustomMode(modechar,mdir);
+ chan->SetCustomMode(*modechar,mdir);
// include parameters in output if mode has them
- if ((ModeDefinedOn(modechar,MT_CHANNEL)>0) && (mdir))
+ if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
{
chan->SetCustomModeParam(modelist[ptr],parameters[param],mdir);
strlcpy(outpars[pc++],parameters[param++],MAXBUF);
}
else
{
- WriteServ(user->fd,"472 %s %c :is unknown mode char to me",user->nick,modechar);
+ WriteServ(user->fd,"472 %s %c :is unknown mode char to me",user->nick,*modechar);
}
break;
{
log(DEBUG,"Local mode change");
WriteChannelLocal(chan, user, "MODE %s %s",chan->name,outstr);
- FOREACH_MOD OnMode(user, chan, TYPE_CHANNEL, outstr);
+ FOREACH_MOD(I_OnMode,OnMode(user, chan, TYPE_CHANNEL, outstr));
}
else
{
if (!silent)
{
WriteChannel(chan,user,"MODE %s %s",chan->name,outstr);
- FOREACH_MOD OnMode(user, chan, TYPE_CHANNEL, outstr);
+ FOREACH_MOD(I_OnMode,OnMode(user, chan, TYPE_CHANNEL, outstr));
}
}
}
if (!source)
{
s2 = new userrec;
- strlcpy(s2->nick,Config->ServerName,NICKMAX);
+ strlcpy(s2->nick,Config->ServerName,NICKMAX-1);
strlcpy(s2->modes,"o",52);
s2->fd = -1;
source = s2;
outpars[r] = parameters[1][i];
if (parameters[1][i] == 'o')
{
- FOREACH_MOD OnGlobalOper(dest);
+ FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
}
}
}
strlcpy(dmodes,temp,52);
if (umode == 'o')
+ {
+ *dest->oper = 0;
DeleteOper(dest);
+ }
}
}
}
if (strcmp(b,""))
{
WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
- FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
+ FOREACH_MOD(I_OnMode,OnMode(user, dest, TYPE_USER, b));
}
if (strlen(dmodes)>MAXMODES)
if (pcnt == 1)
{
/* just /modes #channel */
- WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr));
+ WriteServ(user->fd,"324 %s %s +%s",user->nick, Ptr->name, chanmodes(Ptr,has_channel(user,Ptr)));
WriteServ(user->fd,"329 %s %s %d", user->nick, Ptr->name, Ptr->created);
return;
}
if (*mode == '+')
mode++;
int MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, Ptr, *mode, "", false, 0));
+ FOREACH_RESULT(I_OnRawMode,OnRawMode(user, Ptr, *mode, "", false, 0));
if (!MOD_RESULT)
{
if (*mode == 'b')
{
// list of items for an extmode
log(DEBUG,"Calling OnSendList for all modules, list output for mode %c",*mode);
- FOREACH_MOD OnSendList(user,Ptr,*mode);
+ FOREACH_MOD(I_OnSendList,OnSendList(user,Ptr,*mode));
return;
}
}
}
- if (((Ptr) && (!has_channel(user,Ptr))) && (!is_uline(user->server)))
+ if (((Ptr) && (!has_channel(user,Ptr))) && (!is_uline(user->server)) && (IS_LOCAL(user)))
{
WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
return;
if (Ptr)
{
int MOD_RESULT = 0;
- FOREACH_RESULT(OnAccessCheck(user,NULL,Ptr,AC_GENERAL_MODE));
+ FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,NULL,Ptr,AC_GENERAL_MODE));
if (MOD_RESULT == ACR_DENY)
return;
if (MOD_RESULT == ACR_DEFAULT)
{
- if (cstatus(user,Ptr) < STATUS_HOP)
+ if ((cstatus(user,Ptr) < STATUS_HOP) && (IS_LOCAL(user)))
{
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;
if (strcmp(b,""))
{
WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
- FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
+ FOREACH_MOD(I_OnMode,OnMode(user, dest, TYPE_USER, b));
}
if (strlen(dmodes)>MAXMODES)