Add <options:deprotectself> which can allow a +qa user to remove their own +q or +a. The default of having this off makes inspircd act like it always has (only allow ANY removal of these modes via services or a founder)

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5578 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2006-10-28 20:07:31 +00:00
parent 494d7f7489
commit db651797de
2 changed files with 26 additions and 14 deletions

View File

@ -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"

View File

@ -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.");