From: Bob Halley Date: Tue, 10 Jan 2006 23:15:41 +0000 (+0000) Subject: allow BIND 8 TTL syntax in ttl-like places (SOA, SIG, RRSIG) X-Git-Tag: v1.4.0~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=282d7476c1efb455dcc1a1dee2a4cf61928e9faa;p=thirdparty%2Fdnspython.git allow BIND 8 TTL syntax in ttl-like places (SOA, SIG, RRSIG) --- diff --git a/ChangeLog b/ChangeLog index 7ad27580..70704975 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,10 @@ * dns/ttl.py: TTLs are now bounds checked to be within the closed interval [0, 2^31 - 1]. + * The BIND 8 TTL syntax is now accepted in the SOA refresh, retry, + expire, and minimum fields, and in the original_ttl field of + SIG and RRSIG records. + 2006-01-04 Bob Halley * dns/resolver.py: The windows registry irritatingly changes the diff --git a/dns/rdtypes/ANY/SOA.py b/dns/rdtypes/ANY/SOA.py index 9acd5609..a4074066 100644 --- a/dns/rdtypes/ANY/SOA.py +++ b/dns/rdtypes/ANY/SOA.py @@ -66,10 +66,10 @@ class SOA(dns.rdata.Rdata): mname = mname.choose_relativity(origin, relativize) rname = rname.choose_relativity(origin, relativize) serial = tok.get_uint32() - refresh = tok.get_uint32() - retry = tok.get_uint32() - expire = tok.get_uint32() - minimum = tok.get_uint32() + refresh = tok.get_ttl() + retry = tok.get_ttl() + expire = tok.get_ttl() + minimum = tok.get_ttl() tok.get_eol() return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, expire, minimum ) diff --git a/dns/rdtypes/sigbase.py b/dns/rdtypes/sigbase.py index 96e24685..444e909e 100644 --- a/dns/rdtypes/sigbase.py +++ b/dns/rdtypes/sigbase.py @@ -101,7 +101,7 @@ class SIGBase(dns.rdata.Rdata): type_covered = dns.rdatatype.from_text(tok.get_string()) algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) labels = tok.get_int() - original_ttl = tok.get_uint32() + original_ttl = tok.get_ttl() expiration = sigtime_to_posixtime(tok.get_string()) inception = sigtime_to_posixtime(tok.get_string()) key_tag = tok.get_int() diff --git a/dns/tokenizer.py b/dns/tokenizer.py index 4f96a67e..1c1c0ae1 100644 --- a/dns/tokenizer.py +++ b/dns/tokenizer.py @@ -20,6 +20,7 @@ import sys import dns.exception import dns.name +import dns.ttl _DELIMITERS = { ' ' : True, @@ -420,3 +421,9 @@ class Tokenizer(object): raise dns.exception.SyntaxError, \ 'expected EOL or EOF, got %d "%s"' % (ttype, t) return t + + def get_ttl(self): + (ttype, t) = self.get() + if ttype != IDENTIFIER: + raise dns.exception.SyntaxError, 'expecting an identifier' + return dns.ttl.from_text(t) diff --git a/tests/bugs.py b/tests/bugs.py index 8fa9cb54..f038005a 100644 --- a/tests/bugs.py +++ b/tests/bugs.py @@ -18,6 +18,7 @@ import unittest import dns.rdata import dns.rdataclass import dns.rdatatype +import dns.ttl class BugsTestCase(unittest.TestCase): @@ -27,5 +28,17 @@ class BugsTestCase(unittest.TestCase): self.failUnless(rdata.float_latitude == 30.5) self.failUnless(rdata.float_longitude == -100.5) + def test_SOA_BIND8_TTL(self): + rdata1 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, + "a b 100 1s 1m 1h 1d") + rdata2 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, + "a b 100 1 60 3600 86400") + self.failUnless(rdata1 == rdata2) + + def test_TTL_bounds_check(self): + def bad(): + ttl = dns.ttl.from_text("2147483648") + self.failUnlessRaises(dns.ttl.BadTTL, bad) + if __name__ == '__main__': unittest.main()