From: Björn Victor Date: Mon, 12 Nov 2018 07:58:25 +0000 (+0100) Subject: Support for Chaos A records X-Git-Tag: v1.16.0~11^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e78420b473d328dd05eda2831beff9e694d8d4a6;p=thirdparty%2Fdnspython.git Support for Chaos A records Based on MX records. Adds functionality to the tokenizer to read octal 16-bit numbers. --- diff --git a/Makefile b/Makefile index ce3e7161..daa5803c 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ distclean: clean docclean doc: epydoc -v -n dnspython -u http://www.dnspython.org \ dns/*.py dns/rdtypes/*.py dns/rdtypes/ANY/*.py \ + dns/rdtypes/CH/*.py \ dns/rdtypes/IN/*.py dockits: doc diff --git a/dns/rdtypes/CH/A.py b/dns/rdtypes/CH/A.py new file mode 100644 index 00000000..bbaec74e --- /dev/null +++ b/dns/rdtypes/CH/A.py @@ -0,0 +1,68 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase +import struct + +class A(dns.rdtypes.mxbase.MXBase): + + """A record for Chaosnet + @ivar domain: the domain of the address + @type domain: dns.name.Name object + @ivar address: the 16-bit address + @type address: int""" + + __slots__ = ['domain', 'address'] + + def __init__(self, rdclass, rdtype, address, domain): + super(dns.rdtypes.mxbase.MXBase, self).__init__(rdclass, rdtype) + self.domain = domain + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + domain = self.domain.choose_relativity(origin, relativize) + return '%s %o' % (domain, self.address) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + domain = tok.get_name() + address = tok.get_uint16(base=8) + domain = domain.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, address, domain) + + def to_wire(self, file, compress=None, origin=None): + self.domain.to_wire(file, compress, origin) + pref = struct.pack("!H", self.address) + file.write(pref) + + def to_digestable(self, origin=None): + return self.domain.to_digestable(origin) + \ + struct.pack("!H", self.address) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (domain, cused) = dns.name.from_wire(wire[: current + rdlen-2], + current) + current += cused + (address,) = struct.unpack('!H', wire[current: current + 2]) + if cused+2 != rdlen: + raise dns.exception.FormError + if origin is not None: + domain = domain.relativize(origin) + return cls(rdclass, rdtype, address, domain) + + def choose_relativity(self, origin=None, relativize=True): + self.domain = self.domain.choose_relativity(origin, relativize) diff --git a/dns/rdtypes/CH/__init__.py b/dns/rdtypes/CH/__init__.py new file mode 100644 index 00000000..6a70e10e --- /dev/null +++ b/dns/rdtypes/CH/__init__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Class CH rdata type classes.""" + +__all__ = [ + 'A', +] diff --git a/dns/rdtypes/__init__.py b/dns/rdtypes/__init__.py index 826efbb6..12bb7899 100644 --- a/dns/rdtypes/__init__.py +++ b/dns/rdtypes/__init__.py @@ -18,6 +18,7 @@ __all__ = [ 'ANY', 'IN', + 'CH', 'euibase', 'mxbase', 'nsbase', diff --git a/dns/tokenizer.py b/dns/tokenizer.py index 3c9bd370..993391e5 100644 --- a/dns/tokenizer.py +++ b/dns/tokenizer.py @@ -432,7 +432,7 @@ class Tokenizer(object): # Helpers - def get_int(self): + def get_int(self,base=10): """Read the next token and interpret it as an integer. Raises dns.exception.SyntaxError if not an integer. @@ -445,7 +445,7 @@ class Tokenizer(object): raise dns.exception.SyntaxError('expecting an identifier') if not token.value.isdigit(): raise dns.exception.SyntaxError('expecting an integer') - return int(token.value) + return int(token.value,base) def get_uint8(self): """Read the next token and interpret it as an 8-bit unsigned @@ -462,7 +462,7 @@ class Tokenizer(object): '%d is not an unsigned 8-bit integer' % value) return value - def get_uint16(self): + def get_uint16(self,base=10): """Read the next token and interpret it as a 16-bit unsigned integer. @@ -471,10 +471,14 @@ class Tokenizer(object): Returns an int. """ - value = self.get_int() + value = self.get_int(base=base) if value < 0 or value > 65535: - raise dns.exception.SyntaxError( - '%d is not an unsigned 16-bit integer' % value) + if base==8: + raise dns.exception.SyntaxError( + '%o is not an octal unsigned 16-bit integer' % value) + else: + raise dns.exception.SyntaxError( + '%d is not an unsigned 16-bit integer' % value) return value def get_uint32(self): diff --git a/setup.py b/setup.py index 7f43ca61..8ab05346 100755 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ direct manipulation of DNS zones, messages, names, and records.""", 'author_email' : 'halley@dnspython.org', 'license' : 'BSD-like', 'url' : 'http://www.dnspython.org', - 'packages' : ['dns', 'dns.rdtypes', 'dns.rdtypes.IN', 'dns.rdtypes.ANY'], + 'packages' : ['dns', 'dns.rdtypes', 'dns.rdtypes.IN', 'dns.rdtypes.ANY', 'dns.rdtypes.CH'], 'package_data' : {'dns': ['py.typed']}, 'download_url' : \ 'http://www.dnspython.org/kits/%s/dnspython-%s.tar.gz' % (version, version),