From faa18c2f1e64b64f3c4b26af88c72fdccd3d0da5 Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Fri, 9 Jun 2023 14:56:29 -0700 Subject: [PATCH] Support in zonefiles [#942]. --- dns/zonefile.py | 20 ++++++++++++++++---- tests/test_zone.py | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/dns/zonefile.py b/dns/zonefile.py index 48bedadb..563722e6 100644 --- a/dns/zonefile.py +++ b/dns/zonefile.py @@ -191,10 +191,6 @@ class Reader: self.last_ttl_known = True token = None except dns.ttl.BadTTL: - if self.default_ttl_known: - ttl = self.default_ttl - elif self.last_ttl_known: - ttl = self.last_ttl self.tok.unget(token) # Class @@ -212,6 +208,22 @@ class Reader: if rdclass != self.zone_rdclass: raise dns.exception.SyntaxError("RR class is not zone's class") + if ttl is None: + # support for syntax + token = self._get_identifier() + ttl = None + try: + ttl = dns.ttl.from_text(token.value) + self.last_ttl = ttl + self.last_ttl_known = True + token = None + except dns.ttl.BadTTL: + if self.default_ttl_known: + ttl = self.default_ttl + elif self.last_ttl_known: + ttl = self.last_ttl + self.tok.unget(token) + # Type if self.force_rdtype is not None: rdtype = self.force_rdtype diff --git a/tests/test_zone.py b/tests/test_zone.py index 78736567..eca81e01 100644 --- a/tests/test_zone.py +++ b/tests/test_zone.py @@ -58,6 +58,14 @@ ns1 3600 IN A 10.0.0.1 ns2 3600 IN A 10.0.0.2 """ +example_text_output_class_before_ttl = """@ IN 3600 SOA foo bar 1 2 3 4 5 +@ 3600 NS ns1 ; no class +@ NS ns2 ; no class or TTL, TTL inferred from prior record +bar.foo IN 300 MX 0 blaz.foo +ns1 IN 3600 A 10.0.0.1 +ns2 IN 3600 A 10.0.0.2 +""" + example_generate = """@ 3600 IN SOA foo bar 1 2 3 4 5 @ 3600 IN NS ns $GENERATE 9-12 a.$ A 10.0.0.$ @@ -503,6 +511,13 @@ class ZoneTestCase(unittest.TestCase): z2 = dns.zone.from_text(example_text_output, "example.", relativize=True) self.assertEqual(z1, z2) + def testEqualClassBeforeTTL(self): + z1 = dns.zone.from_text( + example_text_output_class_before_ttl, "example.", relativize=True + ) + z2 = dns.zone.from_text(example_text_output, "example.", relativize=True) + self.assertEqual(z1, z2) + def testNotEqual1(self): z1 = dns.zone.from_text(example_text, "example.", relativize=True) z2 = dns.zone.from_text(something_quite_similar, "example.", relativize=True) -- 2.47.3