X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_chanprotect.cpp;h=e24e64a3e90451756dce75f8447c46b7944580ff;hb=8cebe2878f3878afce6f643d93668155cb26801d;hp=a88f5de384a71cbad4f24a2160a666c507918961;hpb=adfcfa9dfdedaa44d898618814e2bc689e06a1e8;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index a88f5de38..e24e64a3e 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -12,6 +12,7 @@ */ #include "inspircd.h" +#include "m_override.h" /* $ModDesc: Provides channel modes +a and +q */ @@ -31,10 +32,9 @@ class FounderProtectBase protected: bool& remove_own_privs; bool& remove_other_privs; - bool& add_other_privs; public: - FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e, bool &remove_own, bool &remove_others, bool &add_others) : - MyInstance(Instance), extend(ext), type(mtype), list(l), end(e), remove_own_privs(remove_own), remove_other_privs(remove_others), add_other_privs(add_others) + FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e, bool &remove_own, bool &remove_others) : + MyInstance(Instance), extend(ext), type(mtype), list(l), end(e), remove_own_privs(remove_own), remove_other_privs(remove_others) { } @@ -88,11 +88,9 @@ class FounderProtectBase while (modestack.GetStackedLine(stackresult)) { - for (size_t j = 0; j < stackresult.size(); j++) - { - mode_junk.push_back(stackresult[j]); - } + mode_junk.insert(mode_junk.end(), stackresult.begin(), stackresult.end()); MyInstance->SendMode(mode_junk, MyInstance->FakeClient); + mode_junk.erase(mode_junk.begin() + 1, mode_junk.end()); } } @@ -127,12 +125,6 @@ class FounderProtectBase return (remove_other_privs && u1->GetExt(item) && u2->GetExt(item)); } - bool CanAddOthers(User* u1, User* u2, Channel* c) - { - std::string item = extend+std::string(c->name); - return (add_other_privs && u1->GetExt(item)); - } - ModeAction HandleChange(User* source, User* theuser, bool adding, Channel* channel, std::string ¶meter) { std::string item = extend+std::string(channel->name); @@ -164,9 +156,9 @@ class FounderProtectBase class ChanFounder : public ModeHandler, public FounderProtectBase { public: - ChanFounder(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others, bool &priv_others) - : ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0), - FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self, depriv_others, priv_others) { } + ChanFounder(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others) + : ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0, TR_NICK), + FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self, depriv_others) { } unsigned int GetPrefixRank() { @@ -200,27 +192,33 @@ class ChanFounder : public ModeHandler, public FounderProtectBase { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } + + char isoverride=0; + Module *Override = ServerInstance->Modules->FindFeature("Override"); + if (Override) + { + OVRrequest ovr(NULL,Override,source,"OTHERMODE"); + const char * tmp = ovr.Send(); + isoverride = tmp[0]; + } // source is a server, or ulined, we'll let them +-q the user. if (source == ServerInstance->FakeClient || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick.c_str())) || (ServerInstance->ULine(source->server)) || (!*source->server) || - (!IS_LOCAL(source))) + (!IS_LOCAL(source)) || + isoverride) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } - - // If they have it, allow them to give it. - if (adding && FounderProtectBase::CanAddOthers(source, theuser, channel)) + else { - return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); + // whoops, someones being naughty! + source->WriteNumeric(468, "%s %s :Only servers may set channel mode +q", source->nick.c_str(), channel->name.c_str()); + parameter.clear(); + return MODEACTION_DENY; } - - // whoops, someones being naughty! - source->WriteNumeric(468, "%s %s :You are not permitted to set additional founders", source->nick.c_str(), channel->name.c_str()); - parameter.clear(); - return MODEACTION_DENY; } void DisplayList(User* user, Channel* channel) @@ -234,9 +232,9 @@ class ChanFounder : public ModeHandler, public FounderProtectBase class ChanProtect : public ModeHandler, public FounderProtectBase { public: - ChanProtect(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others, bool &priv_others) - : ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0), - FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self, depriv_others, priv_others) { } + ChanProtect(InspIRCd* Instance, char my_prefix, bool &depriv_self, bool &depriv_others) + : ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, my_prefix, 0, TR_NICK), + FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self, depriv_others) { } unsigned int GetPrefixRank() { @@ -266,11 +264,19 @@ class ChanProtect : public ModeHandler, public FounderProtectBase std::string founder = "cm_founder_"+std::string(channel->name); - if (!adding && FounderProtectBase::CanRemoveOthers(source, theuser, channel)) + if ((!adding) && FounderProtectBase::CanRemoveOthers(source, theuser, channel)) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } + char isoverride=0; + Module *Override = ServerInstance->Modules->FindFeature("Override"); + if (Override) + { + OVRrequest ovr(NULL,Override,source,"OTHERMODE"); + const char * tmp = ovr.Send(); + isoverride = tmp[0]; + } // source has +q, is a server, or ulined, we'll let them +-a the user. if (source == ServerInstance->FakeClient || ((source == theuser) && (!adding) && (FounderProtectBase::remove_own_privs)) || @@ -278,20 +284,18 @@ class ChanProtect : public ModeHandler, public FounderProtectBase (ServerInstance->ULine(source->server)) || (!*source->server) || (source->GetExt(founder)) || - (!IS_LOCAL(source))) + (!IS_LOCAL(source)) || + isoverride + ) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } - - // If they have it, allow them to give it. - if (adding && FounderProtectBase::CanAddOthers(source, theuser, channel)) + else { - return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); + // bzzzt, wrong answer! + source->WriteNumeric(482, "%s %s :You are not a channel founder", source->nick.c_str(), channel->name.c_str()); + return MODEACTION_DENY; } - - // bzzzt, wrong answer! - source->WriteNumeric(482, "%s %s :You are not a channel founder", source->nick.c_str(), channel->name.c_str()); - return MODEACTION_DENY; } virtual void DisplayList(User* user, Channel* channel) @@ -309,7 +313,6 @@ class ModuleChanProtect : public Module char APrefix; bool DeprivSelf; bool DeprivOthers; - bool PrivOthers; bool booting; ChanProtect* cp; ChanFounder* cf; @@ -325,8 +328,8 @@ class ModuleChanProtect : public Module /* Initialise module variables */ - cp = new ChanProtect(ServerInstance, APrefix, DeprivSelf, DeprivOthers, PrivOthers); - cf = new ChanFounder(ServerInstance, QPrefix, DeprivSelf, DeprivOthers, PrivOthers); + cp = new ChanProtect(ServerInstance, APrefix, DeprivSelf, DeprivOthers); + cf = new ChanFounder(ServerInstance, QPrefix, DeprivSelf, DeprivOthers); if (!ServerInstance->Modes->AddMode(cp) || !ServerInstance->Modes->AddMode(cf)) { @@ -335,8 +338,8 @@ class ModuleChanProtect : public Module throw ModuleException("Could not add new modes!"); } - Implementation eventlist[] = { I_OnUserKick, I_OnUserPart, I_OnUserPreJoin, I_OnPostJoin, I_OnAccessCheck }; - ServerInstance->Modules->Attach(eventlist, this, 5); + Implementation eventlist[] = { I_OnUserKick, I_OnUserPart, I_OnUserPreJoin, I_OnAccessCheck }; + ServerInstance->Modules->Attach(eventlist, this, 4); } virtual void OnUserKick(User* source, User* user, Channel* chan, const std::string &reason, bool &silent) @@ -355,19 +358,14 @@ class ModuleChanProtect : public Module void LoadSettings() { - /* Create a configreader class and read our flag, - * in old versions this was heap-allocated and the - * object was kept between rehashes...now we just - * stack-allocate it locally. - */ ConfigReader Conf(ServerInstance); - FirstInGetsFounder = Conf.ReadFlag("options", "noservices", 0); + FirstInGetsFounder = Conf.ReadFlag("chanprotect", "noservices", 0); - std::string qpre = Conf.ReadValue("options", "qprefix", 0); + std::string qpre = Conf.ReadValue("chanprotect", "qprefix", 0); QPrefix = qpre.empty() ? 0 : qpre[0]; - std::string apre = Conf.ReadValue("options", "aprefix", 0); + std::string apre = Conf.ReadValue("chanprotect", "aprefix", 0); APrefix = apre.empty() ? 0 : apre[0]; if ((APrefix && QPrefix) && APrefix == QPrefix) @@ -379,9 +377,8 @@ class ModuleChanProtect : public Module if (cf && ServerInstance->Modes->FindPrefix(QPrefix) == cf) throw ModuleException("Looks like the +q prefix you picked for m_chanprotect is already in use. Pick another."); - DeprivSelf = Conf.ReadFlag("options","deprotectself", "yes", 0); - DeprivOthers = Conf.ReadFlag("options","deprotectothers", "yes", 0); - DeprivOthers = Conf.ReadFlag("options","setprivsonothers", "yes", 0); + DeprivSelf = Conf.ReadFlag("chanprotect","deprotectself", "yes", 0); + DeprivOthers = Conf.ReadFlag("chanprotect","deprotectothers", "yes", 0); } virtual int OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs, const std::string &keygiven) @@ -395,20 +392,6 @@ class ModuleChanProtect : public Module return 0; } - virtual void OnPostJoin(User *user, Channel *channel) - { - // This *must* be in PostJoin, not UserJoin - the former will make it appear to happen - // before the client is in the channel - - // This notice was here originally because it was all done prior to the creation of - // privs in OnUserPreJoin. I've left it because it might still be wanted, but i'm - // not sure it really should be here - ops don't get shown, obviously, and the prefix - // will appear in the names list for the user.. remove if desired -Special - - if (FirstInGetsFounder && channel->GetUserCounter() == 1) - user->WriteServ("MODE %s +q %s", channel->name.c_str(), user->nick.c_str()); - } - virtual int OnAccessCheck(User* source,User* dest,Channel* channel,int access_type) { // here we perform access checks, this is the important bit that actually stops kicking/deopping