@@ -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