X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_dns.cpp;h=11c2c823c890b785641c22459b7734ad21c94ff6;hb=ba4a23e248d7d4d54d204bc4b5e20580bfbf7616;hp=1040bb036736b57794529b2256f9b6e875f7d403;hpb=02497bfa999da26c19a92d8620c35bb97f1da711;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_dns.cpp b/src/coremods/core_dns.cpp index 1040bb036..11c2c823c 100644 --- a/src/coremods/core_dns.cpp +++ b/src/coremods/core_dns.cpp @@ -1,8 +1,10 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2013 Adam - * Copyright (C) 2003-2013 Anope Team + * Copyright (C) 2019 Robby + * Copyright (C) 2015, 2017-2020 Sadie Powell + * Copyright (C) 2013-2016 Attila Molnar + * Copyright (C) 2013, 2015-2016 Adam * * 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,34 +682,40 @@ 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); - /* Remove expired entries from the cache */ - this->Tick(ServerInstance->Time()); + // Remove all entries from the cache. + cache.clear(); } 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); } };