summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2018-07-10 20:32:08 +0100
committerPeter Powell <petpow@saberuk.com>2018-07-10 21:01:35 +0100
commit2a022cb9b7ed10d929beb96b6fcc2f1aa6a910f3 (patch)
tree9c1b733a6e65f8808a2fcf99cc611ab28b9d3785
parent5585654df265bc37d547fa7738e35cc7ae7dacbb (diff)
Add a silent option to <options:restrictbannedusers>.
This is useful when dealing with spambots that switch method when they receive ERR_CANNOTSENDTOCHAN.
-rw-r--r--docs/conf/inspircd.conf.example3
-rw-r--r--include/configreader.h19
-rw-r--r--src/configreader.cpp11
-rw-r--r--src/coremods/core_privmsg.cpp5
-rw-r--r--src/coremods/core_user/cmd_nick.cpp7
5 files changed, 34 insertions, 11 deletions
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 <options:restrictbannedusers> 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<std::string>& 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<std::string>& parameters, L
// Disallow the nick change if <security:restrictbannedusers> 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;
}
}