]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
zonemd: reflect changes in configuration when reloaded
authorLibor Peltan <libor.peltan@nic.cz>
Thu, 2 Sep 2021 14:27:48 +0000 (16:27 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Tue, 7 Sep 2021 13:38:52 +0000 (15:38 +0200)
src/knot/updates/zone-update.c
src/knot/zone/digest.c
src/knot/zone/digest.h
src/knot/zone/zonedb-load.c
tests-extra/tests/zone/zonemd_flush/test.py

index fac41fb465ffea290537afab79ec6d5544ed88ee..16387abdc1dc5fa6ad80eacb5acde8dc71e19e1a 100644 (file)
@@ -887,7 +887,8 @@ int zone_update_commit(conf_t *conf, zone_update_t *update)
        bool do_digest = (digest_alg != ZONE_DIGEST_NONE && !dnssec); // in case of DNSSEC, digest is part of signing routine
        if (do_digest && !(update->flags & UPDATE_FULL) && zone_update_to(update) == NULL) {
                // cold start, decide if (digest & bump SOA) or NOOP
-               if (zone_contents_digest_exists(update->new_cont, digest_alg)) { // yes, computing hash twice, but in rare situation: cold start & exists & invalid
+               // yes, computing hash twice, but in rare situation: cold start & exists & invalid
+               if (zone_contents_digest_exists(update->new_cont, digest_alg, false)) {
                        do_digest = false;
                } else {
                        ret = zone_update_increment_soa(update, conf);
index 81f44e024025c38cd6d3d37c51be2ed8bb6848e2..ebb3bbb6e01a80a8bba260f231f36cb06a7714eb 100644 (file)
@@ -173,13 +173,21 @@ static int verify_zonemd(const knot_rdata_t *zonemd, const zone_contents_t *cont
        return ret;
 }
 
-bool zone_contents_digest_exists(const zone_contents_t *contents, uint8_t alg)
+bool zone_contents_digest_exists(const zone_contents_t *contents, uint8_t alg, bool no_verify)
 {
+       if (alg == 0) {
+               return true;
+       }
+
        knot_rdataset_t *zonemd = node_rdataset(contents->apex, KNOT_RRTYPE_ZONEMD);
        if (zonemd == NULL || zonemd->count != 1 || knot_zonemd_algorithm(zonemd->rdata) != alg) {
                return false;
        }
 
+       if (no_verify) {
+               return true;
+       }
+
        return verify_zonemd(zonemd->rdata, contents) == KNOT_EOK;
 }
 
index 64f33acbda3583d1f0964f4d574499a71bbcbb1d..e2910f33f21dc6159edbf50460883770a4b7d8a3 100644 (file)
@@ -36,8 +36,9 @@ int zone_contents_digest(const zone_contents_t *contents, int algorithm,
  *
  * \param contents   Zone contents to be verified.
  * \param alg        Required algorithm of the ZONEMD.
+ * \param no_verify  Don't verify the validness of the digest in ZONEMD.
  */
-bool zone_contents_digest_exists(const zone_contents_t *contents, uint8_t alg);
+bool zone_contents_digest_exists(const zone_contents_t *contents, uint8_t alg, bool no_verify);
 
 /*!
  * \brief Verify zone dgest in ZONEMD record.
index a8152f28d1cd3133d725dbe2197c3d720b34f15a..1d056ed6ccc0e0a2755ad5ee84b46ff67081db91 100644 (file)
@@ -23,6 +23,7 @@
 #include "knot/conf/module.h"
 #include "knot/events/replan.h"
 #include "knot/journal/journal_metadata.h"
+#include "knot/zone/digest.h"
 #include "knot/zone/timers.h"
 #include "knot/zone/zone-load.h"
 #include "knot/zone/zone.h"
@@ -100,6 +101,11 @@ static zone_t *create_zone_reload(conf_t *conf, const knot_dname_t *name,
 
        bool conf_updated = (old_zone->change_type & CONF_IO_TRELOAD);
 
+       conf_val_t digest = conf_zone_get(conf, C_ZONEMD_GENERATE, name);
+       if (zone->contents != NULL && !zone_contents_digest_exists(zone->contents, conf_opt(&digest), true)) {
+               conf_updated = true;
+       }
+
        if ((zone_file_updated(conf, old_zone, name) || conf_updated) && !zone_expired(zone)) {
                replan_load_updated(zone, old_zone);
        } else {
index 210c7b3b00bb99e879228dd37d0564dd713cce8b..7af8d7ef4bb2b599dcee67c54c07636191e2675d 100644 (file)
@@ -31,8 +31,15 @@ master.zonemd_generate = "zonemd-sha384"
 
 t.start()
 
-master.zones_wait(zone)
+serial = master.zones_wait(zone)
 t.sleep(4)
 check_zonemd(master, zone, "1")
 
+master.zonemd_generate = "zonemd-sha512"
+master.gen_confile()
+master.reload()
+master.zones_wait(zone, serial)
+t.sleep(4)
+check_zonemd(master, zone, "2")
+
 t.end()