diff options
-rw-r--r-- | docs/inspircd.conf.example | 11 | ||||
-rw-r--r-- | src/modules/m_chanprotect.cpp | 29 |
2 files changed, 26 insertions, 14 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index 30635a773..6d86344c0 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -586,6 +586,12 @@ # used in unreal. This is only useful on networks # # running the m_chanprotect module # # # +# deprotectself - If this value is set to yes, true, or 1, then any # +# user with +q or +a may remove the +q or +a from # +# themselves. The default setting is to not enable # +# this feature, which stops even the founder taking # +# away their founder status without using services. # +# # # cyclehosts - If this is set to true, yes or 1, then when a # # user's hostname changes, they will appear to quit # # and then rejoin with their new host. This prevents # @@ -700,8 +706,9 @@ loglevel="default" netbuffersize="10240" maxwho="128" - noservices="0" - qaprefixes="0" + noservices="no" + qaprefixes="no" + deprotectself="no" somaxconn="128" softlimit="12800" userstats="Pu" diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index 060f81eb9..d46d28faa 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -44,8 +44,11 @@ class FounderProtectBase int list; int end; char* dummyptr; + protected: + bool remove_own_privs; public: - FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e) : MyInstance(Instance), extend(ext), type(mtype), list(l), end(e) + FounderProtectBase(InspIRCd* Instance, const std::string &ext, const std::string &mtype, int l, int e, bool remove_own) : + MyInstance(Instance), extend(ext), type(mtype), list(l), end(e), remove_own_privs(remove_own) { } @@ -163,9 +166,9 @@ class ChanFounder : public ModeHandler, public FounderProtectBase { char* dummyptr; public: - ChanFounder(InspIRCd* Instance, bool using_prefixes) + ChanFounder(InspIRCd* Instance, bool using_prefixes, bool depriv_self) : ModeHandler(Instance, 'q', 1, 1, true, MODETYPE_CHANNEL, false, using_prefixes ? '~' : 0), - FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387) { } + FounderProtectBase(Instance, "cm_founder_", "founder", 386, 387, depriv_self) { } unsigned int GetPrefixRank() { @@ -196,7 +199,7 @@ class ChanFounder : public ModeHandler, public FounderProtectBase } // source is a server, or ulined, we'll let them +-q the user. - if ((unload_kludge) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (!IS_LOCAL(source))) + if ((unload_kludge) || ((source == theuser) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (!IS_LOCAL(source))) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } @@ -221,9 +224,9 @@ class ChanProtect : public ModeHandler, public FounderProtectBase { char* dummyptr; public: - ChanProtect(InspIRCd* Instance, bool using_prefixes) + ChanProtect(InspIRCd* Instance, bool using_prefixes, bool depriv_self) : ModeHandler(Instance, 'a', 1, 1, true, MODETYPE_CHANNEL, false, using_prefixes ? '&' : 0), - FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389) { } + FounderProtectBase(Instance,"cm_protect_","protected user", 388, 389, depriv_self) { } unsigned int GetPrefixRank() { @@ -254,7 +257,7 @@ class ChanProtect : public ModeHandler, public FounderProtectBase std::string founder = "cm_founder_"+std::string(channel->name); // source has +q, is a server, or ulined, we'll let them +-a the user. - if ((unload_kludge) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (source->GetExt(founder,dummyptr)) || (!IS_LOCAL(source))) + if ((unload_kludge) || ((source == theuser) && (FounderProtectBase::remove_own_privs)) || (ServerInstance->ULine(source->nick)) || (ServerInstance->ULine(source->server)) || (!*source->server) || (source->GetExt(founder,dummyptr)) || (!IS_LOCAL(source))) { return FounderProtectBase::HandleChange(source, theuser, adding, channel, parameter); } @@ -278,6 +281,7 @@ class ModuleChanProtect : public Module bool FirstInGetsFounder; bool QAPrefixes; + bool DeprivSelf; bool booting; ChanProtect* cp; ChanFounder* cf; @@ -294,8 +298,8 @@ class ModuleChanProtect : public Module /* Initialise module variables */ - cp = new ChanProtect(ServerInstance,QAPrefixes); - cf = new ChanFounder(ServerInstance,QAPrefixes); + cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf); + cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf); ServerInstance->AddMode(cp, 'a'); ServerInstance->AddMode(cf, 'q'); @@ -330,9 +334,10 @@ class ModuleChanProtect : public Module ConfigReader Conf(ServerInstance); bool old_qa = QAPrefixes; - + FirstInGetsFounder = Conf.ReadFlag("options","noservices",0); QAPrefixes = Conf.ReadFlag("options","qaprefixes",0); + DeprivSelf = Conf.ReadFlag("options","deprotectself",0); /* Did the user change the QA prefixes on the fly? * If so, remove all instances of the mode, and reinit @@ -344,8 +349,8 @@ class ModuleChanProtect : public Module ServerInstance->Modes->DelMode(cf); DELETE(cp); DELETE(cf); - cp = new ChanProtect(ServerInstance,QAPrefixes); - cf = new ChanFounder(ServerInstance,QAPrefixes); + cp = new ChanProtect(ServerInstance,QAPrefixes,DeprivSelf); + cf = new ChanFounder(ServerInstance,QAPrefixes,DeprivSelf); ServerInstance->AddMode(cp, 'a'); ServerInstance->AddMode(cf, 'q'); ServerInstance->WriteOpers("*** WARNING: +qa prefixes were enabled or disabled via a REHASH. Clients will probably need to reconnect to pick up this change."); |