]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add relativize_to to from_text(). 429/head
authorBrian Wellington <bwelling@xbill.org>
Wed, 18 Mar 2020 23:44:09 +0000 (16:44 -0700)
committerBrian Wellington <bwelling@xbill.org>
Wed, 18 Mar 2020 23:44:09 +0000 (16:44 -0700)
When calling from_text, the zone code needs to apply the current origin
(which may or may not be the zone origin, if sub-zone $ORIGIN statements
are present), and may also want to relativize the contents to the zone
origin.

Previously, this was done by explicitly reading records as absolute, and
then relativizing them laster.  With this change, the work is moved to
the tokenizer.

This gets rid of the remaining internal uses of
dns.rdata.choose_relativity(), which prevents rdata from being
immutable.

41 files changed:
dns/rdata.py
dns/rdata.pyi
dns/rdtypes/ANY/CAA.py
dns/rdtypes/ANY/CERT.py
dns/rdtypes/ANY/CSYNC.py
dns/rdtypes/ANY/GPOS.py
dns/rdtypes/ANY/HINFO.py
dns/rdtypes/ANY/HIP.py
dns/rdtypes/ANY/ISDN.py
dns/rdtypes/ANY/LOC.py
dns/rdtypes/ANY/NSEC.py
dns/rdtypes/ANY/NSEC3.py
dns/rdtypes/ANY/NSEC3PARAM.py
dns/rdtypes/ANY/OPENPGPKEY.py
dns/rdtypes/ANY/RP.py
dns/rdtypes/ANY/RRSIG.py
dns/rdtypes/ANY/SOA.py
dns/rdtypes/ANY/SSHFP.py
dns/rdtypes/ANY/TLSA.py
dns/rdtypes/ANY/URI.py
dns/rdtypes/ANY/X25.py
dns/rdtypes/CH/A.py
dns/rdtypes/IN/A.py
dns/rdtypes/IN/AAAA.py
dns/rdtypes/IN/APL.py
dns/rdtypes/IN/DHCID.py
dns/rdtypes/IN/IPSECKEY.py
dns/rdtypes/IN/NAPTR.py
dns/rdtypes/IN/NSAP.py
dns/rdtypes/IN/PX.py
dns/rdtypes/IN/SRV.py
dns/rdtypes/IN/WKS.py
dns/rdtypes/dnskeybase.py
dns/rdtypes/dnskeybase.pyi
dns/rdtypes/dsbase.py
dns/rdtypes/euibase.py
dns/rdtypes/mxbase.py
dns/rdtypes/nsbase.py
dns/rdtypes/txtbase.py
dns/tokenizer.py
dns/zone.py

index 93b4a31f73f655d2c97605801b98253d0915e4ae..640f731559119d1a23af380cd983e2f4a48eb9a6 100644 (file)
@@ -245,7 +245,8 @@ class Rdata(object):
         return hash(self.to_digestable(dns.name.root))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         raise NotImplementedError
 
     @classmethod
@@ -275,7 +276,8 @@ class GenericRdata(Rdata):
         return r'\# %d ' % len(self.data) + _hexify(self.data)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         token = tok.get()
         if not token.is_identifier() or token.value != r'\#':
             raise dns.exception.SyntaxError(
@@ -340,7 +342,8 @@ def get_rdata_class(rdclass, rdtype):
     return cls
 
 
-def from_text(rdclass, rdtype, tok, origin=None, relativize=True):
+def from_text(rdclass, rdtype, tok, origin=None, relativize=True,
+              relativize_to=None):
     """Build an rdata object from text format.
 
     This function attempts to dynamically load a class which
@@ -363,8 +366,10 @@ def from_text(rdclass, rdtype, tok, origin=None, relativize=True):
     *origin*, a ``dns.name.Name`` (or ``None``), the
     origin to use for relative names.
 
-    *relativize*, a ``bool``.  If true, name will be relativized to
-    the specified origin.
+    *relativize*, a ``bool``.  If true, name will be relativized.
+
+    *relativize_to*, a ``dns.name.Name`` (or ``None``), the origin to use
+    when relativizing names.  If not set, the *origin* value will be used.
 
     Returns an instance of the chosen Rdata subclass.
     """
@@ -384,10 +389,11 @@ def from_text(rdclass, rdtype, tok, origin=None, relativize=True):
             # from_wire on it.
             #
             rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin,
-                                           relativize)
+                                           relativize, relativize_to)
             return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data),
                              origin)
-    return cls.from_text(rdclass, rdtype, tok, origin, relativize)
+    return cls.from_text(rdclass, rdtype, tok, origin, relativize,
+                         relativize_to)
 
 
 def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None):
index 8663955c97e716bbfcf0f6dc4cc6d0afa6cc45c1..05a38123dd5af60961b00666d8ea6707fa905f9e 100644 (file)
@@ -10,7 +10,7 @@ class Rdata:
         ...
 _rdata_modules : Dict[Tuple[Any,Rdata],Any]
 
-def from_text(rdclass : int, rdtype : int, tok : Optional[str], origin : Optional[Name] = None, relativize : bool = True):
+def from_text(rdclass : int, rdtype : int, tok : Optional[str], origin : Optional[Name] = None, relativize : bool = True, relativize_to : Optional[Name] = None):
     ...
 
 def from_wire(rdclass : int, rdtype : int, wire : bytes, current : int, rdlen : int, origin : Optional[Name] = None):
index 0acf201ab16905b8f9d908c4eb4ce1ac3e0a3e4e..254bdc6249a4f56b4de2f62db55f4e76e218a379 100644 (file)
@@ -48,7 +48,8 @@ class CAA(dns.rdata.Rdata):
                                dns.rdata._escapify(self.value))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         flags = tok.get_uint8()
         tag = tok.get_string().encode()
         if len(tag) > 255:
index eea27b52c39aca82231bd67e4a8a54d215fce862..79517755575f2eed2e4db56924583ec2512df0b0 100644 (file)
@@ -85,7 +85,8 @@ class CERT(dns.rdata.Rdata):
                                 dns.rdata._base64ify(self.certificate))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         certificate_type = _ctype_from_text(tok.get_string())
         key_tag = tok.get_uint16()
         algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
index 878befac51997e4bb1eed6c6ab1dcff72ba2dcaf..26508b56b83365b695df75e71143edb9d2c83f95 100644 (file)
@@ -54,7 +54,8 @@ class CSYNC(dns.rdata.Rdata):
         return '%d %d%s' % (self.serial, self.flags, text)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         serial = tok.get_uint32()
         flags = tok.get_uint16()
         rdtypes = []
index 2448420c7c2a5cb8e44ef36d94df6e87934da4e0..5db2ddbe8034ae8bb6abba02314ff2a4c1afe1ef 100644 (file)
@@ -83,7 +83,8 @@ class GPOS(dns.rdata.Rdata):
                              self.altitude.decode())
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         latitude = tok.get_string()
         longitude = tok.get_string()
         altitude = tok.get_string()
index 7bf8edd3220f25eebf2a8326df7a32bbce7848c4..d68230f23a264101a7498dace2af269ea3affad7 100644 (file)
@@ -50,7 +50,8 @@ class HINFO(dns.rdata.Rdata):
                                   dns.rdata._escapify(self.os))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         cpu = tok.get_string()
         os = tok.get_string()
         tok.get_eol()
index 81e13c27957bc4b8c7520145b1be16e337209d05..0b3dfb0de1b4d5904552c649514ac7e39d83a4ac 100644 (file)
@@ -59,7 +59,8 @@ class HIP(dns.rdata.Rdata):
         return '%u %s %s%s' % (self.algorithm, hit, key, text)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         algorithm = tok.get_uint8()
         hit = binascii.unhexlify(tok.get_string().encode())
         if len(hit) > 255:
index 4d1b8662462f32346367232bd343a48c43bab401..eeb51b06c2ba033c2ce7d63930a4f482d300dd6d 100644 (file)
@@ -53,7 +53,8 @@ class ISDN(dns.rdata.Rdata):
             return '"%s"' % dns.rdata._escapify(self.address)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_string()
         t = tok.get()
         if not t.is_eol_or_eof():
index 104551312aec0c89b10585bb140c8f65a8b819fe..9d6f046347f733bafb4b6175e9bb4108cfd30e76 100644 (file)
@@ -164,7 +164,8 @@ class LOC(dns.rdata.Rdata):
         return text
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         latitude = [0, 0, 0, 0, 1]
         longitude = [0, 0, 0, 0, 1]
         size = _default_size
index a138d4d2907302b567e41cd12a155501635a594b..2b7bc6c4bc0027b5549b77d45df94228cc82d683 100644 (file)
@@ -53,9 +53,9 @@ class NSEC(dns.rdata.Rdata):
         return '{}{}'.format(next, text)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
-        next = tok.get_name()
-        next = next.choose_relativity(origin, relativize)
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
+        next = tok.get_name(origin, relativize, relativize_to)
         rdtypes = []
         while 1:
             token = tok.get().unescape()
index 95e02eb8ca81bf943552a3f414786e16026f6f09..086f526292b88ad2be7932d0c7c10878620cd1eb 100644 (file)
@@ -88,7 +88,8 @@ class NSEC3(dns.rdata.Rdata):
                                      self.iterations, salt, next, text)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         algorithm = tok.get_uint8()
         flags = tok.get_uint8()
         iterations = tok.get_uint16()
index 356fff4620d9ef4546e15138071e017ae4266502..8f21657ba68fe96ebff3375d7cbc19076ca5fcc0 100644 (file)
@@ -56,7 +56,8 @@ class NSEC3PARAM(dns.rdata.Rdata):
                                 salt)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         algorithm = tok.get_uint8()
         flags = tok.get_uint8()
         iterations = tok.get_uint16()
index a066cf98df68d6c7c9def424dc7c68cc21d69a33..5bce444c039369cb0be32114377822f0b629ae01 100644 (file)
@@ -38,7 +38,8 @@ class OPENPGPKEY(dns.rdata.Rdata):
         return dns.rdata._base64ify(self.key)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         chunks = []
         while 1:
             t = tok.get().unescape()
index 8f07be907166b8dd3ab0671c12db34e2b9f0424a..1c8afe232a04a84219d139c214b08a4df04b7fcc 100644 (file)
@@ -44,11 +44,10 @@ class RP(dns.rdata.Rdata):
         return "{} {}".format(str(mbox), str(txt))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
-        mbox = tok.get_name()
-        txt = tok.get_name()
-        mbox = mbox.choose_relativity(origin, relativize)
-        txt = txt.choose_relativity(origin, relativize)
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
+        mbox = tok.get_name(origin, relativize, relativize_to)
+        txt = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, mbox, txt)
 
index 80c650984301c629f594a367d70e6a6ab565ab5e..cef60007f36ac2694b2cb309823c708de556e88e 100644 (file)
@@ -108,7 +108,8 @@ class RRSIG(dns.rdata.Rdata):
         )
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         type_covered = dns.rdatatype.from_text(tok.get_string())
         algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
         labels = tok.get_int()
@@ -116,8 +117,7 @@ class RRSIG(dns.rdata.Rdata):
         expiration = sigtime_to_posixtime(tok.get_string())
         inception = sigtime_to_posixtime(tok.get_string())
         key_tag = tok.get_int()
-        signer = tok.get_name()
-        signer = signer.choose_relativity(origin, relativize)
+        signer = tok.get_name(origin, relativize, relativize_to)
         chunks = []
         while 1:
             t = tok.get().unescape()
index aec81cad8ac916e9bc71052ecbc4983cdabbd126..58a65f64dad313feb206625dd0b9956dbdb13ff3 100644 (file)
@@ -65,11 +65,10 @@ class SOA(dns.rdata.Rdata):
             self.expire, self.minimum)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
-        mname = tok.get_name()
-        rname = tok.get_name()
-        mname = mname.choose_relativity(origin, relativize)
-        rname = rname.choose_relativity(origin, relativize)
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
+        mname = tok.get_name(origin, relativize, relativize_to)
+        rname = tok.get_name(origin, relativize, relativize_to)
         serial = tok.get_uint32()
         refresh = tok.get_ttl()
         retry = tok.get_ttl()
index c18311e906aee35db1127e894442ff4f7c7fb50c..7c27ccba650c0edeac1da2b30e16f1613cf41b0b 100644 (file)
@@ -50,7 +50,8 @@ class SSHFP(dns.rdata.Rdata):
                                                chunksize=128))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         algorithm = tok.get_uint8()
         fp_type = tok.get_uint8()
         chunks = []
index a135c2b3da5449aa482242cb53082f8ac33c71ca..83e4d6357d4a0890e6f4d14e2bd0e3663b465857 100644 (file)
@@ -54,7 +54,8 @@ class TLSA(dns.rdata.Rdata):
                                                   chunksize=128))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         usage = tok.get_uint8()
         selector = tok.get_uint8()
         mtype = tok.get_uint8()
index 4c6569ceec39070279ab7a0a402e6ed2c3f1e048..576344e1ffddd517b4330c1d8c268ad22d14d1d5 100644 (file)
@@ -53,7 +53,8 @@ class URI(dns.rdata.Rdata):
                                self.target.decode())
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         priority = tok.get_uint16()
         weight = tok.get_uint16()
         target = tok.get().unescape()
index 1323ba4df7c123bff1fed7e4df8f4e51f126ed33..7c7d25b7d717134003492b5ae6e4c07008c0db2e 100644 (file)
@@ -43,7 +43,8 @@ class X25(dns.rdata.Rdata):
         return '"%s"' % dns.rdata._escapify(self.address)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_string()
         tok.get_eol()
         return cls(rdclass, rdtype, address)
index e65d192d82c42661832d73e3614c913fe02a71af..34d432c8054864f643e7c92fa78c8046751393f2 100644 (file)
@@ -38,10 +38,10 @@ class A(dns.rdtypes.mxbase.MXBase):
         return '%s %o' % (domain, self.address)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
-        domain = tok.get_name()
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
+        domain = tok.get_name(origin, relativize, relativize_to)
         address = tok.get_uint16(base=8)
-        domain = domain.choose_relativity(origin, relativize)
         tok.get_eol()
         return cls(rdclass, rdtype, address, domain)
 
index 89989824622cb84bf2d7253a165853b0f46cbb15..84e54ab99dc76bd38cf3a8b1b526615d72a6871a 100644 (file)
@@ -40,7 +40,8 @@ class A(dns.rdata.Rdata):
         return self.address
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_identifier()
         tok.get_eol()
         return cls(rdclass, rdtype, address)
index a77c5bf2a5ae03c7a4e0cf0c512a318f442629a7..b6b13baf47f682e6065a046340c3daee585eadee 100644 (file)
@@ -40,7 +40,8 @@ class AAAA(dns.rdata.Rdata):
         return self.address
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_identifier()
         tok.get_eol()
         return cls(rdclass, rdtype, address)
index 564890861b463e32cd89dbe85484c8b4e8f87ed7..f82449854d09e94731cd835759dd5ada44b093e6 100644 (file)
@@ -95,7 +95,8 @@ class APL(dns.rdata.Rdata):
         return ' '.join(map(str, self.items))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         items = []
         while 1:
             token = tok.get().unescape()
index cec64590f040afb836ac01c26f1308159631902c..1cc50ff6c9c89a6baba6350f7fe4ebacfcb8335c 100644 (file)
@@ -39,7 +39,8 @@ class DHCID(dns.rdata.Rdata):
         return dns.rdata._base64ify(self.data)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         chunks = []
         while 1:
             t = tok.get().unescape()
index 5e619239f4959400b3069a73a15d3a111c383e76..4a81d9814a64ec9afc545b236dd0b9f3cf0ef213 100644 (file)
@@ -81,12 +81,13 @@ class IPSECKEY(dns.rdata.Rdata):
                                    dns.rdata._base64ify(self.key))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         precedence = tok.get_uint8()
         gateway_type = tok.get_uint8()
         algorithm = tok.get_uint8()
         if gateway_type == 3:
-            gateway = tok.get_name().choose_relativity(origin, relativize)
+            gateway = tok.get_name(origin, relativize, relativize_to)
         else:
             gateway = tok.get_string()
         chunks = []
index 79e5e5f3543cfa24acee6359a3a881bdc3e1b8d9..69c988cdad026db613d923f945b8e61350e4e07e 100644 (file)
@@ -76,14 +76,14 @@ class NAPTR(dns.rdata.Rdata):
                 replacement)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         order = tok.get_uint16()
         preference = tok.get_uint16()
         flags = tok.get_string()
         service = tok.get_string()
         regexp = tok.get_string()
-        replacement = tok.get_name()
-        replacement = replacement.choose_relativity(origin, relativize)
+        replacement = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, order, preference, flags, service,
                    regexp, replacement)
index 336befc7f2702f381c229dff01abb21b1fe602bb..c4df595088eead10ae7e60c93b51049c108b8790 100644 (file)
@@ -40,7 +40,8 @@ class NSAP(dns.rdata.Rdata):
         return "0x%s" % binascii.hexlify(self.address).decode()
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_string()
         tok.get_eol()
         if address[0:2] != '0x':
index 2dbaee6ce8676ecd6ebf0577c15dbc7f8b332baa..86f8613815a39332aad59815d726f173ceff20a5 100644 (file)
@@ -48,12 +48,11 @@ class PX(dns.rdata.Rdata):
         return '%d %s %s' % (self.preference, map822, mapx400)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         preference = tok.get_uint16()
-        map822 = tok.get_name()
-        map822 = map822.choose_relativity(origin, relativize)
-        mapx400 = tok.get_name(None)
-        mapx400 = mapx400.choose_relativity(origin, relativize)
+        map822 = tok.get_name(origin, relativize, relativize_to)
+        mapx400 = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, preference, map822, mapx400)
 
index b2c1bc9f0b56283634af135fb18245ab2ae9e6a9..87c047116b3627dbdf7d2450423a73e17bf3a8ee 100644 (file)
@@ -51,12 +51,12 @@ class SRV(dns.rdata.Rdata):
                                 target)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         priority = tok.get_uint16()
         weight = tok.get_uint16()
         port = tok.get_uint16()
-        target = tok.get_name(None)
-        target = target.choose_relativity(origin, relativize)
+        target = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, priority, weight, port, target)
 
index c3a47985c40f9d63220fe1b319f20a04f82c7e2f..ac0e9c85c4b65690fba2f50465879f21e07e69ab 100644 (file)
@@ -59,7 +59,8 @@ class WKS(dns.rdata.Rdata):
         return '%s %d %s' % (self.address, self.protocol, text)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         address = tok.get_string()
         protocol = tok.get_string()
         if protocol.isdigit():
index 3e7e87ef1522648fe683d475115d3a581bd1707f..ea8f19156cf866bd033bfbdc8366de95655e39ed 100644 (file)
@@ -100,7 +100,8 @@ class DNSKEYBase(dns.rdata.Rdata):
                                 dns.rdata._base64ify(self.key))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         flags = tok.get_uint16()
         protocol = tok.get_uint8()
         algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
index e102a698719d99ecce714a5178337d1f1c52ca7e..ee70691d3afeb49a950d00489a779dcf850cbf63 100644 (file)
@@ -23,7 +23,8 @@ class DNSKEYBase(rdata.Rdata):
         ...
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         ...
 
     def to_wire(self, file, compress=None, origin=None):
index 26ae9d5c7dd5f78ba2b31ecbd7bc80d9f8d67f3a..ac5904d924b3ca60714e7bc7371256236f2fd167 100644 (file)
@@ -53,7 +53,8 @@ class DSBase(dns.rdata.Rdata):
                                                   chunksize=128))
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         key_tag = tok.get_uint16()
         algorithm = tok.get_uint8()
         digest_type = tok.get_uint8()
index 4eaecbf8deb49d879fd36c67c9d81c5e86b4b8e3..9ac8bc01b45462cedaedc39a904159be0625a023 100644 (file)
@@ -43,7 +43,8 @@ class EUIBase(dns.rdata.Rdata):
         return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-')
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         text = tok.get_string()
         tok.get_eol()
         if len(text) != cls.text_len:
index 9a3fa6236072027e1cb36d914dddf9305135b87e..7ed97f57da2adbc93de026552ce5a413bbdf0d79 100644 (file)
@@ -46,10 +46,10 @@ class MXBase(dns.rdata.Rdata):
         return '%d %s' % (self.preference, exchange)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         preference = tok.get_uint16()
-        exchange = tok.get_name()
-        exchange = exchange.choose_relativity(origin, relativize)
+        exchange = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, preference, exchange)
 
index 97a223263810ae7c734d824e4b3f7759b4cdc4d5..b55a7f2e0097749b1dfc714d4a138ec4f5724471 100644 (file)
@@ -42,9 +42,9 @@ class NSBase(dns.rdata.Rdata):
         return str(target)
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
-        target = tok.get_name()
-        target = target.choose_relativity(origin, relativize)
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
+        target = tok.get_name(origin, relativize, relativize_to)
         tok.get_eol()
         return cls(rdclass, rdtype, target)
 
index fd8587135f57d42bf92520bafd949ae7f7a55966..0988052721237bfd2e5a32a4ac3672dc5a72d35b 100644 (file)
@@ -54,7 +54,8 @@ class TXTBase(dns.rdata.Rdata):
         return txt
 
     @classmethod
-    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
+    def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
+                  relativize_to=None):
         strings = []
         while 1:
             token = tok.get().unescape()
index 74674a6545f2fdb79250becf2ec723d37e35036c..479c002dd48e07b97426678100efd6a4e4bc3af6 100644 (file)
@@ -528,7 +528,7 @@ class Tokenizer(object):
             raise dns.exception.SyntaxError('expecting an identifier')
         return token.value
 
-    def get_name(self, origin=None):
+    def get_name(self, origin=None, relativize=False, relativize_to=None):
         """Read the next token and interpret it as a DNS name.
 
         Raises dns.exception.SyntaxError if not a name.
@@ -539,7 +539,8 @@ class Tokenizer(object):
         token = self.get()
         if not token.is_identifier():
             raise dns.exception.SyntaxError('expecting an identifier')
-        return dns.name.from_text(token.value, origin)
+        name = dns.name.from_text(token.value, origin)
+        return name.choose_relativity(relativize_to or origin, relativize)
 
     def get_eol(self):
         """Read the next token and raise an exception if it isn't EOL or
index 0da4d89f4d325a4752ff29ae9a62db2e4e0ce18b..4d21dfb21d9c9e41fc36d96d8b6ef4a41a766e16 100644 (file)
@@ -698,7 +698,8 @@ class _MasterReader(object):
             self.zone.nodes[name] = n
         try:
             rd = dns.rdata.from_text(rdclass, rdtype, self.tok,
-                                     self.current_origin, False)
+                                     self.current_origin, self.relativize,
+                                     self.zone.origin)
         except dns.exception.SyntaxError:
             # Catch and reraise.
             (ty, va) = sys.exc_info()[:2]
@@ -730,7 +731,6 @@ class _MasterReader(object):
                 else:
                     ttl = self.last_ttl
 
-        rd.choose_relativity(self.zone.origin, self.relativize)
         covers = rd.covers()
         rds = n.find_rdataset(rdclass, rdtype, covers, True)
         rds.add(rd, ttl)
@@ -879,7 +879,8 @@ class _MasterReader(object):
                 self.zone.nodes[name] = n
             try:
                 rd = dns.rdata.from_text(rdclass, rdtype, rdata,
-                                         self.current_origin, False)
+                                         self.current_origin, self.relativize,
+                                         self.zone.origin)
             except dns.exception.SyntaxError:
                 # Catch and reraise.
                 (ty, va) = sys.exc_info()[:2]
@@ -894,7 +895,6 @@ class _MasterReader(object):
                 raise dns.exception.SyntaxError("caught exception %s: %s" %
                                                 (str(ty), str(va)))
 
-            rd.choose_relativity(self.zone.origin, self.relativize)
             covers = rd.covers()
             rds = n.find_rdataset(rdclass, rdtype, covers, True)
             rds.add(rd, ttl)