# 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
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:
*/
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
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");
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)
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;
}
}
// 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;
}
}