]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Also add ZONEMD processing for url and file method
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 14 Jan 2022 13:56:50 +0000 (14:56 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 21 Jan 2022 11:06:01 +0000 (12:06 +0100)
pdns/recursordist/Makefile.am
pdns/recursordist/rec-zonetocache.cc
pdns/recursordist/sha.hh [new symlink]
pdns/recursordist/zonemd.cc [new symlink]
pdns/recursordist/zonemd.hh [new symlink]
pdns/zonemd.hh

index f35c9374fd697886378a30fb46a230e0680d704b..012af7a363df73788e8e968ddc50c3bdebecb2cf 100644 (file)
@@ -182,6 +182,7 @@ pdns_recursor_SOURCES = \
        rpzloader.cc rpzloader.hh \
        secpoll-recursor.cc secpoll-recursor.hh \
        secpoll.cc secpoll.hh \
+       sha.hh \
        sholder.hh \
        shuffle.cc shuffle.hh \
        sillyrecords.cc \
index b85a1d0e4790acf183930f8e21798f0a394483f3..cf5907ebff2832a6c193f426ae4d165d936a3477 100644 (file)
@@ -60,6 +60,7 @@ struct ZoneData
   bool isRRSetAuth(const DNSName& qname, QType qtype) const;
   void parseDRForCache(DNSRecord& dr);
   pdns::ZoneMD::Result getByAXFR(const RecZoneToCache::Config&);
+  pdns::ZoneMD::Result processLines(const std::vector<std::string>& lines, const RecZoneToCache::Config& config);
   void ZoneToCache(const RecZoneToCache::Config& config, uint64_t gen);
 };
 
@@ -208,6 +209,36 @@ static std::vector<std::string> getURL(const RecZoneToCache::Config& config)
   return lines;
 }
 
+pdns::ZoneMD::Result ZoneData::processLines(const vector<string>& lines, const RecZoneToCache::Config& config)
+{
+  DNSResourceRecord drr;
+  ZoneParserTNG zpt(lines, d_zone);
+  zpt.setMaxGenerateSteps(1);
+  zpt.setMaxIncludes(0);
+
+  std::vector<DNSRecord> v;
+  while (zpt.get(drr)) {
+    DNSRecord dr(drr);
+    if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
+      v.push_back(dr);
+    }
+    parseDRForCache(dr);
+  }
+  if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
+    auto zonemd = pdns::ZoneMD(d_zone);
+    zonemd.readRecords(v);
+    bool validationDone, validationSuccess;
+    zonemd.verify(validationDone, validationSuccess);
+    if (!validationDone) {
+      return pdns::ZoneMD::Result::NoValidationDone;
+    }
+    if (!validationSuccess) {
+      return pdns::ZoneMD::Result::ValidationFailure;
+    }
+  }
+  return pdns::ZoneMD::Result::OK;
+}
+
 void ZoneData::ZoneToCache(const RecZoneToCache::Config& config, uint64_t configGeneration)
 {
   if (config.d_sources.size() > 1) {
@@ -234,16 +265,7 @@ void ZoneData::ZoneToCache(const RecZoneToCache::Config& config, uint64_t config
       d_log->info("Getting zone from file");
       lines = getLinesFromFile(config.d_sources.at(0));
     }
-    DNSResourceRecord drr;
-    ZoneParserTNG zpt(lines, d_zone);
-    zpt.setMaxGenerateSteps(1);
-    zpt.setMaxIncludes(0);
-
-    while (zpt.get(drr)) {
-      DNSRecord dr(drr);
-      parseDRForCache(dr);
-    }
-    // XXX ZONEMD processing
+    result = processLines(lines, config);
   }
 
   if (config.d_zonemd == pdns::ZoneMD::Config::Required && result != pdns::ZoneMD::Result::OK) {
diff --git a/pdns/recursordist/sha.hh b/pdns/recursordist/sha.hh
new file mode 120000 (symlink)
index 0000000..53ffc66
--- /dev/null
@@ -0,0 +1 @@
+../sha.hh
\ No newline at end of file
diff --git a/pdns/recursordist/zonemd.cc b/pdns/recursordist/zonemd.cc
new file mode 120000 (symlink)
index 0000000..6c9c726
--- /dev/null
@@ -0,0 +1 @@
+../zonemd.cc
\ No newline at end of file
diff --git a/pdns/recursordist/zonemd.hh b/pdns/recursordist/zonemd.hh
new file mode 120000 (symlink)
index 0000000..71c4b07
--- /dev/null
@@ -0,0 +1 @@
+../zonemd.hh
\ No newline at end of file
index 2f4a932d882a43575a650700b9c061d195940eb0..bafcef3ee22b03699b4413f54d1087e70c12f951 100644 (file)
@@ -36,8 +36,19 @@ namespace pdns
 class ZoneMD
 {
 public:
-  enum class Config: uint8_t { Ignore, Process, LogOnly, Required };
-  enum class Result: uint8_t { OK, NoValidationDone, ValidationFailure };
+  enum class Config : uint8_t
+  {
+    Ignore,
+    Process,
+    LogOnly,
+    Required
+  };
+  enum class Result : uint8_t
+  {
+    OK,
+    NoValidationDone,
+    ValidationFailure
+  };
 
   ZoneMD(const DNSName& zone) :
     d_zone(zone)