summaryrefslogtreecommitdiff
path: root/src/coremods
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2014-03-12 13:50:41 +0100
committerAttila Molnar <attilamolnar@hush.com>2014-03-12 13:50:41 +0100
commit7aab18ae35770fa38aee887a3696d779516c7cb0 (patch)
tree77955f71f250a0f2784a9b6dd63c7a3bd860163d /src/coremods
parent9b17aecc0d711b1345416c0510adb270399960a9 (diff)
Deduplicate and move the *MatchesEveryone() functions to core_xline
Diffstat (limited to 'src/coremods')
-rw-r--r--src/coremods/core_xline/cmd_eline.cpp3
-rw-r--r--src/coremods/core_xline/cmd_gline.cpp3
-rw-r--r--src/coremods/core_xline/cmd_kline.cpp3
-rw-r--r--src/coremods/core_xline/cmd_qline.cpp8
-rw-r--r--src/coremods/core_xline/cmd_zline.cpp8
-rw-r--r--src/coremods/core_xline/core_xline.cpp29
-rw-r--r--src/coremods/core_xline/core_xline.h56
7 files changed, 105 insertions, 5 deletions
diff --git a/src/coremods/core_xline/cmd_eline.cpp b/src/coremods/core_xline/cmd_eline.cpp
index c92bed25f..26b49894b 100644
--- a/src/coremods/core_xline/cmd_eline.cpp
+++ b/src/coremods/core_xline/cmd_eline.cpp
@@ -54,7 +54,8 @@ CmdResult CommandEline::Handle (const std::vector<std::string>& parameters, User
return CMD_FAILURE;
}
- if (ServerInstance->HostMatchesEveryone(ih.first+"@"+ih.second,user))
+ InsaneBan::IPHostMatcher matcher;
+ if (InsaneBan::MatchesEveryone(ih.first+"@"+ih.second, matcher, user, "E", "hostmasks"))
return CMD_FAILURE;
unsigned long duration = InspIRCd::Duration(parameters[1]);
diff --git a/src/coremods/core_xline/cmd_gline.cpp b/src/coremods/core_xline/cmd_gline.cpp
index 44b2192b5..3f042c366 100644
--- a/src/coremods/core_xline/cmd_gline.cpp
+++ b/src/coremods/core_xline/cmd_gline.cpp
@@ -55,7 +55,8 @@ CmdResult CommandGline::Handle (const std::vector<std::string>& parameters, User
return CMD_FAILURE;
}
- if (ServerInstance->HostMatchesEveryone(ih.first+"@"+ih.second,user))
+ InsaneBan::IPHostMatcher matcher;
+ if (InsaneBan::MatchesEveryone(ih.first+"@"+ih.second, matcher, user, "G", "hostmasks"))
return CMD_FAILURE;
else if (target.find('!') != std::string::npos)
diff --git a/src/coremods/core_xline/cmd_kline.cpp b/src/coremods/core_xline/cmd_kline.cpp
index 686f4b9b3..50ab88398 100644
--- a/src/coremods/core_xline/cmd_kline.cpp
+++ b/src/coremods/core_xline/cmd_kline.cpp
@@ -55,7 +55,8 @@ CmdResult CommandKline::Handle (const std::vector<std::string>& parameters, User
return CMD_FAILURE;
}
- if (ServerInstance->HostMatchesEveryone(ih.first+"@"+ih.second,user))
+ InsaneBan::IPHostMatcher matcher;
+ if (InsaneBan::MatchesEveryone(ih.first+"@"+ih.second, matcher, user, "K", "hostmasks"))
return CMD_FAILURE;
if (target.find('!') != std::string::npos)
diff --git a/src/coremods/core_xline/cmd_qline.cpp b/src/coremods/core_xline/cmd_qline.cpp
index 24e8581b6..955efeaf0 100644
--- a/src/coremods/core_xline/cmd_qline.cpp
+++ b/src/coremods/core_xline/cmd_qline.cpp
@@ -35,7 +35,8 @@ CmdResult CommandQline::Handle (const std::vector<std::string>& parameters, User
{
if (parameters.size() >= 3)
{
- if (ServerInstance->NickMatchesEveryone(parameters[0],user))
+ NickMatcher matcher;
+ if (InsaneBan::MatchesEveryone(parameters[0], matcher, user, "Q", "nickmasks"))
return CMD_FAILURE;
if (parameters[0].find('@') != std::string::npos || parameters[0].find('!') != std::string::npos || parameters[0].find('.') != std::string::npos)
@@ -82,3 +83,8 @@ CmdResult CommandQline::Handle (const std::vector<std::string>& parameters, User
return CMD_SUCCESS;
}
+
+bool CommandQline::NickMatcher::Check(User* user, const std::string& nick) const
+{
+ return InspIRCd::Match(user->nick, nick);
+}
diff --git a/src/coremods/core_xline/cmd_zline.cpp b/src/coremods/core_xline/cmd_zline.cpp
index 5eeebf175..859be1004 100644
--- a/src/coremods/core_xline/cmd_zline.cpp
+++ b/src/coremods/core_xline/cmd_zline.cpp
@@ -59,7 +59,8 @@ CmdResult CommandZline::Handle (const std::vector<std::string>& parameters, User
ipaddr++;
}
- if (ServerInstance->IPMatchesEveryone(ipaddr,user))
+ IPMatcher matcher;
+ if (InsaneBan::MatchesEveryone(ipaddr, matcher, user, "Z", "ipmasks"))
return CMD_FAILURE;
unsigned long duration = InspIRCd::Duration(parameters[1]);
@@ -100,3 +101,8 @@ CmdResult CommandZline::Handle (const std::vector<std::string>& parameters, User
return CMD_SUCCESS;
}
+
+bool CommandZline::IPMatcher::Check(User* user, const std::string& ip) const
+{
+ return InspIRCd::Match(user->GetIPString(), ip, ascii_case_insensitive_map);
+}
diff --git a/src/coremods/core_xline/core_xline.cpp b/src/coremods/core_xline/core_xline.cpp
index dcd85b4f6..94183d829 100644
--- a/src/coremods/core_xline/core_xline.cpp
+++ b/src/coremods/core_xline/core_xline.cpp
@@ -20,6 +20,35 @@
#include "inspircd.h"
#include "core_xline.h"
+bool InsaneBan::MatchesEveryone(const std::string& mask, MatcherBase& test, User* user, const char* bantype, const char* confkey)
+{
+ ConfigTag* insane = ServerInstance->Config->ConfValue("insane");
+
+ if (insane->getBool(confkey))
+ return false;
+
+ float itrigger = insane->getFloat("trigger", 95.5);
+
+ long matches = test.Run(mask);
+
+ if (!matches)
+ return false;
+
+ float percent = ((float)matches / (float)ServerInstance->Users->clientlist->size()) * 100;
+ if (percent > itrigger)
+ {
+ ServerInstance->SNO->WriteToSnoMask('a', "\2WARNING\2: %s tried to set a %s-line mask of %s, which covers %.2f%% of the network!", user->nick.c_str(), bantype, mask.c_str(), percent);
+ return true;
+ }
+ return false;
+}
+
+bool InsaneBan::IPHostMatcher::Check(User* user, const std::string& mask) const
+{
+ return ((InspIRCd::Match(user->MakeHost(), mask, ascii_case_insensitive_map)) ||
+ (InspIRCd::Match(user->MakeHostIP(), mask, ascii_case_insensitive_map)));
+}
+
class CoreModXLine : public Module
{
CommandEline cmdeline;
diff --git a/src/coremods/core_xline/core_xline.h b/src/coremods/core_xline/core_xline.h
index c2e171410..6101d79bf 100644
--- a/src/coremods/core_xline/core_xline.h
+++ b/src/coremods/core_xline/core_xline.h
@@ -21,6 +21,50 @@
#include "inspircd.h"
+class InsaneBan
+{
+ public:
+ class MatcherBase
+ {
+ public:
+ virtual long Run(const std::string& mask) = 0;
+ };
+
+ template <typename T>
+ class Matcher : public MatcherBase
+ {
+ public:
+ long Run(const std::string& mask)
+ {
+ long matches = 0;
+ const T* c = static_cast<T*>(this);
+ const user_hash& users = *ServerInstance->Users->clientlist;
+ for (user_hash::const_iterator i = users.begin(); i != users.end(); ++i)
+ {
+ if (c->Check(i->second, mask))
+ matches++;
+ }
+ return matches;
+ }
+ };
+
+ class IPHostMatcher : public Matcher<IPHostMatcher>
+ {
+ public:
+ bool Check(User* user, const std::string& mask) const;
+ };
+
+ /** Check if the given mask matches too many users according to the config, send an announcement if yes
+ * @param mask A mask to match against
+ * @param test The test that determines if a user matches the mask or not
+ * @param user A user whose nick will be included in the announcement if one is made
+ * @param bantype Type of the ban being set, will be used in the announcement if one is made
+ * @param confkey Name of the config key (inside the insane tag) which if false disables any checking
+ * @return True if the given mask matches too many users, false if not
+ */
+ static bool MatchesEveryone(const std::string& mask, MatcherBase& test, User* user, const char* bantype, const char* confkey);
+};
+
/** Handle /ELINE.
*/
class CommandEline : public Command
@@ -76,6 +120,12 @@ class CommandKline : public Command
*/
class CommandQline : public Command
{
+ class NickMatcher : public InsaneBan::Matcher<NickMatcher>
+ {
+ public:
+ bool Check(User* user, const std::string& mask) const;
+ };
+
public:
/** Constructor for qline.
*/
@@ -94,6 +144,12 @@ class CommandQline : public Command
*/
class CommandZline : public Command
{
+ class IPMatcher : public InsaneBan::Matcher<IPMatcher>
+ {
+ public:
+ bool Check(User* user, const std::string& mask) const;
+ };
+
public:
/** Constructor for zline.
*/