]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Factor out ZONEMD procesing of single DNSRecord, saves having to save a vector of...
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 18 Jan 2022 09:25:53 +0000 (10:25 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 21 Jan 2022 11:06:01 +0000 (12:06 +0100)
pdns/recursordist/rec-zonetocache.cc
pdns/zonemd.cc
pdns/zonemd.hh

index cf5907ebff2832a6c193f426ae4d165d936a3477..57fc96e3fd1bb24334cc659e2c82b505cbbcff73 100644 (file)
@@ -144,11 +144,11 @@ pdns::ZoneMD::Result ZoneData::getByAXFR(const RecZoneToCache::Config& config)
   time_t axfrStart = time(nullptr);
   time_t axfrNow = time(nullptr);
 
-  vector<DNSRecord> v;
+  auto zonemd = pdns::ZoneMD(d_zone);
   while (axfr.getChunk(nop, &chunk, (axfrStart + axfrTimeout - axfrNow))) {
     for (auto& dr : chunk) {
       if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
-        v.push_back(dr);
+        zonemd.readRecord(dr);
       }
       parseDRForCache(dr);
     }
@@ -158,8 +158,6 @@ pdns::ZoneMD::Result ZoneData::getByAXFR(const RecZoneToCache::Config& config)
     }
   }
   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) {
@@ -216,17 +214,15 @@ pdns::ZoneMD::Result ZoneData::processLines(const vector<string>& lines, const R
   zpt.setMaxGenerateSteps(1);
   zpt.setMaxIncludes(0);
 
-  std::vector<DNSRecord> v;
+  auto zonemd = pdns::ZoneMD(d_zone);
   while (zpt.get(drr)) {
     DNSRecord dr(drr);
     if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
-      v.push_back(dr);
+      zonemd.readRecord(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) {
index 1cce94b2ed9efac16d9084f460f0790a207d394d..c90186da0382533325410f493f480846a3c1402e 100644 (file)
@@ -48,28 +48,33 @@ void pdns::ZoneMD::readRecords(ZoneParserTNG& zpt)
 void pdns::ZoneMD::readRecords(const vector<DNSRecord>& records)
 {
   for (auto& record : records) {
-    if (!record.d_name.isPartOf(d_zone) && record.d_name != d_zone) {
-      continue;
-    }
-    if (record.d_type == QType::SOA && d_soaRecordContent) {
-      continue;
-    }
+    readRecord(record);
+  }
+}
 
-    if (record.d_type == QType::SOA && record.d_name == d_zone) {
-      d_soaRecordContent = std::dynamic_pointer_cast<SOARecordContent>(record.d_content);
+void pdns::ZoneMD::readRecord(const DNSRecord& record)
+{
+  if (!record.d_name.isPartOf(d_zone) && record.d_name != d_zone) {
+    return;
     }
-    if (record.d_type == QType::ZONEMD && record.d_name == d_zone) {
-      auto zonemd = std::dynamic_pointer_cast<ZONEMDRecordContent>(record.d_content);
-      auto inserted = d_zonemdRecords.insert({pair(zonemd->d_scheme, zonemd->d_hashalgo), {zonemd, false}});
-      if (!inserted.second) {
-        // Mark as duplicate
-        inserted.first->second.duplicate = true;
-      }
+  if (record.d_type == QType::SOA && d_soaRecordContent) {
+    return;
+  }
+
+  if (record.d_type == QType::SOA && record.d_name == d_zone) {
+    d_soaRecordContent = std::dynamic_pointer_cast<SOARecordContent>(record.d_content);
+  }
+  if (record.d_type == QType::ZONEMD && record.d_name == d_zone) {
+    auto zonemd = std::dynamic_pointer_cast<ZONEMDRecordContent>(record.d_content);
+    auto inserted = d_zonemdRecords.insert({pair(zonemd->d_scheme, zonemd->d_hashalgo), {zonemd, false}});
+    if (!inserted.second) {
+      // Mark as duplicate
+      inserted.first->second.duplicate = true;
     }
-    RRSetKey_t key = std::pair(record.d_name, record.d_type);
-    d_resourceRecordSets[key].push_back(record.d_content);
-    d_resourceRecordSetTTLs[key] = record.d_ttl;
   }
+  RRSetKey_t key = std::pair(record.d_name, record.d_type);
+  d_resourceRecordSets[key].push_back(record.d_content);
+  d_resourceRecordSetTTLs[key] = record.d_ttl;
 }
 
 void pdns::ZoneMD::verify(bool& validationDone, bool& validationOK)
index bafcef3ee22b03699b4413f54d1087e70c12f951..2daeea94bdbf7e21f391ae7a473e50cbc5571f7d 100644 (file)
@@ -41,7 +41,9 @@ public:
     Ignore,
     Process,
     LogOnly,
-    Required
+    Required,
+    RequiredWithDNSSEC,
+    RequiredIgnoreDNSSEC,
   };
   enum class Result : uint8_t
   {
@@ -55,6 +57,7 @@ public:
   {}
   void readRecords(ZoneParserTNG& zpt);
   void readRecords(const std::vector<DNSRecord>& records);
+  void readRecord(const DNSRecord& record);
   void verify(bool& validationDone, bool& validationOK);
 
 private: