From: Otto Moerbeek Date: Tue, 18 Jan 2022 09:25:53 +0000 (+0100) Subject: Factor out ZONEMD procesing of single DNSRecord, saves having to save a vector of... X-Git-Tag: auth-4.7.0-alpha1~42^2~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c3bc297a382f6908703716689da3b6a12ccc6ce;p=thirdparty%2Fpdns.git Factor out ZONEMD procesing of single DNSRecord, saves having to save a vector of them --- diff --git a/pdns/recursordist/rec-zonetocache.cc b/pdns/recursordist/rec-zonetocache.cc index cf5907ebff..57fc96e3fd 100644 --- a/pdns/recursordist/rec-zonetocache.cc +++ b/pdns/recursordist/rec-zonetocache.cc @@ -144,11 +144,11 @@ pdns::ZoneMD::Result ZoneData::getByAXFR(const RecZoneToCache::Config& config) time_t axfrStart = time(nullptr); time_t axfrNow = time(nullptr); - vector 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& lines, const R zpt.setMaxGenerateSteps(1); zpt.setMaxIncludes(0); - std::vector 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) { diff --git a/pdns/zonemd.cc b/pdns/zonemd.cc index 1cce94b2ed..c90186da03 100644 --- a/pdns/zonemd.cc +++ b/pdns/zonemd.cc @@ -48,28 +48,33 @@ void pdns::ZoneMD::readRecords(ZoneParserTNG& zpt) void pdns::ZoneMD::readRecords(const vector& 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(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(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(record.d_content); + } + if (record.d_type == QType::ZONEMD && record.d_name == d_zone) { + auto zonemd = std::dynamic_pointer_cast(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) diff --git a/pdns/zonemd.hh b/pdns/zonemd.hh index bafcef3ee2..2daeea94bd 100644 --- a/pdns/zonemd.hh +++ b/pdns/zonemd.hh @@ -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& records); + void readRecord(const DNSRecord& record); void verify(bool& validationDone, bool& validationOK); private: