]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_dnsbl.cpp
Show an error when an unprivileged user tries to mass-message.
[user/henk/code/inspircd.git] / src / modules / m_dnsbl.cpp
index a645e2cd16b47d91bb54460cb24db2dce2d2aa5a..32e05aebdaa6e2b14648de3fb610758ac5108df9 100644 (file)
@@ -1,11 +1,16 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2018-2020 Matt Schatz <genius3000@g3k.solutions>
+ *   Copyright (C) 2018-2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ *   Copyright (C) 2013, 2016-2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2015-2016 Adam <Adam@anope.org>
+ *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2018 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2007 Craig Edwards <craigedwards@brainbox.cc>
- *   Copyright (C) 2006-2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2007 John Brooks <john.brooks@dereferenced.net>
+ *   Copyright (C) 2007, 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2006-2009 Robin Burchell <robin+git@viroteck.net>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -47,15 +52,21 @@ class DNSBLConfEntry : public refcountbase
  */
 class DNSBLResolver : public DNS::Request
 {
+ private:
+       irc::sockets::sockaddrs theirsa;
        std::string theiruid;
        LocalStringExt& nameExt;
        LocalIntExt& countExt;
        reference<DNSBLConfEntry> ConfEntry;
 
  public:
-
        DNSBLResolver(DNS::Manager *mgr, Module *me, LocalStringExt& match, LocalIntExt& ctr, const std::string &hostname, LocalUser* u, reference<DNSBLConfEntry> conf)
-               : DNS::Request(mgr, me, hostname, DNS::QUERY_A, true), theiruid(u->uuid), nameExt(match), countExt(ctr), ConfEntry(conf)
+               : DNS::Request(mgr, me, hostname, DNS::QUERY_A, true)
+               , theirsa(u->client_sa)
+               , theiruid(u->uuid)
+               , nameExt(match)
+               , countExt(ctr)
+               , ConfEntry(conf)
        {
        }
 
@@ -63,8 +74,8 @@ class DNSBLResolver : public DNS::Request
        void OnLookupComplete(const DNS::Query *r) CXX11_OVERRIDE
        {
                /* Check the user still exists */
-               LocalUser* them = (LocalUser*)ServerInstance->FindUUID(theiruid);
-               if (!them)
+               LocalUser* them = IS_LOCAL(ServerInstance->FindUUID(theiruid));
+               if (!them || them->client_sa != theirsa)
                        return;
 
                const DNS::ResourceRecord* const ans_record = r->FindAnswerOfType(DNS::QUERY_A);
@@ -147,9 +158,9 @@ class DNSBLResolver : public DNS::Request
                                                        "*", them->GetIPString());
                                        if (ServerInstance->XLines->AddLine(kl,NULL))
                                        {
-                                               std::string timestr = InspIRCd::TimeString(kl->expiry);
-                                               ServerInstance->SNO->WriteGlobalSno('x', "K-line added due to DNSBL match on *@%s to expire on %s: %s",
-                                                       them->GetIPString().c_str(), timestr.c_str(), reason.c_str());
+                                               ServerInstance->SNO->WriteToSnoMask('x', "K-line added due to DNSBL match on *@%s to expire in %s (on %s): %s",
+                                                       them->GetIPString().c_str(), InspIRCd::DurationString(kl->duration).c_str(),
+                                                       InspIRCd::TimeString(kl->expiry).c_str(), reason.c_str());
                                                ServerInstance->XLines->ApplyLines();
                                        }
                                        else
@@ -165,9 +176,9 @@ class DNSBLResolver : public DNS::Request
                                                        "*", them->GetIPString());
                                        if (ServerInstance->XLines->AddLine(gl,NULL))
                                        {
-                                               std::string timestr = InspIRCd::TimeString(gl->expiry);
-                                               ServerInstance->SNO->WriteGlobalSno('x', "G-line added due to DNSBL match on *@%s to expire on %s: %s",
-                                                       them->GetIPString().c_str(), timestr.c_str(), reason.c_str());
+                                               ServerInstance->SNO->WriteToSnoMask('x', "G-line added due to DNSBL match on *@%s to expire in %s (on %s): %s",
+                                                       them->GetIPString().c_str(), InspIRCd::DurationString(gl->duration).c_str(),
+                                                       InspIRCd::TimeString(gl->expiry).c_str(), reason.c_str());
                                                ServerInstance->XLines->ApplyLines();
                                        }
                                        else
@@ -183,9 +194,9 @@ class DNSBLResolver : public DNS::Request
                                                        them->GetIPString());
                                        if (ServerInstance->XLines->AddLine(zl,NULL))
                                        {
-                                               std::string timestr = InspIRCd::TimeString(zl->expiry);
-                                               ServerInstance->SNO->WriteGlobalSno('x', "Z-line added due to DNSBL match on %s to expire on %s: %s",
-                                                       them->GetIPString().c_str(), timestr.c_str(), reason.c_str());
+                                               ServerInstance->SNO->WriteToSnoMask('x', "Z-line added due to DNSBL match on %s to expire in %s (on %s): %s",
+                                                       them->GetIPString().c_str(), InspIRCd::DurationString(zl->duration).c_str(),
+                                                       InspIRCd::TimeString(zl->expiry).c_str(), reason.c_str());
                                                ServerInstance->XLines->ApplyLines();
                                        }
                                        else
@@ -209,8 +220,8 @@ class DNSBLResolver : public DNS::Request
 
        void OnError(const DNS::Query *q) CXX11_OVERRIDE
        {
-               LocalUser* them = (LocalUser*)ServerInstance->FindUUID(theiruid);
-               if (!them)
+               LocalUser* them = IS_LOCAL(ServerInstance->FindUUID(theiruid));
+               if (!them || them->client_sa != theirsa)
                        return;
 
                int i = countExt.get(them);
@@ -271,7 +282,7 @@ class ModuleDNSBL : public Module, public Stats::EventListener
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides handling of DNS blacklists", VF_VENDOR);
+               return Version("Allows the server administrator to check the IP address of connecting users against a DNSBL.", VF_VENDOR);
        }
 
        /** Fill our conf vector with data
@@ -384,6 +395,7 @@ class ModuleDNSBL : public Module, public Stats::EventListener
                                reversedip.push_back(*it);
                                reversedip.push_back('.');
                        }
+                       reversedip.erase(reversedip.length() - 1, 1);
                }
                else
                        return;
@@ -420,10 +432,14 @@ class ModuleDNSBL : public Module, public Stats::EventListener
                std::string dnsbl;
                if (!myclass->config->readString("dnsbl", dnsbl))
                        return MOD_RES_PASSTHRU;
+
                std::string* match = nameExt.get(user);
-               std::string myname = match ? *match : "";
-               if (dnsbl == myname)
+               if (!match)
+                       return MOD_RES_DENY;
+
+               if (InspIRCd::Match(*match, dnsbl))
                        return MOD_RES_PASSTHRU;
+
                return MOD_RES_DENY;
        }