From 7614763ea476e512bc1ec7ffaed531a1879db99e Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Wed, 28 Feb 2024 11:01:47 +0100 Subject: [PATCH] Relativise record names to zone name --- netbox_dns/models/record.py | 2 +- .../tests/record/test_name_validation.py | 3 - netbox_dns/tests/record/test_normalization.py | 97 +++++++++++++++++++ 3 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 netbox_dns/tests/record/test_normalization.py diff --git a/netbox_dns/models/record.py b/netbox_dns/models/record.py index 2b24d9b0..28e71db7 100644 --- a/netbox_dns/models/record.py +++ b/netbox_dns/models/record.py @@ -419,7 +419,7 @@ def validate_name(self): zone.to_unicode() name.to_unicode() - self.name = name.to_text() + self.name = name.relativize(zone).to_text() except dns.exception.DNSException as exc: raise ValidationError( diff --git a/netbox_dns/tests/record/test_name_validation.py b/netbox_dns/tests/record/test_name_validation.py index 112d3268..a64da6be 100644 --- a/netbox_dns/tests/record/test_name_validation.py +++ b/netbox_dns/tests/record/test_name_validation.py @@ -82,8 +82,6 @@ def test_name_validation_ok(self): name=record.get("name"), zone=record.get("zone"), **self.record_data ) - self.assertEqual(record_object.name, record.get("name")) - def test_srv_validation_ok(self): record = Record.objects.create( name="_ldaps._tcp", @@ -156,7 +154,6 @@ def test_name_validation_tolerant_ok(self): record_object = Record.objects.create( name=record.get("name"), zone=record.get("zone"), **self.record_data ) - self.assertEqual(record_object.name, record.get("name")) @override_settings( PLUGINS_CONFIG={ diff --git a/netbox_dns/tests/record/test_normalization.py b/netbox_dns/tests/record/test_normalization.py new file mode 100644 index 00000000..c294026b --- /dev/null +++ b/netbox_dns/tests/record/test_normalization.py @@ -0,0 +1,97 @@ +from django.test import TestCase, override_settings +from django.core.exceptions import ValidationError + +from netbox_dns.models import Zone, Record, RecordTypeChoices, NameServer + + +class RecordValidationTest(TestCase): + zone_data = { + "default_ttl": 86400, + "soa_rname": "hostmaster.example.com", + "soa_refresh": 43200, + "soa_retry": 7200, + "soa_expire": 2419200, + "soa_ttl": 86400, + "soa_minimum": 3600, + "soa_serial": 1, + } + + record_data = { + "ttl": 86400, + } + + @classmethod + def setUpTestData(cls): + cls.nameserver = NameServer.objects.create(name="ns1.example.com") + cls.zones = [ + Zone(name="zone1.example.com", **cls.zone_data, soa_mname=cls.nameserver), + ] + Zone.objects.bulk_create(cls.zones) + + def test_normalize_to_empty_name(self): + f_zone = self.zones[0] + + record = Record.objects.create( + name="zone1.example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + ) + + self.assertEqual(record.name, "@") + + def test_normalize_to_relative_name(self): + f_zone = self.zones[0] + + record = Record.objects.create( + name="sub.zone1.example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + ) + + self.assertEqual(record.name, "sub") + + def test_normalize_to_empty_name_nonmatching_zone(self): + f_zone = self.zones[0] + + with self.assertRaises(ValidationError): + Record.objects.create( + name="zone2.example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + ) + + def test_normalize_to_relative_name_nonmatching_zone(self): + f_zone = self.zones[0] + + with self.assertRaises(ValidationError): + Record.objects.create( + name="sub.zone2.example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + ) + + def test_normalize_to_empty_name_parent_zone(self): + f_zone = self.zones[0] + + with self.assertRaises(ValidationError): + Record.objects.create( + name="example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + ) + + def test_normalize_to_relative_name_parent_zone(self): + f_zone = self.zones[0] + + with self.assertRaises(ValidationError): + Record.objects.create( + name="example.com.", + zone=f_zone, + type=RecordTypeChoices.A, + value="10.0.1.42", + )