]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
ixfrdist: implement webserver ACL
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 12 Nov 2018 15:01:55 +0000 (16:01 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 12 Nov 2018 15:01:55 +0000 (16:01 +0100)
pdns/ixfrdist-web.cc
pdns/ixfrdist-web.hh
pdns/ixfrdist.cc
pdns/ixfrdist.example.yml

index 3b38c346f0c56c6617ffa9d530ff37e360f3d380..506d8c4646274e040182e4fdaa4b48bed1a1c51a 100644 (file)
 #include "ixfrdist-web.hh"
 #include <thread>
 #include "threadname.hh"
+#include "iputils.hh"
 #include "ixfrdist-stats.hh"
 
 string doGetStats();
 
-IXFRDistWebServer::IXFRDistWebServer(const ComboAddress &listenAddress) {
+IXFRDistWebServer::IXFRDistWebServer(const ComboAddress &listenAddress, const NetmaskGroup &acl) {
   // TODO wrap in smart pointer
   d_ws = new WebServer(listenAddress.toString() , listenAddress.getPort());
+  d_ws->setACL(acl);
   d_ws->bind();
 }
 
index a921e182d1de6a8bc6eb85ea80d308d9c25662eb..e6aaae398c62cc32b375322161c9701d541f8bec 100644 (file)
@@ -27,7 +27,7 @@
 class IXFRDistWebServer
 {
   public:
-    explicit IXFRDistWebServer(const ComboAddress &listenAddress);
+    explicit IXFRDistWebServer(const ComboAddress &listenAddress, const NetmaskGroup &acl);
     void go();
 
   private:
index 8f412a8d671c00796c5cfae7fed09c8ed9b2d44b..d82f5138435557f1213a198775c4be7beaae6706 100644 (file)
@@ -100,6 +100,26 @@ struct convert<DNSName> {
     }
   }
 };
+
+template<>
+struct convert<Netmask> {
+  static Node encode(const Netmask& rhs) {
+    return Node(rhs.toString());
+  }
+  static bool decode(const Node& node, Netmask& rhs) {
+    if (!node.IsScalar()) {
+      return false;
+    }
+    try {
+      rhs = Netmask(node.as<string>());
+      return true;
+    } catch(const runtime_error &e) {
+      return false;
+    } catch (const PDNSException &e) {
+      return false;
+    }
+  }
+};
 } // namespace YAML
 
 struct ixfrdiff_t {
@@ -1084,6 +1104,16 @@ static bool parseAndCheckConfig(const string& configpath, YAML::Node& config) {
     }
   }
 
+  if (config["webserver-acl"]) {
+    try {
+      config["webserver-acl"].as<vector<Netmask>>();
+    }
+    catch (const runtime_error &e) {
+      g_log<<Logger::Error<<"Unable to read 'webserver-address' value: "<<e.what()<<endl;
+      retval = false;
+    }
+  }
+
   return retval;
 }
 
@@ -1215,7 +1245,18 @@ int main(int argc, char** argv) {
   }
 
   if (config["webserver-address"]) {
-    auto ws = IXFRDistWebServer(config["webserver-address"].as<ComboAddress>());
+    NetmaskGroup wsACL;
+    wsACL.addMask("127.0.0.0/8");
+    wsACL.addMask("::1/128");
+
+    if (config["webserver-acl"]) {
+      wsACL.clear();
+      for (const auto &acl : config["webserver-acl"].as<vector<Netmask>>()) {
+        wsACL.addMask(acl);
+      }
+    }
+
+    auto ws = IXFRDistWebServer(config["webserver-address"].as<ComboAddress>(), wsACL);
     ws.go();
   }
 
index 67e1320a9f2dbcda728feff58788b2c84b54e255..e7c8c4e7d723182f05f822b868d0f4604ca17de6 100644 (file)
@@ -75,6 +75,13 @@ tcp-in-threads: 10
 #
 webserver-address: 127.0.0.1:8080
 
+# The IP address(masks) that allowed to access the webserver. When not set,
+# it defaults to 127.0.0.0/8, ::1/128
+#
+webserver-acl:
+  - 127.0.0.0/8
+  - ::1/128
+
 # The domains to redistribute, the 'master' and 'domains' keys are mandatory.
 # When no port is specified, 53 is used. When specifying ports for IPv6, use the
 # "bracket" notation: