summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/conf/modules.conf.example8
-rw-r--r--src/configparser.cpp2
-rw-r--r--src/modules/m_joinflood.cpp13
-rw-r--r--src/modules/m_lockserv.cpp32
-rw-r--r--src/modules/m_nickflood.cpp15
5 files changed, 45 insertions, 25 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index 4352b0a09..5aa5bb158 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -1007,8 +1007,11 @@
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Join flood module: Adds support for join flood protection +j X:Y.
-# Closes the channel for 60 seconds if X users join in Y seconds.
+# Closes the channel for N seconds if X users join in Y seconds.
#<module name="joinflood">
+#
+# The number of seconds to close the channel for:
+#<joinflood duration="1m">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Jump server module: Adds support for the RPL_REDIR numeric.
@@ -1215,6 +1218,9 @@
# Nickchange flood protection module: Provides channel mode +F X:Y
# which allows up to X nick changes in Y seconds.
#<module name="nickflood">
+#
+# The number of seconds to prevent nick changes for:
+#<nickflood duration="1m">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Nicklock module: Let opers change a user's nick and then stop that
diff --git a/src/configparser.cpp b/src/configparser.cpp
index 3be1ac9c5..8bf9aaec2 100644
--- a/src/configparser.cpp
+++ b/src/configparser.cpp
@@ -173,7 +173,7 @@ struct Parser
}
else if (ch == '"')
break;
- else
+ else if (ch != '\r')
value.push_back(ch);
}
diff --git a/src/modules/m_joinflood.cpp b/src/modules/m_joinflood.cpp
index 56131f0be..077ceff52 100644
--- a/src/modules/m_joinflood.cpp
+++ b/src/modules/m_joinflood.cpp
@@ -23,6 +23,9 @@
#include "inspircd.h"
+// The number of seconds the channel will be closed for.
+static unsigned int duration;
+
/** Holds settings and state associated with channel mode +j
*/
class joinfloodsettings
@@ -71,7 +74,7 @@ class joinfloodsettings
void lock()
{
- unlocktime = ServerInstance->Time() + 60;
+ unlocktime = ServerInstance->Time() + duration;
}
bool operator==(const joinfloodsettings& other) const
@@ -129,6 +132,12 @@ class ModuleJoinFlood : public Module
{
}
+ void ReadConfig(ConfigStatus&) CXX11_OVERRIDE
+ {
+ ConfigTag* tag = ServerInstance->Config->ConfValue("joinflood");
+ duration = tag->getDuration("duration", 60, 10, 600);
+ }
+
ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
{
if (chan)
@@ -159,7 +168,7 @@ class ModuleJoinFlood : public Module
{
f->clear();
f->lock();
- memb->chan->WriteNotice(InspIRCd::Format("This channel has been closed to new users for 60 seconds because there have been more than %d joins in %d seconds.", f->joins, f->secs));
+ memb->chan->WriteNotice(InspIRCd::Format("This channel has been closed to new users for %u seconds because there have been more than %d joins in %d seconds.", duration, f->joins, f->secs));
}
}
}
diff --git a/src/modules/m_lockserv.cpp b/src/modules/m_lockserv.cpp
index ffcc04682..7c1bb5bd3 100644
--- a/src/modules/m_lockserv.cpp
+++ b/src/modules/m_lockserv.cpp
@@ -27,23 +27,24 @@
class CommandLockserv : public Command
{
- bool& locked;
+ std::string& locked;
public:
- CommandLockserv(Module* Creator, bool& lock) : Command(Creator, "LOCKSERV", 0), locked(lock)
+ CommandLockserv(Module* Creator, std::string& lock) : Command(Creator, "LOCKSERV", 0, 1), locked(lock)
{
+ allow_empty_last_param = false;
flags_needed = 'o';
}
CmdResult Handle (const std::vector<std::string> &parameters, User *user)
{
- if (locked)
+ if (!locked.empty())
{
user->WriteNotice("The server is already locked.");
return CMD_FAILURE;
}
- locked = true;
+ locked = parameters.empty() ? "Server is temporarily closed. Please try again later." : parameters[0];
user->WriteNumeric(988, user->server->GetName(), "Closed for new connections");
ServerInstance->SNO->WriteGlobalSno('a', "Oper %s used LOCKSERV to temporarily disallow new connections", user->nick.c_str());
return CMD_SUCCESS;
@@ -52,23 +53,23 @@ class CommandLockserv : public Command
class CommandUnlockserv : public Command
{
- bool& locked;
+ std::string& locked;
public:
- CommandUnlockserv(Module* Creator, bool &lock) : Command(Creator, "UNLOCKSERV", 0), locked(lock)
+ CommandUnlockserv(Module* Creator, std::string& lock) : Command(Creator, "UNLOCKSERV", 0), locked(lock)
{
flags_needed = 'o';
}
CmdResult Handle (const std::vector<std::string> &parameters, User *user)
{
- if (!locked)
+ if (locked.empty())
{
user->WriteNotice("The server isn't locked.");
return CMD_FAILURE;
}
- locked = false;
+ locked.clear();
user->WriteNumeric(989, user->server->GetName(), "Open for new connections");
ServerInstance->SNO->WriteGlobalSno('a', "Oper %s used UNLOCKSERV to allow new connections", user->nick.c_str());
return CMD_SUCCESS;
@@ -77,7 +78,7 @@ class CommandUnlockserv : public Command
class ModuleLockserv : public Module
{
- bool locked;
+ std::string locked;
CommandLockserv lockcommand;
CommandUnlockserv unlockcommand;
@@ -86,23 +87,18 @@ class ModuleLockserv : public Module
{
}
- void init() CXX11_OVERRIDE
- {
- locked = false;
- }
-
void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
// Emergency way to unlock
if (!status.srcuser)
- locked = false;
+ locked.clear();
}
ModResult OnUserRegister(LocalUser* user) CXX11_OVERRIDE
{
- if (locked)
+ if (!locked.empty())
{
- ServerInstance->Users->QuitUser(user, "Server is temporarily closed. Please try again later.");
+ ServerInstance->Users->QuitUser(user, locked);
return MOD_RES_DENY;
}
return MOD_RES_PASSTHRU;
@@ -110,7 +106,7 @@ class ModuleLockserv : public Module
ModResult OnCheckReady(LocalUser* user) CXX11_OVERRIDE
{
- return locked ? MOD_RES_DENY : MOD_RES_PASSTHRU;
+ return !locked.empty() ? MOD_RES_DENY : MOD_RES_PASSTHRU;
}
Version GetVersion() CXX11_OVERRIDE
diff --git a/src/modules/m_nickflood.cpp b/src/modules/m_nickflood.cpp
index 39e097daa..abb3cdfaf 100644
--- a/src/modules/m_nickflood.cpp
+++ b/src/modules/m_nickflood.cpp
@@ -20,6 +20,9 @@
#include "inspircd.h"
+// The number of seconds nickname changing will be blocked for.
+static unsigned int duration;
+
/** Holds settings and state associated with channel mode +F
*/
class nickfloodsettings
@@ -72,7 +75,7 @@ class nickfloodsettings
void lock()
{
- unlocktime = ServerInstance->Time() + 60;
+ unlocktime = ServerInstance->Time() + duration;
}
};
@@ -126,6 +129,12 @@ class ModuleNickFlood : public Module
{
}
+ void ReadConfig(ConfigStatus&) CXX11_OVERRIDE
+ {
+ ConfigTag* tag = ServerInstance->Config->ConfValue("nickflood");
+ duration = tag->getDuration("duration", 60, 10, 600);
+ }
+
ModResult OnUserPreNick(LocalUser* user, const std::string& newnick) CXX11_OVERRIDE
{
for (User::ChanList::iterator i = user->chans.begin(); i != user->chans.end(); i++)
@@ -142,7 +151,7 @@ class ModuleNickFlood : public Module
if (f->islocked())
{
- user->WriteNumeric(ERR_CANTCHANGENICK, InspIRCd::Format("%s has been locked for nickchanges for 60 seconds because there have been more than %u nick changes in %u seconds", channel->name.c_str(), f->nicks, f->secs));
+ user->WriteNumeric(ERR_CANTCHANGENICK, InspIRCd::Format("%s has been locked for nickchanges for %u seconds because there have been more than %u nick changes in %u seconds", channel->name.c_str(), duration, f->nicks, f->secs));
return MOD_RES_DENY;
}
@@ -150,7 +159,7 @@ class ModuleNickFlood : public Module
{
f->clear();
f->lock();
- channel->WriteNotice(InspIRCd::Format("No nick changes are allowed for 60 seconds because there have been more than %u nick changes in %u seconds.", f->nicks, f->secs));
+ channel->WriteNotice(InspIRCd::Format("No nick changes are allowed for %u seconds because there have been more than %u nick changes in %u seconds.", duration, f->nicks, f->secs));
return MOD_RES_DENY;
}
}