X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=40ef66f0db76e75bb9a146cf0b5a3e3e0363aeec;hb=59b1a8955142935b02af6446005ab47fc7c3fc8c;hp=16d7322ecaf289716dd7d8b46eafd5ceea36ec3c;hpb=767e3b73bac9495644e45d5941e7f39427b2667d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 16d7322ec..40ef66f0d 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -72,19 +72,21 @@ char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -94,13 +96,13 @@ char* ModeParser::GiveOps(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -128,17 +130,20 @@ char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -153,6 +158,7 @@ char* ModeParser::GiveHops(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -179,17 +185,20 @@ char* ModeParser::GiveVoice(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -204,6 +213,7 @@ char* ModeParser::GiveVoice(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -231,17 +241,20 @@ char* ModeParser::TakeOps(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -256,6 +269,7 @@ char* ModeParser::TakeOps(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -283,18 +297,21 @@ char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -309,6 +326,7 @@ char* ModeParser::TakeHops(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -335,17 +353,20 @@ char* ModeParser::TakeVoice(userrec *user,char *dest,chanrec *chan,int status) } 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; + } } } @@ -360,6 +381,7 @@ char* ModeParser::TakeVoice(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -429,7 +451,14 @@ char* ModeParser::AddBan(userrec *user,char *dest,chanrec *chan,int status) 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; } @@ -530,10 +559,13 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int } 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); @@ -557,6 +589,12 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int { r = NULL; + /* If we have more than MAXMODES changes in one line, + * drop all after the MAXMODES + */ + if (pc > MAXMODES-1) + break; + { switch (*modechar) { @@ -597,6 +635,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int log(DEBUG,"Ops"); if ((param >= pcnt)) break; log(DEBUG,"Enough parameters left"); + r = NULL; if (mdir == 1) { MOD_RESULT = 0; @@ -628,6 +667,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int case 'h': if (((param >= pcnt)) || (!Config->AllowHalfop)) break; + r = NULL; if (mdir == 1) { MOD_RESULT = 0; @@ -658,6 +698,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int case 'v': if ((param >= pcnt)) break; + r = NULL; if (mdir == 1) { MOD_RESULT = 0; @@ -687,6 +728,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int case 'b': if ((param >= pcnt)) break; + r = NULL; if (mdir == 1) { MOD_RESULT = 0; @@ -864,7 +906,7 @@ void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int } else { - if (chan->binarymodes & CM_NOEXTERNAL) strlcat(outlist,"t",MAXBUF); + if (chan->binarymodes & CM_TOPICLOCK) strlcat(outlist,"t",MAXBUF); chan->binarymodes &= ~CM_TOPICLOCK; } } @@ -1173,7 +1215,7 @@ bool ModeParser::ProcessModuleUmode(char umode, userrec* source, void* dest, boo 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; @@ -1436,7 +1478,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)); + 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; } @@ -1470,7 +1512,7 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user) } } - 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; @@ -1485,7 +1527,7 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user) 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;