]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_dns.cpp
Add HasFd to EventHandler and switch code to use it.
[user/henk/code/inspircd.git] / src / coremods / core_dns.cpp
index 1040bb036736b57794529b2256f9b6e875f7d403..32613546597af81c9570dd13439b8ceab35f9a2e 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013 Adam <Adam@anope.org>
- *   Copyright (C) 2003-2013 Anope Team <team@anope.org>
+ *   Copyright (C) 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2015, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2013, 2015-2016 Adam <Adam@anope.org>
  *
  * 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
@@ -36,15 +38,10 @@ namespace DNS
 
 using namespace DNS;
 
-/** A full packet sent or recieved to/from the nameserver
+/** A full packet sent or received to/from the nameserver
  */
 class Packet : public Query
 {
-       static bool IsValidName(const std::string& name)
-       {
-               return (name.find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-") == std::string::npos);
-       }
-
        void PackName(unsigned char* output, unsigned short output_size, unsigned short& pos, const std::string& name)
        {
                if (pos + name.length() + 2 > output_size)
@@ -195,7 +192,7 @@ class Packet : public Query
                        case QUERY_PTR:
                        {
                                record.rdata = this->UnpackName(input, input_size, pos);
-                               if (!IsValidName(record.rdata))
+                               if (!InspIRCd::IsHost(record.rdata))
                                        throw Exception("Invalid name"); // XXX: Causes the request to time out
 
                                break;
@@ -502,7 +499,7 @@ class MyManager : public Manager, public Timer, public EventHandler
                // Update name in the original request so question checking works for PTR queries
                req->question.name = p.question.name;
 
-               if (SocketEngine::SendTo(this, buffer, len, 0, &this->myserver.sa, this->myserver.sa_size()) != len)
+               if (SocketEngine::SendTo(this, buffer, len, 0, this->myserver) != len)
                        throw Exception("DNS: Unable to send query");
 
                // Add timer for timeout
@@ -543,6 +540,25 @@ class MyManager : public Manager, public Timer, public EventHandler
                }
        }
 
+       std::string GetTypeStr(QueryType qt) CXX11_OVERRIDE
+       {
+               switch (qt)
+               {
+                       case QUERY_A:
+                               return "A";
+                       case QUERY_AAAA:
+                               return "AAAA";
+                       case QUERY_CNAME:
+                               return "CNAME";
+                       case QUERY_PTR:
+                               return "PTR";
+                       case QUERY_TXT:
+                               return "TXT";
+                       default:
+                               return "UNKNOWN";
+               }
+       }
+
        void OnEventHandlerError(int errcode) CXX11_OVERRIDE
        {
                ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "UDP socket got an error event");
@@ -666,22 +682,28 @@ class MyManager : public Manager, public Timer, public EventHandler
 
        bool Tick(time_t now) CXX11_OVERRIDE
        {
-               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "cache: purging DNS cache");
-
+               unsigned long expired = 0;
                for (cache_map::iterator it = this->cache.begin(); it != this->cache.end(); )
                {
                        const Query& query = it->second;
                        if (IsExpired(query, now))
+                       {
+                               expired++;
                                this->cache.erase(it++);
+                       }
                        else
                                ++it;
                }
+
+               if (expired)
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "cache: purged %lu expired DNS entries", expired);
+
                return true;
        }
 
        void Rehash(const std::string& dnsserver, std::string sourceaddr, unsigned int sourceport)
        {
-               if (this->GetFd() > -1)
+               if (this->HasFd())
                {
                        SocketEngine::Shutdown(this, 2);
                        SocketEngine::Close(this);
@@ -693,7 +715,7 @@ class MyManager : public Manager, public Timer, public EventHandler
                irc::sockets::aptosa(dnsserver, DNS::PORT, myserver);
 
                /* Initialize mastersocket */
-               int s = socket(myserver.sa.sa_family, SOCK_DGRAM, 0);
+               int s = socket(myserver.family(), SOCK_DGRAM, 0);
                this->SetFd(s);
 
                /* Have we got a socket? */
@@ -706,9 +728,9 @@ class MyManager : public Manager, public Timer, public EventHandler
                        if (sourceaddr.empty())
                        {
                                // set a sourceaddr for irc::sockets::aptosa() based on the servers af type
-                               if (myserver.sa.sa_family == AF_INET)
+                               if (myserver.family() == AF_INET)
                                        sourceaddr = "0.0.0.0";
-                               else if (myserver.sa.sa_family == AF_INET6)
+                               else if (myserver.family() == AF_INET6)
                                        sourceaddr = "::";
                        }
                        irc::sockets::aptosa(sourceaddr, sourceport, bindto);
@@ -727,7 +749,7 @@ class MyManager : public Manager, public Timer, public EventHandler
                                this->SetFd(-1);
                        }
 
-                       if (bindto.sa.sa_family != myserver.sa.sa_family)
+                       if (bindto.family() != myserver.family())
                                ServerInstance->Logs->Log(MODNAME, LOG_SPARSE, "Nameserver address family differs from source address family - hostnames might not resolve");
                }
                else
@@ -817,7 +839,7 @@ class ModuleDNS : public Module
                ConfigTag* tag = ServerInstance->Config->ConfValue("dns");
                DNSServer = tag->getString("server");
                SourceIP = tag->getString("sourceip");
-               SourcePort = tag->getInt("sourceport", 0, 0, 65535);
+               SourcePort = tag->getUInt("sourceport", 0, 0, UINT16_MAX);
 
                if (DNSServer.empty())
                        FindDNSServer();
@@ -847,7 +869,7 @@ class ModuleDNS : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("DNS support", VF_CORE|VF_VENDOR);
+               return Version("Provides support for DNS lookups", VF_CORE|VF_VENDOR);
        }
 };