X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_override.cpp;h=ce996d5b23b29bc5db1d954f01ed382d05b0c261;hb=1383dba43e463f292aea094d01f62f355946049d;hp=0ce4b37bc4880ac9fccd01c4177175e490813bed;hpb=9fc9227cf51585dd2e44c2fcd0014c8da8f8739f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp index 0ce4b37bc..ce996d5b2 100644 --- a/src/modules/m_override.cpp +++ b/src/modules/m_override.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. * E-mail: * * @@ -14,15 +14,16 @@ * --------------------------------------------------- */ +using namespace std; + #include #include "users.h" #include "channels.h" #include "modules.h" +#include "helperfuncs.h" /* $ModDesc: Provides support for unreal-style oper-override */ -char dummyvalue[] = "on"; - class ModuleOverride : public Module { Server *Srv; @@ -31,20 +32,21 @@ class ModuleOverride : public Module public: - ModuleOverride() + ModuleOverride(Server* Me) + : Module::Module(Me) { // here we initialise our module. Use new to create new instances of the required // classes. - Srv = new Server; + Srv = Me; Conf = new ConfigReader; // read our config options (main config file) NoisyOverride = Conf->ReadFlag("override","noisy",0); } - virtual void OnRehash() + virtual void OnRehash(std::string parameter) { // on a rehash we delete our classes for good measure and create them again. delete Conf; @@ -53,10 +55,32 @@ class ModuleOverride : public Module NoisyOverride = Conf->ReadFlag("override","noisy",0); } + void Implements(char* List) + { + List[I_OnRehash] = List[I_OnAccessCheck] = List[I_On005Numeric] = List[I_OnUserPreJoin] = 1; + } + virtual void On005Numeric(std::string &output) { output = output + std::string(" OVERRIDE"); } + + virtual bool CanOverride(userrec* source, char* token) + { + // checks to see if the oper's type has + for (int j =0; j < Conf->Enumerate("type"); j++) + { + std::string typen = Conf->ReadValue("type","name",j); + if (!strcmp(typen.c_str(),source->oper)) + { + // its defined, return its value as a boolean for if the token is set + std::string tokenlist = Conf->ReadValue("type","override",j); + return strstr(tokenlist.c_str(),token); + } + } + // its not defined at all, count as false + return false; + } virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) { @@ -71,30 +95,72 @@ class ModuleOverride : public Module switch (access_type) { case AC_KICK: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"KICK")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_DEOP: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEOP")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_OP: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEDEOP")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_VOICE: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Voiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEVOICE")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Voiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_DEVOICE: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Devoiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEDEVOICE")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Devoiced "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_HALFOP: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Halfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEHALFOP")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Halfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; case AC_DEHALFOP: - Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Dehalfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + if (CanOverride(source,"MODEDEHALFOP")) + { + Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Dehalfopped "+std::string(dest->nick)+" on "+std::string(channel->name)); + return ACR_ALLOW; + } + else return ACR_DEFAULT; break; } } } - return ACR_ALLOW; + if (CanOverride(source,"OTHERMODE")) + { + return ACR_ALLOW; + } + else + { + return ACR_DEFAULT; + } } return ACR_DEFAULT; @@ -106,18 +172,39 @@ class ModuleOverride : public Module { if (chan) { - if ((chan->inviteonly) || (chan->key[0]) || (chan->limit >= Srv->CountUsers(chan))) + if ((chan->binarymodes & CM_INVITEONLY) && (CanOverride(user,"INVITE"))) { if (NoisyOverride) { - if (!user->IsInvited(chan->name)) + irc::string x = chan->name; + if (!user->IsInvited(x)) { - WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,user,"NOTICE %s :%s invited himself into the channel",cname,user->nick); + WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s invited himself into the channel",cname,user->nick); } } - Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +i, +k or +l on "+std::string(cname)); + Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +i on "+std::string(cname)); + return -1; + } + if ((chan->key[0]) && (CanOverride(user,"KEY"))) + { + if (NoisyOverride) + WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s bypassed the channel key",cname,user->nick); + Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +k on "+std::string(cname)); + return -1; + } + if ((chan->limit >= Srv->CountUsers(chan)) && (CanOverride(user,"LIMIT"))) + { + if (NoisyOverride) + WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s passed through your channel limit",cname,user->nick); + Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +l on "+std::string(cname)); + return -1; + } + + if (CanOverride(user,"BANWALK")) + { + // other join + return -1; } - return -1; } } return 0; @@ -126,12 +213,11 @@ class ModuleOverride : public Module virtual ~ModuleOverride() { delete Conf; - delete Srv; } virtual Version GetVersion() { - return Version(1,0,0,0,0); + return Version(1,0,0,1,VF_VENDOR); } }; @@ -147,9 +233,9 @@ class ModuleOverrideFactory : public ModuleFactory { } - virtual Module * CreateModule() + virtual Module * CreateModule(Server* Me) { - return new ModuleOverride; + return new ModuleOverride(Me); } };