inspircd

A modular C++ IRC daemon (ircd). https://www.inspircd.org/
Log | Files | Refs | README

commit 8bbd67b1f7b87df9b36a950b3b699c5b76a1748f
parent f6b33a8facd6ca200292786c1061782c41cdd278
Author: Peter Powell <petpow@saberuk.com>
Date:   Fri,  7 Jun 2019 20:11:40 +0100

Add an option to the filter module to ignore self messages.

Diffstat:
Mdocs/conf/modules.conf.example | 8+++++++-
Msrc/modules/m_filter.cpp | 17+++++++++++++++--
2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example @@ -857,7 +857,13 @@ # # # If notifyuser is set to no, the user will not be notified when # # their message is blocked. # -#<filteropts engine="glob" notifyuser="yes"> +# # +# If warnonselfmsg is set to yes when a user sends a message to # +# themself that matches a filter the filter will be ignored and a # +# warning will be sent to opers instead. This stops spambots which # +# send their spam message to themselves first to check if it is being # +# filtered by the server. # +#<filteropts engine="glob" notifyuser="yes" warnonselfmsg="no"> # # # Your choice of regex engine must match on all servers network-wide. # # # diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp @@ -179,6 +179,7 @@ class ModuleFilter : public Module, public ServerEventListener, public Stats::Ev bool initing; bool notifyuser; + bool warnonselfmsg; RegexFactory* factory; void FreeFilters(); @@ -369,6 +370,7 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar FilterResult* f = this->FilterMatch(user, details.text, flags); if (f) { + bool is_selfmsg = false; std::string target; if (msgtarget.type == MessageTarget::TYPE_USER) { @@ -377,6 +379,9 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar if (exemptednicks.count(t->nick)) return MOD_RES_PASSTHRU; + if (user == t) + is_selfmsg = true; + target = t->nick; } else if (msgtarget.type == MessageTarget::TYPE_CHANNEL) @@ -387,13 +392,20 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar target = t->name; } - if (f->action == FA_WARN) + + if (is_selfmsg & warnonselfmsg) + { + ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("WARNING: %s's self message matched %s (%s)", + user->nick.c_str(), f->freeform.c_str(), f->reason.c_str())); + return MOD_RES_PASSTHRU; + } + else if (f->action == FA_WARN) { ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("WARNING: %s's message to %s matched %s (%s)", user->nick.c_str(), target.c_str(), f->freeform.c_str(), f->reason.c_str())); return MOD_RES_PASSTHRU; } - if (f->action == FA_BLOCK) + else if (f->action == FA_BLOCK) { ServerInstance->SNO->WriteGlobalSno('f', InspIRCd::Format("%s had their message to %s filtered as it matched %s (%s)", user->nick.c_str(), target.c_str(), f->freeform.c_str(), f->reason.c_str())); @@ -609,6 +621,7 @@ void ModuleFilter::ReadConfig(ConfigStatus& status) ConfigTag* tag = ServerInstance->Config->ConfValue("filteropts"); std::string newrxengine = tag->getString("engine"); notifyuser = tag->getBool("notifyuser", true); + warnonselfmsg = tag->getBool("warnonselfmsg"); factory = RegexEngine ? (RegexEngine.operator->()) : NULL;