Skip to content

Commit 002296a

Browse files
committed
fix subtree validation
1 parent 3573eb9 commit 002296a

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

dim-testsuite/t/rr-create-dname-1.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ $ ndcli create rr hr.dept.old.example.com. a 1.2.3.8 -q
9090

9191
# Cleanup
9292
$ ndcli delete zone old.example.com --cleanup
93-
INFO - Deleting RR hr.dept.old.example.com A 1.2.3.8 from zone old.example.com
94-
INFO - Freeing IP 1.2.3.8 from layer3domain default
9593
INFO - Deleting RR conflict A 1.2.3.4 from zone old.example.com
9694
INFO - Freeing IP 1.2.3.4 from layer3domain default
95+
INFO - Deleting RR hr.dept A 1.2.3.8 from zone old.example.com
96+
INFO - Freeing IP 1.2.3.8 from layer3domain default
9797
INFO - Deleting RR test DNAME test.new.example.com. from zone old.example.com
9898
$ ndcli delete zone new.example.com --cleanup

dim/dim/dns.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,17 @@ def check_new_rr(new_rr):
195195
.filter(~RR.type.in_(('NS', 'DS'))).count():
196196
raise InvalidParameterError('%s cannot be created because other RRs with the same name exist' % new_rr)
197197
# Check for conflicting records under the DNAME subtree
198-
dname_prefix = new_rr.name[:-1] if new_rr.name.endswith('.') else new_rr.name
199-
if _same_view_or_different_zone(new_rr)\
200-
.filter(RR.name.like(dname_prefix + '.%')).count():
201-
raise InvalidParameterError('%s cannot be created because RRs exist under the DNAME subtree' % new_rr)
198+
# Records under the DNAME subtree are those that are subdomains of the DNAME
199+
dname_name = new_rr.name if new_rr.name.endswith('.') else new_rr.name + '.'
200+
201+
# Find all records that could be under this DNAME subtree
202+
all_records = _same_view_or_different_zone(new_rr).filter(RR.name != dname_name).all()
203+
204+
for record in all_records:
205+
record_name = record.name if record.name.endswith('.') else record.name + '.'
206+
# Check if this record is a subdomain of the DNAME
207+
if record_name != dname_name and record_name.endswith('.' + dname_name):
208+
raise InvalidParameterError('%s cannot be created because RRs exist under the DNAME subtree' % new_rr)
202209
elif new_rr.type == 'PTR':
203210
if _same_view_or_different_zone(new_rr)\
204211
.filter(RR.type == 'CNAME').filter(RR.name == new_rr.name).count():
@@ -214,8 +221,12 @@ def check_new_rr(new_rr):
214221
# Check if new record is under a DNAME subtree
215222
dname_records = _same_view_or_different_zone(new_rr).filter(RR.type == 'DNAME').all()
216223
for dname in dname_records:
217-
dname_prefix = dname.name[:-1] if dname.name.endswith('.') else dname.name
218-
if new_rr.name.startswith(dname_prefix + '.'):
224+
# Normalize names by ensuring they end with a dot
225+
dname_name = dname.name if dname.name.endswith('.') else dname.name + '.'
226+
new_rr_name = new_rr.name if new_rr.name.endswith('.') else new_rr.name + '.'
227+
228+
# Check if the new record is a subdomain under the DNAME
229+
if new_rr_name != dname_name and new_rr_name.endswith('.' + dname_name):
219230
raise InvalidParameterError('%s cannot be created under DNAME subtree %s' % (new_rr, dname.name))
220231

221232

0 commit comments

Comments
 (0)