X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_nickflood.cpp;h=7f67b8d08f9ffc6a5cbc69bb62b39542782fa860;hb=95c1fb9bdd5f93cf4f8306a7b8ae9ca098aade1a;hp=17f3a35f09d01b0ed94fc2cc24d9729e2765b185;hpb=86775e2e98f55b3b88befe2daff0ca23f02f3155;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_nickflood.cpp b/src/modules/m_nickflood.cpp index 17f3a35f0..7f67b8d08 100644 --- a/src/modules/m_nickflood.cpp +++ b/src/modules/m_nickflood.cpp @@ -19,8 +19,6 @@ */ class nickfloodsettings : public classbase { - private: - InspIRCd* ServerInstance; public: int secs; int nicks; @@ -29,9 +27,9 @@ class nickfloodsettings : public classbase int counter; bool locked; - nickfloodsettings(InspIRCd *Instance, int b, int c) : ServerInstance(Instance), secs(b), nicks(c) + nickfloodsettings(int b, int c) : secs(b), nicks(c) { - reset = Instance->Time() + secs; + reset = ServerInstance->Time() + secs; counter = 0; locked = false; }; @@ -90,12 +88,14 @@ class nickfloodsettings : public classbase class NickFlood : public ModeHandler { public: - NickFlood(InspIRCd* Instance, Module* Creator) : ModeHandler(Instance, Creator, 'F', 1, 0, false, MODETYPE_CHANNEL, false) { } + SimpleExtItem ext; + NickFlood(Module* Creator) : ModeHandler(Creator, "nickflood", 'F', PARAM_SETONLY, MODETYPE_CHANNEL), + ext("nickflood", Creator) { } ModePair ModeSet(User* source, User* dest, Channel* channel, const std::string ¶meter) { - nickfloodsettings* x; - if (channel->GetExt("nickflood",x)) + nickfloodsettings* x = ext.get(channel); + if (x) return std::make_pair(true, ConvToStr(x->nicks)+":"+ConvToStr(x->secs)); else return std::make_pair(false, parameter); @@ -103,8 +103,7 @@ class NickFlood : public ModeHandler ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) { - nickfloodsettings* dummy; - + nickfloodsettings *f = ext.get(channel); if (adding) { char ndata[MAXBUF]; @@ -124,7 +123,6 @@ class NickFlood : public ModeHandler else data++; } if (secs) - { /* Set up the flood parameters for this channel */ int nnicks = atoi(nicks); @@ -137,11 +135,11 @@ class NickFlood : public ModeHandler } else { - if (!channel->GetExt("nickflood", dummy)) + if (!f) { parameter = ConvToStr(nnicks) + ":" +ConvToStr(nsecs); - nickfloodsettings *f = new nickfloodsettings(ServerInstance, nsecs, nnicks); - channel->Extend("nickflood", f); + f = new nickfloodsettings(nsecs, nnicks); + ext.set(channel, f); channel->SetModeParam('F', parameter); return MODEACTION_ALLOW; } @@ -159,12 +157,8 @@ class NickFlood : public ModeHandler // new mode param, replace old with new if ((nsecs > 0) && (nnicks > 0)) { - nickfloodsettings* f; - channel->GetExt("nickflood", f); - delete f; - f = new nickfloodsettings(ServerInstance, nsecs, nnicks); - channel->Shrink("nickflood"); - channel->Extend("nickflood", f); + f = new nickfloodsettings(nsecs, nnicks); + ext.set(channel, f); channel->SetModeParam('F', parameter); return MODEACTION_ALLOW; } @@ -184,12 +178,9 @@ class NickFlood : public ModeHandler } else { - if (channel->GetExt("nickflood", dummy)) + if (f) { - nickfloodsettings *f; - channel->GetExt("nickflood", f); - delete f; - channel->Shrink("nickflood"); + ext.unset(channel); channel->SetModeParam('F', ""); return MODEACTION_ALLOW; } @@ -200,32 +191,35 @@ class NickFlood : public ModeHandler class ModuleNickFlood : public Module { - NickFlood jf; + NickFlood nf; public: - ModuleNickFlood(InspIRCd* Me) - : Module(Me), jf(Me, this) + ModuleNickFlood() + : nf(this) { - if (!ServerInstance->Modes->AddMode(&jf)) + if (!ServerInstance->Modes->AddMode(&nf)) throw ModuleException("Could not add new modes!"); - Implementation eventlist[] = { I_OnChannelDelete, I_OnUserPreNick, I_OnUserPostNick }; - ServerInstance->Modules->Attach(eventlist, this, 3); + ServerInstance->Extensions.Register(&nf.ext); + Implementation eventlist[] = { I_OnUserPreNick, I_OnUserPostNick }; + ServerInstance->Modules->Attach(eventlist, this, 2); } - virtual ModResult OnUserPreNick(User* user, const std::string &newnick) + ModResult OnUserPreNick(User* user, const std::string &newnick) { if (isdigit(newnick[0])) /* allow switches to UID */ return MOD_RES_PASSTHRU; for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++) { - Channel *channel = i->first; + Channel *channel = *i; + ModResult res; - nickfloodsettings *f; - if (channel->GetExt("nickflood", f)) + nickfloodsettings *f = nf.ext.get(channel); + if (f) { - if (CHANOPS_EXEMPT(ServerInstance, 'F') && channel->GetStatus(user) == STATUS_OP) + FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,channel,"nickflood")); + if (res == MOD_RES_ALLOW) continue; if (f->islocked()) @@ -238,7 +232,7 @@ class ModuleNickFlood : public Module { f->clear(); f->lock(); - channel->WriteChannelWithServ((char*)ServerInstance->Config->ServerName, "NOTICE %s :No nick changes are allowed for 60 seconds because there have been more than %d nick changes in %d seconds.", channel->name.c_str(), f->nicks, f->secs); + channel->WriteChannelWithServ((char*)ServerInstance->Config->ServerName.c_str(), "NOTICE %s :No nick changes are allowed for 60 seconds because there have been more than %d nick changes in %d seconds.", channel->name.c_str(), f->nicks, f->secs); return MOD_RES_DENY; } } @@ -250,19 +244,21 @@ class ModuleNickFlood : public Module /* * XXX: HACK: We do the increment on the *POST* event here (instead of all together) because we have no way of knowing whether other modules would block a nickchange. */ - virtual void OnUserPostNick(User* user, const std::string &oldnick) + void OnUserPostNick(User* user, const std::string &oldnick) { if (isdigit(user->nick[0])) /* allow switches to UID */ return; for (UCListIter i = user->chans.begin(); i != user->chans.end(); ++i) { - Channel *channel = i->first; + Channel *channel = *i; + ModResult res; - nickfloodsettings *f; - if (channel->GetExt("nickflood", f)) + nickfloodsettings *f = nf.ext.get(channel); + if (f) { - if (CHANOPS_EXEMPT(ServerInstance, 'F') && channel->GetStatus(user) == STATUS_OP) + FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,channel,"nickflood")); + if (res == MOD_RES_ALLOW) return; /* moved this here to avoid incrementing the counter for nick @@ -275,25 +271,13 @@ class ModuleNickFlood : public Module return; } - void OnChannelDelete(Channel* chan) - { - nickfloodsettings *f; - if (chan->GetExt("nickflood",f)) - { - delete f; - chan->Shrink("nickflood"); - } - } - - - virtual ~ModuleNickFlood() + ~ModuleNickFlood() { - ServerInstance->Modes->DelMode(&jf); } - virtual Version GetVersion() + Version GetVersion() { - return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION); + return Version("Channel mode F - nick flood protection", VF_COMMON | VF_VENDOR); } };