From: Libor Peltan Date: Tue, 14 Apr 2020 16:01:27 +0000 (+0200) Subject: catalog: only take PTRs from 'zones' subtree X-Git-Tag: v3.0.0~82^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a27c5023bf4eee6a16645f04287828791cb4e4c;p=thirdparty%2Fknot-dns.git catalog: only take PTRs from 'zones' subtree --- diff --git a/doc/configuration.rst b/doc/configuration.rst index 4a9cbfce14..7fe5da5921 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -609,6 +609,7 @@ It's possible to configure more catalog zones. part of your DNS subtree. Upon catalog zone (re)load or change, all the PTR records in the zone +sub-tree *zones* (e.g. ``unique-id1.zones.catalog. 0 IN PTR member.com.``) are processed and member zones created, with zone names taken from the PTR records' RData, and zone settings taken from the confguration template specified by :ref:`zone_catalog-template`. Owner names of those PTR diff --git a/src/knot/zone/catalog.c b/src/knot/zone/catalog.c index c33733b566..8b21a84a13 100644 --- a/src/knot/zone/catalog.c +++ b/src/knot/zone/catalog.c @@ -327,9 +327,18 @@ static int cat_update_add_node(zone_node_t *node, void *data) int knot_cat_update_from_zone(knot_cat_update_t *u, struct zone_contents *zone, bool remove, knot_catalog_t *check) { + size_t zone_size = knot_dname_size(zone->apex->owner); + knot_dname_t sub[zone_size + 6]; + memcpy(sub, "\x05""zones", 6); + memcpy(sub + 6, zone->apex->owner, zone_size); + + if (zone_contents_find_node(zone, sub) == NULL) { + return KNOT_EOK; + } + cat_upd_ctx_t ctx = { u, zone->apex->owner, remove, check }; pthread_mutex_lock(&u->mutex); - int ret = zone_contents_apply(zone, cat_update_add_node, &ctx); + int ret = zone_tree_sub_apply(zone->nodes, sub, false, cat_update_add_node, &ctx); pthread_mutex_unlock(&u->mutex); return ret; } diff --git a/tests-extra/tests/zone/catalog/data/catalog1.zone b/tests-extra/tests/zone/catalog/data/catalog1.zone index b72a57a336..cc802edfe6 100644 --- a/tests-extra/tests/zone/catalog/data/catalog1.zone +++ b/tests-extra/tests/zone/catalog/data/catalog1.zone @@ -4,4 +4,5 @@ $TTL 0 @ SOA ns admin 1 25 25 80 600 NS ns ns AAAA ::0 -foo.bar PTR cataloged1. +foo.bar.zones PTR cataloged1. +not.zones.in PTR not-cataloged1. diff --git a/tests-extra/tests/zone/catalog/test.py b/tests-extra/tests/zone/catalog/test.py index 5077f9fa34..b0adfed5f6 100644 --- a/tests-extra/tests/zone/catalog/test.py +++ b/tests-extra/tests/zone/catalog/test.py @@ -46,6 +46,8 @@ resp = slave.dig("cataloged1.", "DNSKEY", dnssec=True) resp.check(rcode="NOERROR") resp.check_count(2, "DNSKEY") resp.check_count(1, "RRSIG") +resp = master.dig("not-cataloged1.", "SOA") +resp.check(rcode="REFUSED") # Udating a cataloged zone subprocess.run(["sed", "-i", "s/10001/10002/;$s/$/\\nxyz A 1.2.3.4/", master.dir + "/master/cataloged1.zone"]) @@ -59,7 +61,7 @@ check_keys(slave, "cataloged1", 2) # Check adding cataloged zone. up = master.update(zone[1]) -up.add("bar.catalog1.", 0, "PTR", "cataloged2.") +up.add("bar.zones.catalog1.", 0, "PTR", "cataloged2.") up.send("NOERROR") t.sleep(6) resp = master.dig("cataloged2.", "NS") @@ -81,8 +83,8 @@ resp0 = slave.dig("cataloged2.", "DNSKEY") resp0.check_count(2, "DNSKEY") dnskey0 = resp0.resp.answer[0].to_rdataset()[0] up = master.update(zone[1]) -up.delete("bar.catalog1.", "PTR", "cataloged2.") -up.add("bar.catalog1.", 0, "PTR", "cataloged2.") +up.delete("bar.zones.catalog1.", "PTR", "cataloged2.") +up.add("bar.zones.catalog1.", 0, "PTR", "cataloged2.") up.send("NOERROR") t.sleep(4) resp1 = slave.dig("cataloged2.", "DNSKEY") @@ -100,8 +102,8 @@ else: # Check remove-adding the zone: shall effectively purge it up = master.update(zone[1]) -up.delete("bar.catalog1.", "PTR", "cataloged2.") -up.add("bar2.catalog1.", 0, "PTR", "cataloged2.") +up.delete("bar.zones.catalog1.", "PTR", "cataloged2.") +up.add("bar2.zones.catalog1.", 0, "PTR", "cataloged2.") up.send("NOERROR") t.sleep(4) shutil.copy(t.data_dir + "/cataloged2.zone", master.dir + "/master") # because the purge deletes even zonefile @@ -131,11 +133,11 @@ resp.check_count(1, "RRSIG") # Check adding and removing duplicate up = master.update(zone[1]) -up.add("bar3.catalog1.", 0, "PTR", "cataloged2.") +up.add("bar3.zones.catalog1.", 0, "PTR", "cataloged2.") up.send("NOERROR") t.sleep(6) up = master.update(zone[1]) -up.delete("bar3.catalog1.", "PTR") +up.delete("bar3.zones.catalog1.", "PTR") up.send("NOERROR") t.sleep(6) resp = master.dig("cataloged2.", "SOA") @@ -146,7 +148,7 @@ check_keys(slave, "cataloged2", 2) # Check removing cataloged zone up = master.update(zone[1]) -up.delete("foo.bar.catalog1.", "PTR") +up.delete("foo.bar.zones.catalog1.", "PTR") up.send("NOERROR") t.sleep(6) resp = master.dig("cataloged1.", "SOA")