From: Peter Powell Date: Tue, 10 Jul 2018 19:32:08 +0000 (+0100) Subject: Add a silent option to . X-Git-Url: https://git.netwichtig.de/gitweb/?a=commitdiff_plain;h=2a022cb9b7ed10d929beb96b6fcc2f1aa6a910f3;p=user%2Fhenk%2Fcode%2Finspircd.git Add a silent option to . This is useful when dealing with spambots that switch method when they receive ERR_CANNOTSENDTOCHAN. --- diff --git a/docs/conf/inspircd.conf.example b/docs/conf/inspircd.conf.example index b5671ee6b..d06989551 100644 --- a/docs/conf/inspircd.conf.example +++ b/docs/conf/inspircd.conf.example @@ -779,7 +779,8 @@ # restrictbannedusers: If this is set to yes, InspIRCd will not allow users # banned on a channel to change nickname or message channels they are - # banned on. + # banned on. This can also be set to silent to restrict the user but not + # notify them. restrictbannedusers="yes" # genericoper: Setting this value to yes makes all opers on this server diff --git a/include/configreader.h b/include/configreader.h index be5c582b9..a82420b4e 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -210,6 +210,19 @@ class CoreExport ServerConfig void CrossCheckConnectBlocks(ServerConfig* current); public: + /** How to treat a user in a channel who is banned. */ + enum BannedUserTreatment + { + /** Don't treat a banned user any different to normal. */ + BUT_NORMAL, + + /** Restrict the actions of a banned user. */ + BUT_RESTRICT_SILENT, + + /** Restrict the actions of a banned user and notify them of their treatment. */ + BUT_RESTRICT_NOTIFY + }; + class ServerPaths { public: @@ -330,10 +343,8 @@ class CoreExport ServerConfig */ bool GenericOper; - /** If this value is true, banned users (+b, not extbans) will not be able to change nick - * if banned on any channel, nor to message them. - */ - bool RestrictBannedUsers; + /** How to treat a user in a channel who is banned. */ + BannedUserTreatment RestrictBannedUsers; /** The size of the read() buffer in the user * handling code, used to read data into a user's diff --git a/src/configreader.cpp b/src/configreader.cpp index c9fa62510..b5d6b3ecb 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -434,7 +434,6 @@ void ServerConfig::Fill() HideServer = security->getString("hideserver", security->getString("hidewhois")); HideKillsServer = security->getString("hidekills"); HideULineKills = security->getBool("hideulinekills"); - RestrictBannedUsers = security->getBool("restrictbannedusers", true); GenericOper = security->getBool("genericoper"); SyntaxHints = options->getBool("syntaxhints"); CycleHostsFromUser = options->getBool("cyclehostsfromuser"); @@ -474,6 +473,16 @@ void ServerConfig::Fill() ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K")); ReadXLine(this, "exception", "host", ServerInstance->XLines->GetFactory("E")); + const std::string restrictbannedusers = options->getString("restrictbannedusers", "yes"); + if (stdalgo::string::equalsci(restrictbannedusers, "no")) + RestrictBannedUsers = ServerConfig::BUT_NORMAL; + else if (stdalgo::string::equalsci(restrictbannedusers, "silent")) + RestrictBannedUsers = ServerConfig::BUT_RESTRICT_SILENT; + else if (stdalgo::string::equalsci(restrictbannedusers, "yes")) + RestrictBannedUsers = ServerConfig::BUT_RESTRICT_NOTIFY; + else + throw CoreException(restrictbannedusers + " is an invalid value, at " + options->getTagLocation()); + DisabledUModes.reset(); std::string modes = ConfValue("disabled")->getString("usermodes"); for (std::string::const_iterator p = modes.begin(); p != modes.end(); ++p) diff --git a/src/coremods/core_privmsg.cpp b/src/coremods/core_privmsg.cpp index 6c5b7557e..29756a4c2 100644 --- a/src/coremods/core_privmsg.cpp +++ b/src/coremods/core_privmsg.cpp @@ -141,11 +141,12 @@ CmdResult MessageCommandBase::HandleMessage(const std::vector& para return CMD_FAILURE; } - if (ServerInstance->Config->RestrictBannedUsers) + if (ServerInstance->Config->RestrictBannedUsers != ServerConfig::BUT_NORMAL) { if (chan->IsBanned(user)) { - user->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (you're banned)"); + if (ServerInstance->Config->RestrictBannedUsers == ServerConfig::BUT_RESTRICT_NOTIFY) + user->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (you're banned)"); return CMD_FAILURE; } } diff --git a/src/coremods/core_user/cmd_nick.cpp b/src/coremods/core_user/cmd_nick.cpp index 672155741..80bfbe674 100644 --- a/src/coremods/core_user/cmd_nick.cpp +++ b/src/coremods/core_user/cmd_nick.cpp @@ -70,15 +70,16 @@ CmdResult CommandNick::HandleLocal(const std::vector& parameters, L // Disallow the nick change if is on and there is a ban matching this user in // one of the channels they are on - if (ServerInstance->Config->RestrictBannedUsers) + if (ServerInstance->Config->RestrictBannedUsers != ServerConfig::BUT_NORMAL) { for (User::ChanList::iterator i = user->chans.begin(); i != user->chans.end(); ++i) { Channel* chan = (*i)->chan; if (chan->GetPrefixValue(user) < VOICE_VALUE && chan->IsBanned(user)) { - user->WriteNumeric(ERR_CANTCHANGENICK, InspIRCd::Format("Cannot change nickname while on %s (you're banned)", - chan->name.c_str())); + if (ServerInstance->Config->RestrictBannedUsers == ServerConfig::BUT_RESTRICT_NOTIFY) + user->WriteNumeric(ERR_CANTCHANGENICK, InspIRCd::Format("Cannot change nickname while on %s (you're banned)", + chan->name.c_str())); return CMD_FAILURE; } }