}
else
{
-
- 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 (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;
}
}
else
{
- 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 (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;
}
}
else
{
- 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 (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;
}
}
else
{
- 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 (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;
}
}
else
{
- 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)
+ if (user->server == d->server)
{
- /* Tweak by Brain suggested by w00t, allow a halfop to dehalfop themselves */
- if ((user != d) && ((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;
}
}
else
{
- 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 (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;
}
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-1);
+ }
+ else
+ {
+ strlcpy(b.set_by,Config->ServerName,NICKMAX-1);
+ }
chan->bans.push_back(b);
return dest;
}
}
int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnAccessCheck,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);
{
r = NULL;
+ /* If we have more than MAXMODES changes in one line,
+ * drop all after the MAXMODES
+ */
+ if (pc > MAXMODES-1)
+ break;
+
{
switch (*modechar)
{
log(DEBUG,"Ops");
if ((param >= pcnt)) break;
log(DEBUG,"Enough parameters left");
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
case 'h':
if (((param >= pcnt)) || (!Config->AllowHalfop)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
case 'v':
if ((param >= pcnt)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
case 'b':
if ((param >= pcnt)) break;
+ r = NULL;
if (mdir == 1)
{
MOD_RESULT = 0;
}
else
{
- if (chan->binarymodes & CM_NOEXTERNAL) strlcat(outlist,"t",MAXBUF);
+ if (chan->binarymodes & CM_TOPICLOCK) strlcat(outlist,"t",MAXBUF);
chan->binarymodes &= ~CM_TOPICLOCK;
}
}
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;
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 (((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;
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;