]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add support for multi-message TSIG.
authorBrian Wellington <bwelling@xbill.org>
Tue, 16 Jun 2020 22:19:29 +0000 (15:19 -0700)
committerBrian Wellington <bwelling@xbill.org>
Tue, 16 Jun 2020 22:19:29 +0000 (15:19 -0700)
The underlying renderer code supported this, but it was not exposed
through message.to_wire().

dns/message.py

index 897ea5e7e5ee8fedd49ab4ed9e958e5dbc820a32..bdcbdc4f8e6534e98ad17aa6fcba421cca73a87c 100644 (file)
@@ -399,7 +399,7 @@ class Message:
             rrset = None
         return rrset
 
-    def to_wire(self, origin=None, max_size=0, **kw):
+    def to_wire(self, origin=None, max_size=0, multi=False, tsig_ctx=None, **kw):
         """Return a string containing the message in DNS compressed wire
         format.
 
@@ -413,6 +413,12 @@ class Message:
         output; default is 0, which means "the message's request
         payload, if nonzero, or 65535".
 
+        *multi*, a ``bool``, should be set to ``True`` if this message is
+        part of a multiple message sequence.
+
+        *tsig_ctx*, a ``hmac.HMAC`` object, the ongoing TSIG context, used
+        when signing zone transfers.
+
         Raises ``dns.exception.TooBig`` if *max_size* was exceeded.
 
         Returns a ``bytes``.
@@ -440,10 +446,18 @@ class Message:
             r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw)
         r.write_header()
         if self.keyname is not None:
-            r.add_tsig(self.keyname, self.keyring[self.keyname],
-                       self.fudge, self.original_id, self.tsig_error,
-                       self.other_data, self.request_mac,
-                       self.keyalgorithm)
+            if multi:
+                ctx = r.add_multi_tsig(tsig_ctx,
+                                       self.keyname, self.keyring[self.keyname],
+                                       self.fudge, self.original_id,
+                                       self.tsig_error, self.other_data,
+                                       self.request_mac, self.keyalgorithm)
+                self.tsig_ctx = ctx
+            else:
+                r.add_tsig(self.keyname, self.keyring[self.keyname],
+                           self.fudge, self.original_id, self.tsig_error,
+                           self.other_data, self.request_mac,
+                           self.keyalgorithm)
             self.mac = r.mac
         return r.get_wire()