X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_redirect.cpp;h=89097ade4cc07b318cea5722f90e4dc076dbb1d4;hb=e950f568d0f571e9475aa38177486468714de4d3;hp=000d53a2e21055d5aa57a57dbc5bb91ebf9e242e;hpb=d9d99cd02dadf34bfcc220734ba0c422f0acb3e6;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_redirect.cpp b/src/modules/m_redirect.cpp index 000d53a2e..89097ade4 100644 --- a/src/modules/m_redirect.cpp +++ b/src/modules/m_redirect.cpp @@ -24,8 +24,6 @@ #include "inspircd.h" -/* $ModDesc: Provides channel mode +L (limit redirection) and usermode +L (no forced redirection) */ - /** Handle channel mode +L */ class Redirect : public ModeHandler @@ -64,20 +62,18 @@ class Redirect : public ModeHandler } } - if (channel->GetModeParameter('L') == parameter) + if (channel->GetModeParameter(this) == parameter) return MODEACTION_DENY; /* * We used to do some checking for circular +L here, but there is no real need for this any more especially as we * now catch +L looping in PreJoin. Remove it, since O(n) logic makes me sad, and we catch it anyway. :) -- w00t */ - channel->SetModeParam('L', parameter); return MODEACTION_ALLOW; } else { - if (channel->IsModeSet('L')) + if (channel->IsModeSet(this)) { - channel->SetModeParam('L', ""); return MODEACTION_ALLOW; } } @@ -97,15 +93,16 @@ class AntiRedirect : public SimpleUserModeHandler class ModuleRedirect : public Module { - Redirect re; AntiRedirect re_u; + ChanModeReference limitmode; bool UseUsermode; public: - ModuleRedirect() - : re(this), re_u(this) + : re(this) + , re_u(this) + , limitmode(this, "limit") { } @@ -121,36 +118,33 @@ class ModuleRedirect : public Module if (UseUsermode) { /* Log noting that this breaks compatability. */ - ServerInstance->Logs->Log("m_redirect", LOG_DEFAULT, "REDIRECT: Enabled usermode +L. This breaks linking with servers that do not have this enabled. This is disabled by default in the 2.0 branch but will be enabled in the next version."); + ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "REDIRECT: Enabled usermode +L. This breaks linking with servers that do not have this enabled. This is disabled by default in the 2.0 branch but will be enabled in the next version."); /* Try to add the usermode */ ServerInstance->Modules->AddService(re_u); } - - Implementation eventlist[] = { I_OnUserPreJoin }; - ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE { if (chan) { - if (chan->IsModeSet('L') && chan->IsModeSet('l')) + if (chan->IsModeSet(re) && chan->IsModeSet(limitmode)) { - if (chan->GetUserCounter() >= ConvToInt(chan->GetModeParameter('l'))) + if (chan->GetUserCounter() >= ConvToInt(chan->GetModeParameter(limitmode))) { - std::string channel = chan->GetModeParameter('L'); + std::string channel = chan->GetModeParameter(&re); /* sometimes broken ulines can make circular or chained +L, avoid this */ Channel* destchan = ServerInstance->FindChan(channel); - if (destchan && destchan->IsModeSet('L')) + if (destchan && destchan->IsModeSet(re)) { user->WriteNumeric(470, "%s %s * :You may not join this channel. A redirect is set, but you may not be redirected as it is a circular loop.", user->nick.c_str(), cname.c_str()); return MOD_RES_DENY; } /* We check the bool value here to make sure we have it enabled, if we don't then usermode +L might be assigned to something else. */ - if (UseUsermode && user->IsModeSet('L')) + if (UseUsermode && user->IsModeSet(re_u)) { user->WriteNumeric(470, "%s %s %s :Force redirection stopped.", user->nick.c_str(), cname.c_str(), channel.c_str()); return MOD_RES_DENY;