fix doco
[third_party/dnspython] / dns / renderer.py
index 07bce98f6e7243b2b08a1e16e2889b91111a6a87..bb0218ac301d81ec0b993fff56d2c9a3e2b44812 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2007 Nominum, Inc.
+# Copyright (C) 2001-2007, 2009, 2010 Nominum, Inc.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation for any purpose with or without fee is hereby granted,
@@ -202,7 +202,7 @@ class Renderer(object):
             raise dns.exception.TooBig
         self.counts[section] += n
 
-    def add_edns(self, edns, ednsflags, payload):
+    def add_edns(self, edns, ednsflags, payload, options=None):
         """Add an EDNS OPT record to the message.
 
         @param edns: The EDNS level to use.
@@ -212,6 +212,8 @@ class Renderer(object):
         @param payload: The EDNS sender's payload field, which is the maximum
         size of UDP datagram the sender can handle.
         @type payload: int
+        @param options: The EDNS options list
+        @type options: list of dns.edns.Option instances
         @see: RFC 2671
         """
 
@@ -222,6 +224,25 @@ class Renderer(object):
         before = self.output.tell()
         self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload,
                                       ednsflags, 0))
+        if not options is None:
+            lstart = self.output.tell()
+            for opt in options:
+                stuff = struct.pack("!HH", opt.otype, 0)
+                self.output.write(stuff)
+                start = self.output.tell()
+                opt.to_wire(self.output)
+                end = self.output.tell()
+                assert end - start < 65536
+                self.output.seek(start - 2)
+                stuff = struct.pack("!H", end - start)
+                self.output.write(stuff)
+                self.output.seek(0, 2)
+            lend = self.output.tell()
+            assert lend - lstart < 65536
+            self.output.seek(lstart - 2)
+            stuff = struct.pack("!H", lend - lstart)
+            self.output.write(stuff)
+            self.output.seek(0, 2)
         after = self.output.tell()
         if after >= self.max_size:
             self._rollback(before)
@@ -229,14 +250,14 @@ class Renderer(object):
         self.counts[ADDITIONAL] += 1
 
     def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data,
-                 request_mac):
+                 request_mac, algorithm=dns.tsig.default_algorithm):
         """Add a TSIG signature to the message.
 
         @param keyname: the TSIG key name
         @type keyname: dns.name.Name object
         @param secret: the secret to use
         @type secret: string
-        @param fudge: TSIG time fudge; default is 300 seconds.
+        @param fudge: TSIG time fudge
         @type fudge: int
         @param id: the message id to encode in the tsig signature
         @type id: int
@@ -246,21 +267,23 @@ class Renderer(object):
         @type other_data: string
         @param request_mac: This message is a response to the request which
         had the specified MAC.
+        @param algorithm: the TSIG algorithm to use
         @type request_mac: string
         """
 
         self._set_section(ADDITIONAL)
         before = self.output.tell()
         s = self.output.getvalue()
-        (tsig_rdata, self.mac, ctx) = dns.tsig.hmac_md5(s,
-                                                        keyname,
-                                                        secret,
-                                                        int(time.time()),
-                                                        fudge,
-                                                        id,
-                                                        tsig_error,
-                                                        other_data,
-                                                        request_mac)
+        (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s,
+                                                    keyname,
+                                                    secret,
+                                                    int(time.time()),
+                                                    fudge,
+                                                    id,
+                                                    tsig_error,
+                                                    other_data,
+                                                    request_mac,
+                                                    algorithm=algorithm)
         keyname.to_wire(self.output, self.compress, self.origin)
         self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG,
                                       dns.rdataclass.ANY, 0, 0))