1 2010-11-23 Bob Halley <halley@dnspython.org>
3 * (Version 1.9.2 released)
5 2010-11-23 Bob Halley <halley@dnspython.org>
7 * dns/dnssec.py (_need_pycrypto): DSA and RSA are modules, not
8 functions, and I didn't notice because the test suite masked
11 2010-11-22 Bob Halley <halley@dnspython.org>
13 * (Version 1.9.1 released)
15 2010-11-22 Bob Halley <halley@dnspython.org>
17 * dns/dnssec.py: the "from" style import used to get DSA from
18 PyCrypto trashed a DSA constant. Now a normal import is used
19 to avoid namespace contamination.
21 2010-11-20 Bob Halley <halley@dnspython.org>
23 * (Version 1.9.0 released)
25 2010-11-07 Bob Halley <halley@dnspython.org>
27 * dns/dnssec.py: Added validate() to do basic DNSSEC validation
28 (requires PyCrypto). Thanks to Brian Wellington for the patch.
30 * dns/hash.py: Hash compatibility handling is now its own module.
32 2010-10-31 Bob Halley <halley@dnspython.org>
34 * dns/resolver.py (zone_for_name): A query name resulting in a
35 CNAME or DNAME response to a node which had an SOA was incorrectly
36 treated as a zone origin. In these cases, we should just look
37 higher. Thanks to Gert Berger for reporting this problem.
39 * Added zonediff.py to examples. This program compares two zones
40 and shows the differences either in diff-like plain text, or
41 HTML. Thanks to Dennis Kaarsemaker for contributing this
44 2010-10-27 Bob Halley <halley@dnspython.org>
46 * Incorporate a patch to use poll() instead of select() by
47 default on platforms which support it. Thanks to
48 Peter Schüller and Spotify for the contribution.
50 2010-10-17 Bob Halley <halley@dnspython.org>
52 * Python prior to 2.5.2 doesn't compute the correct values for
53 HMAC-SHA384 and HMAC-SHA512. We now detect attempts to use
54 them and raise NotImplemented if the Python version is too old.
55 Thanks to Kevin Chen for reporting the problem.
57 * Various routines that took the string forms of rdata types and
58 classes did not permit the strings to be Unicode strings.
59 Thanks to Ryan Workman for reporting the issue.
61 * dns/tsig.py: Added symbolic constants for the algorithm strings.
62 E.g. you can now say dns.tsig.HMAC_MD5 instead of
63 "HMAC-MD5.SIG-ALG.REG.INT". Thanks to Cillian Sharkey for
64 suggesting this improvement.
66 * dns/tsig.py (get_algorithm): fix hashlib compatibility; thanks to
67 Kevin Chen for the patch.
69 * dns/dnssec.py: Added key_id() and make_ds().
71 * dns/message.py: message.py needs to import dns.edns since it uses
74 2010-05-04 Bob Halley <halley@dnspython.org>
76 * dns/rrset.py (RRset.__init__): "covers" was not passed to the
77 superclass __init__(). Thanks to Shanmuga Rajan for reporting
80 2010-03-10 Bob Halley <halley@dnspython.org>
82 * The TSIG algorithm value was passed to use_tsig() incorrectly
83 in some cases. Thanks to 'ducciovigolo' for reporting the problem.
85 2010-01-26 Bob Halley <halley@dnspython.org>
87 * (Version 1.8.0 released)
89 2010-01-13 Bob Halley <halley@dnspython.org>
91 * dns/dnssec.py: Added RSASHA256 and RSASHA512 codepoints; added
92 other missing codepoints to _algorithm_by_text.
94 2010-01-12 Bob Halley <halley@dnspython.org>
96 * Escapes in masterfiles now work correctly. Previously they were
97 only working correctly when the text involved was part of a domain
100 * dns/tokenizer.py: The tokenizer's get() method now returns Token
101 objects, not (type, text) tuples.
103 2009-11-13 Bob Halley <halley@dnspython.org>
105 * Support has been added for hmac-sha1, hmac-sha224, hmac-sha256,
106 hmac-sha384 and hmac-sha512. Thanks to Kevin Chen for a
107 thoughtful, high quality patch.
109 * dns/update.py (Update::present): A zero TTL was not added if
110 present() was called with a single rdata, causing _add() to be
111 unhappy. Thanks to Eugene Kim for reporting the problem and
114 * dns/entropy.py: Use os.urandom() if present. Don't seed until
115 someone wants randomness.
117 2009-09-16 Bob Halley <halley@dnspython.org>
119 * dns/entropy.py: The entropy module needs locking in order to be
120 used safely in a multithreaded environment. Thanks to Beda Kosata
121 for reporting the problem.
123 2009-07-27 Bob Halley <halley@dnspython.org>
125 * dns/query.py (xfr): The socket was not set to nonblocking mode.
126 Thanks to Erik Romijn for reporting this problem.
128 2009-07-23 Bob Halley <halley@dnspython.org>
130 * dns/rdtypes/IN/SRV.py (SRV._cmp): SRV records were compared
131 incorrectly due to a cut-and-paste error. Thanks to Tommie
132 Gannert for reporting this bug.
134 * dns/e164.py (query): The resolver parameter was not used.
135 Thanks to Matías Bellone for reporting this bug.
137 2009-06-23 Bob Halley <halley@dnspython.org>
139 * dns/entropy.py (EntropyPool.__init__): open /dev/random unbuffered;
140 there's no need to consume more randomness than we need. Thanks
141 to Brian Wellington for the patch.
143 2009-06-19 Bob Halley <halley@dnspython.org>
145 * (Version 1.7.1 released)
147 2009-06-19 Bob Halley <halley@dnspython.org>
149 * DLV.py was omitted from the kit
151 * Negative prerequisites were not handled correctly in _get_section().
153 2009-06-19 Bob Halley <halley@dnspython.org>
155 * (Version 1.7.0 released)
157 2009-06-19 Bob Halley <halley@dnspython.org>
159 * On Windows, the resolver set the domain incorrectly. Thanks
160 to Brandon Carpenter for reporting this bug.
162 * Added a to_digestable() method to rdata classes; it returns the
163 digestable form (i.e. DNSSEC canonical form) of the rdata. For
164 most rdata types this is the same uncompressed wire form. For
165 certain older DNS RR types, however, domain names in the rdata
168 * Added support for the HIP RR type.
170 2009-06-18 Bob Halley <halley@dnspython.org>
172 * Added support for the DLV RR type.
174 * Added various DNSSEC related constants (e.g. algorithm identifiers,
177 * dns/tsig.py: Added support for BADTRUNC result code.
179 * dns/query.py (udp): When checking that addresses are the same,
180 use the binary form of the address in the comparison. This
181 ensures that we don't treat addresses as different if they have
182 equivalent but differing textual representations. E.g. "1:00::1"
183 and "1::1" represent the same address but are not textually equal.
184 Thanks to Kim Davies for reporting this bug.
186 * The resolver's query() method now has an optional 'source' parameter,
187 allowing the source IP address to be specified. Thanks to
188 Alexander Lind for suggesting the change and sending a patch.
190 * Added NSEC3 and NSEC3PARAM support.
192 2009-06-17 Bob Halley <halley@dnspython.org>
194 * Fixed NSEC.to_text(), which was only printing the last window.
195 Thanks to Brian Wellington for finding the problem and fixing it.
197 2009-03-30 Bob Halley <halley@dnspython.org>
199 * dns/query.py (xfr): Allow UDP IXFRs. Use "one_rr_per_rrset" mode when
202 2009-03-30 Bob Halley <halley@dnspython.org>
204 * Add "one_rr_per_rrset" mode switch to methods which parse
205 messages from wire format (e.g. dns.message.from_wire(),
206 dns.query.udp(), dns.query.tcp()). If set, each RR read is
207 placed in its own RRset (instead of being coalesced).
209 2009-03-30 Bob Halley <halley@dnspython.org>
211 * Added EDNS option support.
213 2008-10-16 Bob Halley <halley@dnspython.org>
215 * dns/rdtypes/ANY/DS.py: The from_text() parser for DS RRs did not
216 allow multiple Base64 chunks. Thanks to Rakesh Banka for
217 finding this bug and submitting a patch.
219 2008-10-08 Bob Halley <halley@dnspython.org>
221 * Add entropy module.
223 * When validating TSIGs, we need to use the absolute name.
225 2008-06-03 Bob Halley <halley@dnspython.org>
227 * dns/message.py (Message.set_rcode): The mask used preserved the
228 extended rcode, instead of everything else in ednsflags.
230 * dns/message.py (Message.use_edns): ednsflags was not kept
231 coherent with the specified edns version.
233 2008-02-06 Bob Halley <halley@dnspython.org>
235 * dns/ipv6.py (inet_aton): We could raise an exception other than
236 dns.exception.SyntaxError in some cases.
238 * dns/tsig.py: Raise an exception when the peer has set a non-zero
241 2007-11-25 Bob Halley <halley@dnspython.org>
243 * (Version 1.6.0 released)
245 2007-11-25 Bob Halley <halley@dnspython.org>
247 * dns/query.py (_wait_for): if select() raises an exception due to
248 EINTR, we should just select() again.
250 2007-06-13 Bob Halley <halley@dnspython.org>
252 * dns/inet.py: Added is_multicast().
254 * dns/query.py (udp): If the queried address is a multicast address, then
255 don't check that the address of the response is the same as the address
258 2007-05-24 Bob Halley <halley@dnspython.org>
260 * dns/rdtypes/IN/NAPTR.py: NAPTR comparisons didn't compare the
261 preference field due to a typo.
263 2007-02-07 Bob Halley <halley@dnspython.org>
265 * dns/resolver.py: Integrate code submitted by Paul Marks to
266 determine whether a Windows NIC is enabled. The way dnspython
267 used to do this does not work on Windows Vista.
269 2006-12-10 Bob Halley <halley@dnspython.org>
271 * (Version 1.5.0 released)
273 2006-11-03 Bob Halley <halley@dnspython.org>
275 * dns/rdtypes/IN/DHCID.py: Added support for the DHCID RR type.
277 2006-11-02 Bob Halley <halley@dnspython.org>
279 * dns/query.py (udp): Messages from unexpected sources can now be
280 ignored by setting ignore_unexpected to True.
282 2006-10-31 Bob Halley <halley@dnspython.org>
284 * dns/query.py (udp): When raising UnexpectedSource, add more
285 detail about what went wrong to the exception.
287 2006-09-22 Bob Halley <halley@dnspython.org>
289 * dns/message.py (Message.use_edns): add reasonable defaults for
290 the ednsflags, payload, and request_payload parameters.
292 * dns/message.py (Message.want_dnssec): add a convenience method for
293 enabling/disabling the "DNSSEC desired" flag in requests.
295 * dns/message.py (make_query): add "use_edns" and "want_dnssec"
298 2006-08-17 Bob Halley <halley@dnspython.org>
300 * dns/resolver.py (Resolver.read_resolv_conf): If /etc/resolv.conf
301 doesn't exist, just use the default resolver configuration (i.e.
302 the same thing we would have used if resolv.conf had existed and
305 2006-07-26 Bob Halley <halley@dnspython.org>
307 * dns/resolver.py (Resolver._config_win32_fromkey): fix
308 cut-and-paste error where we passed the wrong variable to
309 self._config_win32_search(). Thanks to David Arnold for finding
310 the bug and submitting a patch.
312 2006-07-20 Bob Halley <halley@dnspython.org>
314 * dns/resolver.py (Answer): Add more support for the sequence
315 protocol, forwarding requests to the answer object's rrset.
316 E.g. "for a in answer" is equivalent to "for a in answer.rrset",
317 "answer[i]" is equivalent to "answer.rrset[i]", and
318 "answer[i:j]" is equivalent to "answer.rrset[i:j]".
320 2006-07-19 Bob Halley <halley@dnspython.org>
322 * dns/query.py (xfr): Add IXFR support.
324 2006-06-22 Bob Halley <halley@dnspython.org>
326 * dns/rdtypes/IN/IPSECKEY.py: Added support for the IPSECKEY RR type.
328 2006-06-21 Bob Halley <halley@dnspython.org>
330 * dns/rdtypes/ANY/SPF.py: Added support for the SPF RR type.
332 2006-06-02 Bob Halley <halley@dnspython.org>
334 * (Version 1.4.0 released)
336 2006-04-25 Bob Halley <halley@dnspython.org>
338 * dns/rrset.py (RRset.to_rdataset): Added a convenience method
339 to convert an rrset into an rdataset.
341 2006-03-27 Bob Halley <halley@dnspython.org>
343 * Added dns.e164.query(). This function can be used to look for
344 NAPTR RRs for a specified number in several domains, e.g.:
346 dns.e164.query('16505551212',
347 ['e164.dnspython.org.', 'e164.arpa.'])
349 2006-03-26 Bob Halley <halley@dnspython.org>
351 * dns/resolver.py (Resolver.query): The resolver deleted from
352 a list while iterating it, which makes the iterator unhappy.
354 2006-03-17 Bob Halley <halley@dnspython.org>
356 * dns/resolver.py (Resolver.query): The resolver needlessly
357 delayed responses for successful queries.
359 2006-01-18 Bob Halley <halley@dnspython.org>
361 * dns/rdata.py: added a validate() method to the rdata class. If
362 you change an rdata by assigning to its fields, it is a good
363 idea to call validate() when you are done making changes.
364 For example, if 'r' is an MX record and then you execute:
366 r.preference = 100000 # invalid, because > 65535
369 The validation will fail and an exception will be raised.
371 2006-01-11 Bob Halley <halley@dnspython.org>
373 * dns/ttl.py: TTLs are now bounds checked to be within the closed
374 interval [0, 2^31 - 1].
376 * The BIND 8 TTL syntax is now accepted in the SOA refresh, retry,
377 expire, and minimum fields, and in the original_ttl field of
378 SIG and RRSIG records.
380 2006-01-04 Bob Halley <halley@dnspython.org>
382 * dns/resolver.py: The windows registry irritatingly changes the
383 list element delimiter in between ' ' and ',' (and vice-versa)
384 in various versions of windows. We now cope by always looking
385 for either one (' ' first).
387 2005-12-27 Bob Halley <halley@dnspython.org>
389 * dns/e164.py: Added routines to convert between E.164 numbers and
390 their ENUM domain name equivalents.
392 * dns/reversename.py: Added routines to convert between IPv4 and
393 IPv6 addresses and their DNS reverse-map equivalents.
395 2005-12-18 Bob Halley <halley@dnspython.org>
397 * dns/rdtypes/ANY/LOC.py (_tuple_to_float): The sign was lost when
398 converting a tuple into a float, which broke conversions of
399 south latitudes and west longitudes.
401 2005-11-17 Bob Halley <halley@dnspython.org>
403 * dns/zone.py: The 'origin' parameter to from_text() and from_file()
404 is now optional. If not specified, dnspython will use the
405 first $ORIGIN in the text as the zone's origin.
407 * dns/zone.py: Sanity checks of the zone's origin node can now
410 2005-11-12 Bob Halley <halley@dnspython.org>
412 * dns/name.py: Preliminary Unicode support has been added for
413 domain names. Running dns.name.from_text() on a Unicode string
414 will now encode each label using the IDN ACE encoding. The
415 to_unicode() method may be used to convert a dns.name.Name with
416 IDN ACE labels back into a Unicode string. This functionality
417 requires Python 2.3 or greater.
419 2005-10-31 Bob Halley <halley@dnspython.org>
421 * (Version 1.3.5 released)
423 2005-10-12 Bob Halley <halley@dnspython.org>
425 * dns/zone.py: Zone.iterate_rdatasets() and Zone.iterate_rdatas()
426 did not have a default rdtype of dns.rdatatype.ANY as their
427 docstrings said they did. They do now.
429 2005-10-06 Bob Halley <halley@dnspython.org>
431 * dns/name.py: Added the parent() method, which returns the
434 2005-10-01 Bob Halley <halley@dnspython.org>
436 * dns/resolver.py: Added zone_for_name() helper, which returns
437 the name of the zone which contains the specified name.
439 * dns/resolver.py: Added get_default_resolver(), which returns
440 the default resolver, initializing it if necessary.
442 2005-09-29 Bob Halley <halley@dnspython.org>
444 * dns/resolver.py (Resolver._compute_timeout): If time goes
445 backwards a little bit, ignore it.
447 2005-07-31 Bob Halley <halley@dnspython.org>
449 * (Version 1.3.4 released)
451 2005-07-31 Bob Halley <halley@dnspython.org>
453 * dns/message.py (make_response): Trying to respond to a response
454 threw a NameError while trying to throw a FormErr since it used
455 the wrong name for the FormErr exception.
457 * dns/query.py (_connect): We needed to ignore EALREADY too.
459 * dns/query.py: Optional "source" and "source_port" parameters
460 have been added to udp(), tcp(), and xfr(). Thanks to Ralf
461 Weber for suggesting the change and providing a patch.
463 2005-06-05 Bob Halley <halley@dnspython.org>
465 * dns/query.py: The requirement that the "where" parameter be
466 an IPv4 or IPv6 address is now documented.
468 2005-06-04 Bob Halley <halley@dnspython.org>
470 * dns/resolver.py: The resolver now does exponential backoff
471 each time it runs through all of the nameservers.
473 * dns/resolver.py: rcodes which indicate a nameserver is likely
474 to be a "permanent failure" for a query cause the nameserver
475 to be removed from the mix for that query.
477 2005-01-30 Bob Halley <halley@dnspython.org>
479 * (Version 1.3.3 released)
481 2004-10-25 Bob Halley <halley@dnspython.org>
483 * dns/rdtypes/ANY/TXT.py (TXT.from_text): The masterfile parser
484 incorrectly rejected TXT records where a value was not quoted.
486 2004-10-11 Bob Halley <halley@dnspython.org>
488 * dns/message.py: Added make_response(), which creates a skeletal
489 response for the specified query. Added opcode() and set_opcode()
490 convenience methods to the Message class. Added the request_payload
491 attribute to the Message class.
493 2004-10-10 Bob Halley <halley@dnspython.org>
495 * dns/zone.py (from_xfr): dns.zone.from_xfr() in relativization
496 mode incorrectly set zone.origin to the empty name.
498 2004-09-02 Bob Halley <halley@dnspython.org>
500 * dns/name.py (Name.to_wire): The 'file' parameter to
501 Name.to_wire() is now optional; if omitted, the wire form will
502 be returned as the value of the function.
504 2004-08-14 Bob Halley <halley@dnspython.org>
506 * dns/message.py (Message.find_rrset): find_rrset() now uses an
507 index, vastly improving the from_wire() performance of large
508 messages such as zone transfers.
510 2004-08-07 Bob Halley <halley@dnspython.org>
512 * (Version 1.3.2 released)
514 2004-08-04 Bob Halley <halley@dnspython.org>
516 * dns/query.py: sending queries to a nameserver via IPv6 now
519 * dns/inet.py (af_for_address): Add af_for_address(), which looks
520 at a textual-form address and attempts to determine which address
523 * dns/query.py: the default for the 'af' parameter of the udp(),
524 tcp(), and xfr() functions has been changed from AF_INET to None,
525 which causes dns.inet.af_for_address() to be used to determine the
526 address family. If dns.inet.af_for_address() can't figure it out,
527 we fall back to AF_INET and hope for the best.
529 2004-07-31 Bob Halley <halley@dnspython.org>
531 * dns/rdtypes/ANY/NSEC.py (NSEC.from_text): The NSEC text format
532 does not allow specifying types by number, so we shouldn't either.
534 * dns/renderer.py: the renderer module didn't import random,
535 causing an exception to be raised if a query id wasn't provided
536 when a Renderer was created.
538 * dns/resolver.py (Resolver.query): the resolver wasn't catching
539 dns.exception.Timeout, so a timeout erroneously caused the whole
540 resolution to fail instead of just going on to the next server.
542 2004-06-16 Bob Halley <halley@dnspython.org>
544 * dns/rdtypes/ANY/LOC.py (LOC.from_text): LOC milliseconds values
545 were converted incorrectly if the length of the milliseconds
546 string was less than 3.
548 2004-06-06 Bob Halley <halley@dnspython.org>
550 * (Version 1.3.1 released)
552 2004-05-22 Bob Halley <halley@dnspython.org>
554 * dns/update.py (Update.delete): We erroneously specified a
555 "deleting" value of dns.rdatatype.NONE instead of
556 dns.rdataclass.NONE when the thing being deleted was either an
557 Rdataset instance or an Rdata instance.
559 * dns/rdtypes/ANY/SSHFP.py: Added support for the proposed SSHFP
562 2004-05-14 Bob Halley <halley@dnspython.org>
564 * dns/rdata.py (from_text): The masterfile reader did not
565 accept the unknown RR syntax when used with a known RR type.
567 2004-05-08 Bob Halley <halley@dnspython.org>
569 * dns/name.py (from_text): dns.name.from_text() did not raise
570 an exception if a backslash escape ended prematurely.
572 2004-04-09 Bob Halley <halley@dnspython.org>
574 * dns/zone.py (_MasterReader._rr_line): The masterfile reader
575 erroneously treated lines starting with leading whitespace but
576 not having any RR definition as an error. It now treats
577 them like a blank line (which is not an error).
579 2004-04-01 Bob Halley <halley@dnspython.org>
581 * (Version 1.3.0 released)
583 2004-03-19 Bob Halley <halley@dnspython.org>
585 * Added support for new DNSSEC types RRSIG, NSEC, and DNSKEY.
587 2004-01-16 Bob Halley <halley@dnspython.org>
589 * dns/query.py (_connect): Windows returns EWOULDBLOCK instead
590 of EINPROGRESS when trying to connect a nonblocking socket.
592 2003-11-13 Bob Halley <halley@dnspython.org>
594 * dns/rdtypes/ANY/LOC.py (LOC.to_wire): We encoded and decoded LOC
595 incorrectly, since we were interpreting the values of altitiude,
596 size, hprec, and vprec in meters instead of centimeters.
598 * dns/rdtypes/IN/WKS.py (WKS.from_wire): The WKS protocol value is
599 encoded with just one octet, not two!
601 2003-11-09 Bob Halley <halley@dnspython.org>
603 * dns/resolver.py (Cache.maybe_clean): The cleaner deleted items
604 from the dictionary while iterating it, causing a RuntimeError
605 to be raised. Thanks to Mark R. Levinson for the bug report,
606 regression test, and fix.
608 2003-11-07 Bob Halley <halley@dnspython.org>
610 * (Version 1.2.0 released)
612 2003-11-03 Bob Halley <halley@dnspython.org>
614 * dns/zone.py (_MasterReader.read): The saved_state now includes
617 2003-11-01 Bob Halley <halley@dnspython.org>
619 * dns/tokenizer.py (Tokenizer.get): The tokenizer didn't
620 handle escaped delimiters.
622 2003-10-27 Bob Halley <halley@dnspython.org>
624 * dns/resolver.py (Resolver.read_resolv_conf): If no nameservers
625 are configured in /etc/resolv.conf, the default nameserver
626 list should be ['127.0.0.1'].
628 2003-09-08 Bob Halley <halley@dnspython.org>
630 * dns/resolver.py (Resolver._config_win32_fromkey): We didn't
631 catch WindowsError, which can happen if a key is not defined
634 2003-09-06 Bob Halley <halley@dnspython.org>
636 * (Version 1.2.0b1 released)
638 2003-09-05 Bob Halley <halley@dnspython.org>
640 * dns/query.py: Timeout support has been overhauled to provide
641 timeouts under Python 2.2 as well as 2.3, and to provide more
644 2003-08-30 Bob Halley <halley@dnspython.org>
646 * dns/zone.py: dns.exception.SyntaxError is raised for unknown
647 master file directives.
649 2003-08-28 Bob Halley <halley@dnspython.org>
651 * dns/zone.py: $INCLUDE processing is now enabled/disabled using
652 the allow_include parameter. The default is to process $INCLUDE
653 for from_file(), and to disallow $INCLUDE for from_text(). The
654 master reader now calls zone.check_origin_node() by default after
655 the zone has been read. find_rdataset() called get_node() instead
656 of find_node(), which result in an incorrect exception. The
657 relativization state of a zone is now remembered and applied
658 consistently when looking up names. from_xfr() now supports
659 relativization like the _MasterReader.
661 2003-08-22 Bob Halley <halley@dnspython.org>
663 * dns/zone.py: The _MasterReader now understands $INCLUDE.
665 2003-08-12 Bob Halley <halley@dnspython.org>
667 * dns/zone.py: The _MasterReader now specifies the file and line
668 number when a syntax error occurs. The BIND 8 TTL format is now
669 understood when loading a zone, though it will never be emitted.
670 The from_file() function didn't pass the zone_factory parameter
673 2003-08-10 Bob Halley <halley@dnspython.org>
675 * (Version 1.1.0 released)
677 2003-08-07 Bob Halley <halley@dnspython.org>
679 * dns/update.py (Update._add): A typo meant that _add would
680 fail if the thing being added was an Rdata object (as
681 opposed to an Rdataset or the textual form of an Rdata).
683 2003-08-05 Bob Halley <halley@dnspython.org>
685 * dns/set.py: the simple Set class has been moved to its
686 own module, and augmented to support more set operations.
688 2003-08-04 Bob Halley <halley@dnspython.org>
690 * Node and all rdata types have been "slotted". This speeds
691 things up a little and reduces memory usage noticeably.
693 2003-08-02 Bob Halley <halley@dnspython.org>
695 * (Version 1.1.0c1 released)
697 2003-08-02 Bob Halley <halley@dnspython.org>
699 * dns/rdataset.py: SimpleSets now support more set options.
701 * dns/message.py: Added the get_rrset() method. from_file() now
702 allows Unicode filenames and turns on universal newline support if
703 it opens the file itself.
705 * dns/node.py: Added the delete_rdataset() and replace_rdataset()
708 * dns/zone.py: Added the delete_node(), delete_rdataset(), and
709 replace_rdataset() methods. from_file() now allows Unicode
710 filenames and turns on universal newline support if it opens the
711 file itself. Added a to_file() method.
713 2003-08-01 Bob Halley <halley@dnspython.org>
715 * dns/opcode.py: Opcode from/to text converters now understand
716 numeric opcodes. The to_text() method will return a numeric opcode
717 string if it doesn't know a text name for the opcode.
719 * dns/message.py: Added set_rcode(). Fixed code where ednsflags
720 wasn't treated as a long.
722 * dns/rcode.py: ednsflags wasn't treated as a long. Rcode from/to
723 text converters now understand numeric rcodes. The to_text()
724 method will return a numeric rcode string if it doesn't know
725 a text name for the rcode.
727 * examples/reverse.py: Added a new example program that builds a
728 reverse (address-to-name) mapping table from the name-to-address
729 mapping specified by A RRs in zone files.
731 * dns/node.py: Added get_rdataset() method.
733 * dns/zone.py: Added get_rdataset() and get_rrset() methods. Added
736 2003-07-31 Bob Halley <halley@dnspython.org>
738 * dns/zone.py: Added the iterate_rdatasets() method which returns
739 a generator which yields (name, rdataset) tuples for all the
740 rdatasets in the zone matching the specified rdatatype.
742 2003-07-30 Bob Halley <halley@dnspython.org>
744 * (Version 1.1.0b2 released)
746 2003-07-30 Bob Halley <halley@dnspython.org>
748 * dns/zone.py: Added find_rrset() and find_rdataset() convenience
749 methods. They let you retrieve rdata with the specified name
750 and type in one call.
752 * dns/node.py: Nodes no longer have names; owner names are
753 associated with nodes in the Zone object's nodes dictionary.
755 * dns/zone.py: Zone objects now implement more of the standard
756 mapping interface. __iter__ has been changed to iterate the keys
757 rather than values to match the standard mapping interface's
760 2003-07-20 Bob Halley <halley@dnspython.org>
762 * dns/ipv6.py (inet_ntoa): Handle embedded IPv4 addresses.
764 2003-07-19 Bob Halley <halley@dnspython.org>
766 * (Version 1.1.0b1 released)
768 2003-07-18 Bob Halley <halley@dnspython.org>
770 * dns/tsig.py: The TSIG validation of TCP streams where not
771 every message is signed now works correctly.
773 * dns/zone.py: Zones can now be compared for equality and
774 inequality. If the other object in the comparison is also
775 a zone, then "the right thing" happens; i.e. the zones are
776 equal iff.: they have the same rdclass, origin, and nodes.
778 2003-07-17 Bob Halley <halley@dnspython.org>
780 * dns/message.py (Message.use_tsig): The method now allows for
781 greater control over the various fields in the generated signature
783 (_WireReader._get_section): UnknownTSIGKey is now raised if an
784 unknown key is encountered, or if a signed message has no keyring.
786 2003-07-16 Bob Halley <halley@dnspython.org>
788 * dns/tokenizer.py (Tokenizer._get_char): get_char and unget_char
789 have been renamed to _get_char and _unget_char since they are not
790 useful to clients of the tokenizer.
792 2003-07-15 Bob Halley <halley@dnspython.org>
794 * dns/zone.py (_MasterReader._rr_line): owner names were being
795 unconditionally relativized; it makes much more sense for them
796 to be relativized according to the relativization setting of
799 2003-07-12 Bob Halley <halley@dnspython.org>
801 * dns/resolver.py (Resolver.read_resolv_conf): The resolv.conf
802 parser did not allow blank / whitespace-only lines, nor did it
803 allow comments. Both are now supported.
805 2003-07-11 Bob Halley <halley@dnspython.org>
807 * dns/name.py (Name.to_digestable): to_digestable() now
808 requires an origin to be specified if the name is relative.
809 It will raise NeedAbsoluteNameOrOrigin if the name is
810 relative and there is either no origin or the origin is
812 (Name.split): returned the wrong answer if depth was 0 or depth
813 was the length of the name. split() now does bounds checking
814 on depth, and raises ValueError if depth < 0 or depth > the length
817 2003-07-10 Bob Halley <halley@dnspython.org>
819 * dns/ipv6.py (inet_ntoa): The routine now minimizes its output
820 strings. E.g. the IPv6 address
821 "0000:0000:0000:0000:0000:0000:0000:0001" is minimized to "::1".
822 We do not, however, make any effort to display embedded IPv4
823 addresses in the dot-quad notation.
825 2003-07-09 Bob Halley <halley@dnspython.org>
827 * dns/inet.py: We now supply our own AF_INET and AF_INET6
828 constants since AF_INET6 may not always be available. If the
829 socket module has AF_INET6, we will use it. If not, we will
830 use our own value for the constant.
832 * dns/query.py: the functions now take an optional af argument
833 specifying the address family to use when creating the socket.
835 * dns/rdatatype.py (is_metatype): a typo caused the function
836 return true only for type OPT.
838 * dns/message.py: message section list elements are now RRsets
839 instead of Nodes. This API change makes processing messages
840 easier for many applications.
842 2003-07-07 Bob Halley <halley@dnspython.org>
844 * dns/rrset.py: added. An RRset is a named rdataset.
846 * dns/rdataset.py (Rdataset.__eq__): rdatasets may now be compared
847 for equality and inequality with other objects. Rdataset instance
848 variables are now slotted.
850 * dns/message.py: The wire format and text format readers are now
851 classes. Variables related to reader state have been moved out
852 of the message class.
854 2003-07-06 Bob Halley <halley@dnspython.org>
856 * dns/name.py (from_text): '@' was not interpreted as the empty
859 * dns/zone.py: the master file reader derelativized names in rdata
860 relative to the zone's origin, not relative to the current origin.
861 The reader now deals with relativization in two steps. The rdata
862 is read and derelativized using the current origin. The rdata's
863 relativity is then chosen using the zone origin and the relativize
864 boolean. Here's an example.
870 If the zone origin is example., and relativization is on, then
871 This fragment will become:
873 bar.foo.example. 300 IN MX 0 blaz.foo.example.
875 after the first step (derelativization to current origin), and
877 bar.foo 300 IN MX 0 blaz.foo
879 after the second step (relativiation to zone origin).
881 * dns/namedict.py: added.
883 * dns/zone.py: The master file reader has been made into its
884 own class. Reader-related instance variables have been moved
885 form the zone class into the reader class.
887 * dns/zone.py: Add node_factory class attribute. An application
888 can now subclass Zone and Node and have a zone whose nodes are of
889 the subclassed Node type. The from_text(), from_file(), and
890 from_xfr() algorithms now take an optional zone_factory argument.
891 This allows the algorithms to be used to create zones whose class
892 is a subclass of Zone.
895 2003-07-04 Bob Halley <halley@dnspython.org>
897 * dns/renderer.py: added new wire format rendering module and
898 converted message.py to use it. Applications which want
899 fine-grained control over the conversion to wire format may call
900 the renderer directy, instead of having it called on their behalf
903 2003-07-02 Bob Halley <halley@dnspython.org>
905 * dns/name.py (_validate_labels): The NameTooLong test was
908 * dns/message.py (Message.to_wire): dns.exception.TooBig is
909 now raised if the wire encoding exceeds the specified
912 2003-07-01 Bob Halley <halley@dnspython.org>
914 * dns/message.py: EDNS encoding was broken. from_text()
915 didn't parse rcodes, flags, or eflags correctly. Comparing
916 messages with other types of objects didn't work.
918 2003-06-30 Bob Halley <halley@dnspython.org>
920 * (Version 1.0.0 released)
922 2003-06-30 Bob Halley <halley@dnspython.org>
924 * dns/rdata.py: Rdatas now implement rich comparisons instead of
927 * dns/name.py: Names now implement rich comparisons instead of
930 * dns/inet.py (inet_ntop): Always use our code, since the code
931 in the socket module doesn't support AF_INET6 conversions if
932 IPv6 sockets are not available on the system.
934 * dns/resolver.py (Answer.__init__): A dangling CNAME chain was
935 not raising NoAnswer.
937 * Added a simple resolver Cache class.
939 * Added an expiration attribute to answer instances.
941 2003-06-24 Bob Halley <halley@dnspython.org>
943 * (Version 1.0.0b3 released)
945 2003-06-24 Bob Halley <halley@dnspython.org>
947 * Renamed module "DNS" to "dns" to avoid conflicting with
950 2003-06-23 Bob Halley <halley@dnspython.org>
952 * The from_text() relativization controls now work the same way as
953 the to_text() controls.
955 * DNS/rdata.py: The parsing of generic rdata was broken.
957 2003-06-21 Bob Halley <halley@dnspython.org>
959 * (Version 1.0.0b2 released)
961 2003-06-21 Bob Halley <halley@dnspython.org>
963 * The Python 2.2 socket.inet_aton() doesn't seem to like
964 '255.255.255.255'. We work around this.
966 * Fixed bugs in rdata to_wire() and from_wire() routines of a few
967 types. These bugs were discovered by running the tests/zone.py
970 * Added implementation of type APL.
972 2003-06-20 Bob Halley <halley@dnspython.org>
974 * DNS/rdtypes/IN/AAAA.py: Use our own versions of inet_ntop and
975 inet_pton if the socket module doesn't provide them for us.
977 * The resolver now does a better job handling exceptions. In
978 particular, it no longer eats all exceptions; rather it handles
979 those exceptions it understands, and leaves the rest uncaught.
981 * Exceptions have been pulled into their own module. Almost all
982 exceptions raised by the code are now subclasses of
983 DNS.exception.DNSException. All form errors are subclasses of
984 DNS.exception.FormError (which is itself a subclass of
985 DNS.exception.DNSException).
987 2003-06-19 Bob Halley <halley@dnspython.org>
989 * Added implementations of types DS, NXT, SIG, and WKS.
991 * __cmp__ for type A and AAAA could produce incorrect results.
993 2003-06-18 Bob Halley <halley@dnspython.org>
995 * Started test suites for zone.py and tokenizer.py.
997 * Added implementation of type KEY.
999 * DNS/rdata.py(_base64ify): \n could be emitted erroneously.
1001 * DNS/rdtypes/ANY/SOA.py (SOA.from_text): The SOA RNAME field could
1002 be set to the value of MNAME in common cases.
1004 * DNS/rdtypes/ANY/X25.py: __init__ was broken.
1006 * DNS/zone.py (from_text): $TTL handling erroneously caused the
1007 next line to be eaten.
1009 * DNS/tokenizer.py (Tokenizer.get): parsing was broken for empty
1010 quoted strings. Quoted strings didn't handle \ddd escapes. Such
1011 escapes are appear not to comply with RFC 1035, but BIND allows
1012 them and they seem useful, so we allow them too.
1014 * DNS/rdtypes/ANY/ISDN.py (ISDN.from_text): parsing was
1015 broken for ISDN RRs without subaddresses.
1017 * DNS/zone.py (from_file): from_file() didn't work because
1018 some required parameters were not passed to from_text().
1020 2003-06-17 Bob Halley <halley@dnspython.org>
1022 * (Version 1.0.0b1 released)
1024 2003-06-17 Bob Halley <halley@dnspython.org>
1026 * Added implementation of type PX.
1028 2003-06-16 Bob Halley <halley@dnspython.org>
1030 * Added implementation of types CERT, GPOS, LOC, NSAP, NSAP-PTR.
1032 * DNS/rdatatype.py (_by_value): A cut-and-paste error had broken
1035 2003-06-12 Bob Halley <halley@dnspython.org>
1037 * Created a tests directory and started adding tests.
1039 * Added "and its documentation" to the permission grant in the
1042 2003-06-12 Bob Halley <halley@dnspython.org>
1044 * DNS/name.py (Name.is_wild): is_wild() erroneously raised IndexError
1045 if the name was empty.
1047 2003-06-10 Bob Halley <halley@dnspython.org>
1049 * Added implementations of types AFSDB, X25, and ISDN.
1051 * The documentation associated with the various rdata types has been
1052 improved. In particular, instance variables are now described.
1054 2003-06-09 Bob Halley <halley@dnspython.org>
1056 * Added implementations of types HINFO, RP, and RT.
1058 * DNS/message.py (make_query): Document that make_query() sets
1059 flags to DNS.flags.RD, and chooses a random query id.
1061 2003-06-05 Bob Halley <halley@dnspython.org>
1063 * (Version 1.0.0a2 released)
1065 2003-06-05 Bob Halley <halley@dnspython.org>
1067 * DNS/node.py: removed __getitem__ and __setitem__, since
1068 they are not used by the codebase and were not useful in
1071 * DNS/message.py (from_file): from_file() now allows a
1072 filename to be specified instead of a file object.
1074 * DNS/rdataset.py: The is_compatible() method of the
1075 DNS.rdataset.Rdataset class was deleted.
1077 2003-06-04 Bob Halley <halley@dnspython.org>
1079 * DNS/name.py (class Name): Names are now immutable.
1081 * DNS/name.py: the is_comparable() method has been removed, since
1082 names are always comparable.
1084 * DNS/resolver.py (Resolver.query): A query could run for up
1085 to the lifetime + the timeout. This has been corrected and the
1086 query will now only run up to the lifetime.
1088 2003-06-03 Bob Halley <halley@dnspython.org>
1090 * DNS/resolver.py: removed the 'new' function since it is not the
1091 style of the library to have such a function. Call
1092 DNS.resolver.Resolver() to make a new resolver.
1094 2003-06-03 Bob Halley <halley@dnspython.org>
1096 * DNS/resolver.py (Resolver._config_win32_fromkey): The DhcpServer
1097 list is space separated, not comma separated.
1099 2003-06-03 Bob Halley <halley@dnspython.org>
1101 * DNS/update.py: Added an update module to make generating updates
1104 2003-06-03 Bob Halley <halley@dnspython.org>
1106 * Commas were missing in some of the __all__ entries in various
1109 2003-05-30 Bob Halley <halley@dnspython.org>
1111 * (Version 1.0.0a1 released)