summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2021-01-19 08:42:44 +0000
committerSadie Powell <sadie@witchery.services>2021-01-19 08:42:44 +0000
commita601cf2f0d9754e4bb11a28ce8954a86ad4e367e (patch)
tree89d7d1bec18c64b42bac8955c9ca7646dc05f750
parentebe3e3f3cfef79e5b92b4c1d8fc9913dac4ddf43 (diff)
Add <dns:enabled>; allows disabling DNS lookups entirely.
Ref: #1839.
-rw-r--r--include/modules/dns.h1
-rw-r--r--src/coremods/core_dns.cpp56
2 files changed, 40 insertions, 17 deletions
diff --git a/include/modules/dns.h b/include/modules/dns.h
index 8ac90f7de..6e7527a55 100644
--- a/include/modules/dns.h
+++ b/include/modules/dns.h
@@ -57,6 +57,7 @@ namespace DNS
enum Error
{
ERROR_NONE,
+ ERROR_DISABLED,
ERROR_UNKNOWN,
ERROR_UNLOADED,
ERROR_TIMEDOUT,
diff --git a/src/coremods/core_dns.cpp b/src/coremods/core_dns.cpp
index aec413207..dbfb0b582 100644
--- a/src/coremods/core_dns.cpp
+++ b/src/coremods/core_dns.cpp
@@ -409,19 +409,6 @@ class MyManager : public Manager, public Timer, public EventHandler
this->cache[r.question] = r;
}
- void Close()
- {
- // Shutdown the socket if it exists.
- if (HasFd())
- {
- SocketEngine::Shutdown(this, 2);
- SocketEngine::Close(this);
- }
-
- // Remove all entries from the cache.
- cache.clear();
- }
-
public:
DNS::Request* requests[MAX_REQUEST_ID+1];
@@ -453,11 +440,32 @@ class MyManager : public Manager, public Timer, public EventHandler
}
}
+ void Close()
+ {
+ // Shutdown the socket if it exists.
+ if (HasFd())
+ {
+ SocketEngine::Shutdown(this, 2);
+ SocketEngine::Close(this);
+ }
+
+ // Remove all entries from the cache.
+ cache.clear();
+ }
+
void Process(DNS::Request* req) CXX11_OVERRIDE
{
if ((unloading) || (req->creator->dying))
throw Exception("Module is being unloaded");
+ if (!HasFd())
+ {
+ Query rr(req->question);
+ rr.error = ERROR_DISABLED;
+ req->OnError(&rr);
+ return;
+ }
+
ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Processing request to lookup " + req->question.name + " of type " + ConvToStr(req->question.type) + " to " + this->myserver.addr());
/* Create an id */
@@ -547,6 +555,8 @@ class MyManager : public Manager, public Timer, public EventHandler
case ERROR_DOMAIN_NOT_FOUND:
case ERROR_NO_RECORDS:
return "Domain not found";
+ case ERROR_DISABLED:
+ return "DNS lookups are disabled";
case ERROR_NONE:
case ERROR_UNKNOWN:
default:
@@ -838,13 +848,25 @@ class ModuleDNS : public Module
void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
- std::string oldserver = DNSServer;
- const std::string oldip = SourceIP;
- const unsigned int oldport = SourcePort;
-
ConfigTag* tag = ServerInstance->Config->ConfValue("dns");
+ if (!tag->getBool("enabled", true))
+ {
+ // Clear these so they get reset if DNS is enabled again.
+ DNSServer.clear();
+ SourceIP.clear();
+ SourcePort = 0;
+
+ this->manager.Close();
+ return;
+ }
+
+ const std::string oldserver = DNSServer;
DNSServer = tag->getString("server");
+
+ const std::string oldip = SourceIP;
SourceIP = tag->getString("sourceip");
+
+ const unsigned int oldport = SourcePort;
SourcePort = tag->getUInt("sourceport", 0, 0, UINT16_MAX);
if (DNSServer.empty())