From e7d9e3dd29af494029fdc7e0dfdaf23616422d47 Mon Sep 17 00:00:00 2001
From: Lubos Slovak <lubos.slovak@nic.cz>
Date: Mon, 9 Dec 2013 19:12:19 +0100
Subject: [PATCH] Delete NSEC chain if NSEC3 is enabled.

Applies both for full zone resign and for DDNS sign.

refs #125
---
 src/libknot/dnssec/zone-nsec.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/libknot/dnssec/zone-nsec.c b/src/libknot/dnssec/zone-nsec.c
index dbf2e1508d..660d23978c 100644
--- a/src/libknot/dnssec/zone-nsec.c
+++ b/src/libknot/dnssec/zone-nsec.c
@@ -620,6 +620,18 @@ static knot_node_t *create_nsec3_node_for_node(knot_node_t *node,
 	return nsec3_node;
 }
 
+static int remove_nsec_from_node(const knot_node_t *node,
+                                 knot_changeset_t *chgset)
+{
+	assert(node);
+	assert(chgset);
+
+	const knot_rrset_t *nsec = knot_node_rrset(node, KNOT_RRTYPE_NSEC);
+	assert(knot_rrset_rdata_rr_count(nsec) <= 1);
+
+	return changeset_remove_nsec(nsec, chgset);
+}
+
 /*!
  * \brief Create NSEC3 node for each regular node in the zone.
  *
@@ -630,7 +642,8 @@ static knot_node_t *create_nsec3_node_for_node(knot_node_t *node,
  * \return Error code, KNOT_EOK if successful.
  */
 static int create_nsec3_nodes(const knot_zone_contents_t *zone, uint32_t ttl,
-                              knot_zone_tree_t *nsec3_nodes)
+                              knot_zone_tree_t *nsec3_nodes,
+                              knot_changeset_t *chgset)
 {
 	assert(zone);
 	assert(nsec3_nodes);
@@ -664,6 +677,14 @@ static int create_nsec3_nodes(const knot_zone_contents_t *zone, uint32_t ttl,
 			break;
 		}
 
+		/* Remove possible NSEC from the node. (Do not allow both NSEC
+		 * and NSEC3 in the zone at once.)
+		 */
+		result = remove_nsec_from_node(node, chgset);
+		if (result != KNOT_EOK) {
+			break;
+		}
+
 		hattrie_iter_next(it);
 	}
 
@@ -721,7 +742,7 @@ static int create_nsec3_chain(const knot_zone_contents_t *zone, uint32_t ttl,
 		return KNOT_ENOMEM;
 	}
 
-	result = create_nsec3_nodes(zone, ttl, nsec3_nodes);
+	result = create_nsec3_nodes(zone, ttl, nsec3_nodes, changeset);
 	if (result != KNOT_EOK) {
 		free_nsec3_tree(nsec3_nodes);
 		return result;
-- 
GitLab