5ab983875db9bd0316daa4fed58f4895f44261d1
[third_party/dnspython] / ChangeLog
1
2 2012-04-07  Bob Halley  <halley@dnspython.org>
3
4         * dns/zone.py (from_xfr): dns.zone.from_xfr() now takes a
5           'check_origin' parameter which defaults to True.  If set to
6           False, then dnspython will not make origin checks on the zone.
7           Thanks to Carlos Perez for the report.
8
9         * dns/rdtypes/ANY/SSHFP.py (SSHFP.from_text): Allow whitespace in
10           the text string.  Thanks to Jan Andres for the report and the
11           patch.
12
13         * dns/message.py (from_wire): dns.message.from_wire() now takes
14           an 'ignore_trailing' parameter which defaults to False.  If set
15           to True, then trailing junk will be ignored instead of causing
16           TrailingJunk to be raised.  Thanks to Shane Huntley for
17           contributing the patch.
18
19 2011-08-22  Bob Halley  <halley@dnspython.org>
20
21         * dns/resolver.py: Added LRUCache.  In this cache implementation,
22           the cache size is limited to a user-specified number of nodes, and
23           when adding a new node to a full cache the least-recently used
24           node is removed.
25
26 2011-07-13  Bob Halley  <halley@dnspython.org>
27
28         * dns/resolver.py: dns.resolver.override_system_resolver()
29           overrides the socket module's versions of getaddrinfo(),
30           getnameinfo(), getfqdn(), gethostbyname(), gethostbyname_ex() and
31           gethostbyaddr() with an implementation which uses a dnspython stub
32           resolver instead of the system's stub resolver.  This can be
33           useful in testing situations where you want to control the
34           resolution behavior of python code without having to change the
35           system's resolver settings (e.g. /etc/resolv.conf).
36           dns.resolver.restore_system_resolver() undoes the change.
37
38 2011-07-08  Bob Halley  <halley@dnspython.org>
39
40         * dns/ipv4.py: dnspython now provides its own, stricter, versions
41           of IPv4 inet_ntoa() and inet_aton() instead of using the OS's
42           versions.
43
44         * dns/ipv6.py: inet_aton() now bounds checks embedded IPv4 addresses
45           more strictly.  Also, now only dns.exception.SyntaxError can be
46           raised on bad input.
47
48 2011-04-05  Bob Halley  <halley@dnspython.org>
49
50         * Old DNSSEC types (KEY, NXT, and SIG) have been removed.
51
52         * Bounds checking of slices in rdata wire processing is now more
53           strict, and bounds errors (e.g. we got less data than was
54           expected) now raise dns.exception.FormError rather than
55           IndexError.
56
57 2011-03-28  Bob Halley  <halley@dnspython.org>
58
59         * (Version 1.9.4 released)
60
61 2011-03-24  Bob Halley  <halley@dnspython.org>
62
63         * dns/rdata.py (Rdata._wire_cmp): We need to specify no
64           compression and an origin to _wire_cmp() in case names in the
65           rdata are relative names.
66
67         * dns/rdtypes/ANY/SIG.py (SIG._cmp): Add missing 'import struct'.
68           Thanks to Arfrever Frehtes Taifersar Arahesis for reporting the
69           problem.
70
71 2011-03-24  Bob Halley  <halley@dnspython.org>
72
73         * (Version 1.9.3 released)
74
75 2011-03-22  Bob Halley  <halley@dnspython.org>
76
77         * dns/resolver.py: a boolean parameter, 'raise_on_no_answer', has
78           been added to the query() methods.  In no-error, no-data
79           situations, this parameter determines whether NoAnswer should be
80           raised or not.  If True, NoAnswer is raised.  If False, then an
81           Answer() object with a None rrset will be returned.
82
83         * dns/resolver.py: Answer() objects now have a canonical_name field.
84
85 2011-01-11  Bob Halley  <halley@dnspython.org>
86
87         * Dnspython was erroneously doing case-insensitive comparisons
88           of the names in NSEC and RRSIG RRs.  Thanks to Casey Deccio for
89           reporting this bug.
90
91 2010-12-17  Bob Halley  <halley@dnspython.org>
92
93         * dns/message.py (_WireReader._get_section): use "is" and not "=="
94           when testing what section an RR is in.  Thanks to James Raftery
95           for reporting this bug.
96
97 2010-12-10  Bob Halley  <halley@dnspython.org>
98
99         * dns/resolver.py (Resolver.query): disallow metaqueries.
100
101         * dns/rdata.py (Rdata.__hash__): Added a __hash__ method for rdata.
102
103 2010-11-23  Bob Halley  <halley@dnspython.org>
104
105         * (Version 1.9.2 released)
106
107 2010-11-23  Bob Halley  <halley@dnspython.org>
108
109         * dns/dnssec.py (_need_pycrypto): DSA and RSA are modules, not
110           functions, and I didn't notice because the test suite masked
111           the bug!  *sigh*
112
113 2010-11-22  Bob Halley  <halley@dnspython.org>
114
115         * (Version 1.9.1 released)
116
117 2010-11-22  Bob Halley  <halley@dnspython.org>
118
119         * dns/dnssec.py: the "from" style import used to get DSA from
120           PyCrypto trashed a DSA constant.  Now a normal import is used
121           to avoid namespace contamination.
122
123 2010-11-20  Bob Halley  <halley@dnspython.org>
124
125         * (Version 1.9.0 released)
126
127 2010-11-07  Bob Halley  <halley@dnspython.org>
128
129         * dns/dnssec.py: Added validate() to do basic DNSSEC validation
130           (requires PyCrypto). Thanks to Brian Wellington for the patch.
131
132         * dns/hash.py: Hash compatibility handling is now its own module.
133
134 2010-10-31  Bob Halley  <halley@dnspython.org>
135
136         * dns/resolver.py (zone_for_name): A query name resulting in a
137           CNAME or DNAME response to a node which had an SOA was incorrectly
138           treated as a zone origin.  In these cases, we should just look
139           higher.  Thanks to Gert Berger for reporting this problem.
140
141         * Added zonediff.py to examples.  This program compares two zones
142           and shows the differences either in diff-like plain text, or
143           HTML.  Thanks to Dennis Kaarsemaker for contributing this
144           useful program.
145
146 2010-10-27  Bob Halley  <halley@dnspython.org>
147
148         * Incorporate a patch to use poll() instead of select() by
149           default on platforms which support it.  Thanks to
150           Peter Schüller and Spotify for the contribution.
151
152 2010-10-17  Bob Halley  <halley@dnspython.org>
153
154         * Python prior to 2.5.2 doesn't compute the correct values for
155           HMAC-SHA384 and HMAC-SHA512.  We now detect attempts to use
156           them and raise NotImplemented if the Python version is too old.
157           Thanks to Kevin Chen for reporting the problem.
158
159         * Various routines that took the string forms of rdata types and
160           classes did not permit the strings to be Unicode strings.
161           Thanks to Ryan Workman for reporting the issue.
162
163         * dns/tsig.py: Added symbolic constants for the algorithm strings.
164           E.g. you can now say dns.tsig.HMAC_MD5 instead of
165           "HMAC-MD5.SIG-ALG.REG.INT".  Thanks to Cillian Sharkey for
166           suggesting this improvement.
167
168         * dns/tsig.py (get_algorithm): fix hashlib compatibility; thanks to
169           Kevin Chen for the patch.
170
171         * dns/dnssec.py: Added key_id() and make_ds().
172
173         * dns/message.py: message.py needs to import dns.edns since it uses
174           it.
175
176 2010-05-04  Bob Halley  <halley@dnspython.org>
177
178         * dns/rrset.py (RRset.__init__): "covers" was not passed to the
179           superclass __init__().  Thanks to Shanmuga Rajan for reporting
180           the problem.
181
182 2010-03-10  Bob Halley  <halley@dnspython.org>
183
184         * The TSIG algorithm value was passed to use_tsig() incorrectly
185           in some cases.  Thanks to 'ducciovigolo' for reporting the problem.
186
187 2010-01-26  Bob Halley  <halley@dnspython.org>
188
189         * (Version 1.8.0 released)
190
191 2010-01-13  Bob Halley  <halley@dnspython.org>
192
193         * dns/dnssec.py: Added RSASHA256 and RSASHA512 codepoints; added
194           other missing codepoints to _algorithm_by_text.
195
196 2010-01-12  Bob Halley  <halley@dnspython.org>
197
198         * Escapes in masterfiles now work correctly.  Previously they were
199           only working correctly when the text involved was part of a domain
200           name.
201
202         * dns/tokenizer.py: The tokenizer's get() method now returns Token
203           objects, not (type, text) tuples.
204
205 2009-11-13  Bob Halley  <halley@dnspython.org>
206
207         * Support has been added for hmac-sha1, hmac-sha224, hmac-sha256,
208           hmac-sha384 and hmac-sha512.  Thanks to Kevin Chen for a
209           thoughtful, high quality patch.
210
211         * dns/update.py (Update::present): A zero TTL was not added if
212           present() was called with a single rdata, causing _add() to be
213           unhappy.  Thanks to Eugene Kim for reporting the problem and
214           submitting a patch.
215
216         * dns/entropy.py: Use os.urandom() if present.  Don't seed until
217           someone wants randomness.
218
219 2009-09-16  Bob Halley  <halley@dnspython.org>
220
221         * dns/entropy.py: The entropy module needs locking in order to be
222           used safely in a multithreaded environment.  Thanks to Beda Kosata
223           for reporting the problem.
224
225 2009-07-27  Bob Halley  <halley@dnspython.org>
226
227         * dns/query.py (xfr): The socket was not set to nonblocking mode.
228           Thanks to Erik Romijn for reporting this problem.
229
230 2009-07-23  Bob Halley  <halley@dnspython.org>
231
232         * dns/rdtypes/IN/SRV.py (SRV._cmp): SRV records were compared
233           incorrectly due to a cut-and-paste error.  Thanks to Tommie
234           Gannert for reporting this bug.
235
236         * dns/e164.py (query): The resolver parameter was not used.
237           Thanks to Matías Bellone for reporting this bug.
238
239 2009-06-23  Bob Halley  <halley@dnspython.org>
240
241         * dns/entropy.py (EntropyPool.__init__): open /dev/random unbuffered;
242           there's no need to consume more randomness than we need.  Thanks
243           to Brian Wellington for the patch.
244
245 2009-06-19  Bob Halley  <halley@dnspython.org>
246
247         * (Version 1.7.1 released)
248
249 2009-06-19  Bob Halley  <halley@dnspython.org>
250
251         * DLV.py was omitted from the kit
252
253         * Negative prerequisites were not handled correctly in _get_section().
254
255 2009-06-19  Bob Halley  <halley@dnspython.org>
256
257         * (Version 1.7.0 released)
258
259 2009-06-19  Bob Halley  <halley@dnspython.org>
260
261         * On Windows, the resolver set the domain incorrectly.  Thanks
262           to Brandon Carpenter for reporting this bug.
263
264         * Added a to_digestable() method to rdata classes; it returns the
265           digestable form (i.e. DNSSEC canonical form) of the rdata.  For
266           most rdata types this is the same uncompressed wire form.  For
267           certain older DNS RR types, however, domain names in the rdata
268           are downcased.
269
270        * Added support for the HIP RR type.
271
272 2009-06-18  Bob Halley  <halley@dnspython.org>
273
274        * Added support for the DLV RR type.
275
276        * Added various DNSSEC related constants (e.g. algorithm identifiers,
277          flag values).
278
279        * dns/tsig.py: Added support for BADTRUNC result code.
280
281        * dns/query.py (udp): When checking that addresses are the same,
282          use the binary form of the address in the comparison.  This
283          ensures that we don't treat addresses as different if they have
284          equivalent but differing textual representations.  E.g. "1:00::1"
285          and "1::1" represent the same address but are not textually equal.
286          Thanks to Kim Davies for reporting this bug.
287
288        * The resolver's query() method now has an optional 'source' parameter,
289          allowing the source IP address to be specified.  Thanks to
290          Alexander Lind for suggesting the change and sending a patch.
291
292        * Added NSEC3 and NSEC3PARAM support.
293
294 2009-06-17  Bob Halley  <halley@dnspython.org>
295
296         * Fixed NSEC.to_text(), which was only printing the last window.
297           Thanks to Brian Wellington for finding the problem and fixing it.
298
299 2009-03-30  Bob Halley  <halley@dnspython.org>
300
301         * dns/query.py (xfr): Allow UDP IXFRs.  Use "one_rr_per_rrset" mode when
302           doing IXFR.
303
304 2009-03-30  Bob Halley  <halley@dnspython.org>
305
306         * Add "one_rr_per_rrset" mode switch to methods which parse
307           messages from wire format (e.g. dns.message.from_wire(),
308           dns.query.udp(), dns.query.tcp()).  If set, each RR read is
309           placed in its own RRset (instead of being coalesced).
310
311 2009-03-30  Bob Halley  <halley@dnspython.org>
312
313         * Added EDNS option support.
314
315 2008-10-16  Bob Halley  <halley@dnspython.org>
316
317         * dns/rdtypes/ANY/DS.py: The from_text() parser for DS RRs did not
318           allow multiple Base64 chunks.  Thanks to Rakesh Banka for
319           finding this bug and submitting a patch.
320
321 2008-10-08  Bob Halley  <halley@dnspython.org>
322
323         * Add entropy module.
324
325         * When validating TSIGs, we need to use the absolute name.
326
327 2008-06-03  Bob Halley  <halley@dnspython.org>
328
329         * dns/message.py (Message.set_rcode): The mask used preserved the
330           extended rcode, instead of everything else in ednsflags.
331
332         * dns/message.py (Message.use_edns): ednsflags was not kept
333           coherent with the specified edns version.
334
335 2008-02-06  Bob Halley  <halley@dnspython.org>
336
337         * dns/ipv6.py (inet_aton):  We could raise an exception other than
338           dns.exception.SyntaxError in some cases.
339
340         * dns/tsig.py: Raise an exception when the peer has set a non-zero
341           TSIG error.
342
343 2007-11-25  Bob Halley  <halley@dnspython.org>
344
345         * (Version 1.6.0 released)
346
347 2007-11-25  Bob Halley  <halley@dnspython.org>
348
349         * dns/query.py (_wait_for): if select() raises an exception due to
350           EINTR, we should just select() again.
351
352 2007-06-13  Bob Halley  <halley@dnspython.org>
353
354         * dns/inet.py: Added is_multicast().
355
356         * dns/query.py (udp):  If the queried address is a multicast address, then
357           don't check that the address of the response is the same as the address
358           queried.
359
360 2007-05-24  Bob Halley  <halley@dnspython.org>
361
362         * dns/rdtypes/IN/NAPTR.py: NAPTR comparisons didn't compare the
363           preference field due to a typo.
364
365 2007-02-07  Bob Halley  <halley@dnspython.org>
366
367         * dns/resolver.py: Integrate code submitted by Paul Marks to
368           determine whether a Windows NIC is enabled.  The way dnspython
369           used to do this does not work on Windows Vista.
370
371 2006-12-10  Bob Halley  <halley@dnspython.org>
372
373         * (Version 1.5.0 released)
374
375 2006-11-03  Bob Halley  <halley@dnspython.org>
376
377         * dns/rdtypes/IN/DHCID.py: Added support for the DHCID RR type.
378
379 2006-11-02  Bob Halley  <halley@dnspython.org>
380
381         * dns/query.py (udp): Messages from unexpected sources can now be
382           ignored by setting ignore_unexpected to True.
383
384 2006-10-31  Bob Halley  <halley@dnspython.org>
385
386         * dns/query.py (udp): When raising UnexpectedSource, add more
387           detail about what went wrong to the exception.
388
389 2006-09-22  Bob Halley  <halley@dnspython.org>
390
391         * dns/message.py (Message.use_edns): add reasonable defaults for
392           the ednsflags, payload, and request_payload parameters.
393
394         * dns/message.py (Message.want_dnssec): add a convenience method for
395           enabling/disabling the "DNSSEC desired" flag in requests.
396
397         * dns/message.py (make_query): add "use_edns" and "want_dnssec"
398           parameters.
399
400 2006-08-17  Bob Halley  <halley@dnspython.org>
401
402         * dns/resolver.py (Resolver.read_resolv_conf): If /etc/resolv.conf
403           doesn't exist, just use the default resolver configuration (i.e.
404           the same thing we would have used if resolv.conf had existed and
405           been empty).
406
407 2006-07-26  Bob Halley  <halley@dnspython.org>
408
409         * dns/resolver.py (Resolver._config_win32_fromkey): fix
410           cut-and-paste error where we passed the wrong variable to
411           self._config_win32_search().  Thanks to David Arnold for finding
412           the bug and submitting a patch.
413
414 2006-07-20  Bob Halley  <halley@dnspython.org>
415
416         * dns/resolver.py (Answer): Add more support for the sequence
417           protocol, forwarding requests to the answer object's rrset.
418           E.g. "for a in answer" is equivalent to "for a in answer.rrset",
419           "answer[i]" is equivalent to "answer.rrset[i]", and
420           "answer[i:j]" is equivalent to "answer.rrset[i:j]".
421
422 2006-07-19  Bob Halley  <halley@dnspython.org>
423
424         * dns/query.py (xfr): Add IXFR support.
425
426 2006-06-22  Bob Halley  <halley@dnspython.org>
427
428         * dns/rdtypes/IN/IPSECKEY.py: Added support for the IPSECKEY RR type.
429
430 2006-06-21  Bob Halley  <halley@dnspython.org>
431
432         * dns/rdtypes/ANY/SPF.py: Added support for the SPF RR type.
433
434 2006-06-02  Bob Halley  <halley@dnspython.org>
435
436         * (Version 1.4.0 released)
437
438 2006-04-25  Bob Halley  <halley@dnspython.org>
439
440         * dns/rrset.py (RRset.to_rdataset): Added a convenience method
441           to convert an rrset into an rdataset.
442
443 2006-03-27  Bob Halley  <halley@dnspython.org>
444
445         * Added dns.e164.query().  This function can be used to look for
446           NAPTR RRs for a specified number in several domains, e.g.:
447
448                 dns.e164.query('16505551212',
449                                ['e164.dnspython.org.', 'e164.arpa.'])
450
451 2006-03-26  Bob Halley  <halley@dnspython.org>
452
453         * dns/resolver.py (Resolver.query): The resolver deleted from
454           a list while iterating it, which makes the iterator unhappy.
455
456 2006-03-17  Bob Halley  <halley@dnspython.org>
457
458         * dns/resolver.py (Resolver.query): The resolver needlessly
459           delayed responses for successful queries.
460
461 2006-01-18  Bob Halley  <halley@dnspython.org>
462
463         * dns/rdata.py: added a validate() method to the rdata class.  If
464           you change an rdata by assigning to its fields, it is a good
465           idea to call validate() when you are done making changes.
466           For example, if 'r' is an MX record and then you execute:
467
468                 r.preference = 100000   # invalid, because > 65535
469                 r.validate()
470
471           The validation will fail and an exception will be raised.
472
473 2006-01-11  Bob Halley  <halley@dnspython.org>
474
475         * dns/ttl.py: TTLs are now bounds checked to be within the closed
476           interval [0, 2^31 - 1].
477
478         * The BIND 8 TTL syntax is now accepted in the SOA refresh, retry,
479           expire, and minimum fields, and in the original_ttl field of
480           SIG and RRSIG records.
481
482 2006-01-04  Bob Halley  <halley@dnspython.org>
483
484         * dns/resolver.py: The windows registry irritatingly changes the
485           list element delimiter in between ' ' and ',' (and vice-versa)
486           in various versions of windows.  We now cope by always looking
487           for either one (' ' first).
488
489 2005-12-27  Bob Halley  <halley@dnspython.org>
490
491         * dns/e164.py: Added routines to convert between E.164 numbers and
492           their ENUM domain name equivalents.
493
494         * dns/reversename.py: Added routines to convert between IPv4 and
495           IPv6 addresses and their DNS reverse-map equivalents.
496
497 2005-12-18  Bob Halley  <halley@dnspython.org>
498
499         * dns/rdtypes/ANY/LOC.py (_tuple_to_float): The sign was lost when
500           converting a tuple into a float, which broke conversions of
501           south latitudes and west longitudes.
502
503 2005-11-17  Bob Halley  <halley@dnspython.org>
504
505         * dns/zone.py: The 'origin' parameter to from_text() and from_file()
506           is now optional.  If not specified, dnspython will use the
507           first $ORIGIN in the text as the zone's origin.
508
509         * dns/zone.py: Sanity checks of the zone's origin node can now
510           be disabled.
511
512 2005-11-12  Bob Halley  <halley@dnspython.org>
513
514         * dns/name.py: Preliminary Unicode support has been added for
515           domain names.  Running dns.name.from_text() on a Unicode string
516           will now encode each label using the IDN ACE encoding.  The
517           to_unicode() method may be used to convert a dns.name.Name with
518           IDN ACE labels back into a Unicode string.  This functionality
519           requires Python 2.3 or greater.
520
521 2005-10-31  Bob Halley  <halley@dnspython.org>
522
523         * (Version 1.3.5 released)
524
525 2005-10-12  Bob Halley  <halley@dnspython.org>
526
527         * dns/zone.py: Zone.iterate_rdatasets() and Zone.iterate_rdatas()
528           did not have a default rdtype of dns.rdatatype.ANY as their
529           docstrings said they did.  They do now.
530
531 2005-10-06  Bob Halley  <halley@dnspython.org>
532
533         * dns/name.py: Added the parent() method, which returns the
534           parent of a name.
535
536 2005-10-01  Bob Halley  <halley@dnspython.org>
537
538         * dns/resolver.py: Added zone_for_name() helper, which returns
539           the name of the zone which contains the specified name.
540
541         * dns/resolver.py: Added get_default_resolver(), which returns
542           the default resolver, initializing it if necessary.
543
544 2005-09-29  Bob Halley  <halley@dnspython.org>
545
546         * dns/resolver.py (Resolver._compute_timeout): If time goes
547           backwards a little bit, ignore it.
548
549 2005-07-31  Bob Halley  <halley@dnspython.org>
550
551         * (Version 1.3.4 released)
552
553 2005-07-31  Bob Halley  <halley@dnspython.org>
554
555         * dns/message.py (make_response): Trying to respond to a response
556           threw a NameError while trying to throw a FormErr since it used
557           the wrong name for the FormErr exception.
558
559         * dns/query.py (_connect): We needed to ignore EALREADY too.
560
561         * dns/query.py: Optional "source" and "source_port" parameters
562           have been added to udp(), tcp(), and xfr().  Thanks to Ralf
563           Weber for suggesting the change and providing a patch.
564
565 2005-06-05  Bob Halley  <halley@dnspython.org>
566
567         * dns/query.py: The requirement that the "where" parameter be
568           an IPv4 or IPv6 address is now documented.
569
570 2005-06-04  Bob Halley  <halley@dnspython.org>
571
572         * dns/resolver.py: The resolver now does exponential backoff
573           each time it runs through all of the nameservers.
574
575         * dns/resolver.py: rcodes which indicate a nameserver is likely
576           to be a "permanent failure" for a query cause the nameserver
577           to be removed from the mix for that query.
578
579 2005-01-30  Bob Halley  <halley@dnspython.org>
580
581         * (Version 1.3.3 released)
582
583 2004-10-25  Bob Halley  <halley@dnspython.org>
584
585         * dns/rdtypes/ANY/TXT.py (TXT.from_text): The masterfile parser
586         incorrectly rejected TXT records where a value was not quoted.
587
588 2004-10-11  Bob Halley  <halley@dnspython.org>
589
590         * dns/message.py: Added make_response(), which creates a skeletal
591         response for the specified query.  Added opcode() and set_opcode()
592         convenience methods to the Message class.  Added the request_payload
593         attribute to the Message class.
594
595 2004-10-10  Bob Halley  <halley@dnspython.org>
596
597         * dns/zone.py (from_xfr): dns.zone.from_xfr() in relativization
598         mode incorrectly set zone.origin to the empty name.
599
600 2004-09-02  Bob Halley  <halley@dnspython.org>
601
602         * dns/name.py (Name.to_wire): The 'file' parameter to
603         Name.to_wire() is now optional; if omitted, the wire form will
604         be returned as the value of the function.
605
606 2004-08-14  Bob Halley  <halley@dnspython.org>
607
608         * dns/message.py (Message.find_rrset): find_rrset() now uses an
609         index, vastly improving the from_wire() performance of large
610         messages such as zone transfers.
611
612 2004-08-07  Bob Halley  <halley@dnspython.org>
613
614         * (Version 1.3.2 released)
615
616 2004-08-04  Bob Halley  <halley@dnspython.org>
617
618         * dns/query.py: sending queries to a nameserver via IPv6 now
619         works.
620
621         * dns/inet.py (af_for_address): Add af_for_address(), which looks
622         at a textual-form address and attempts to determine which address
623         family it is.
624
625         * dns/query.py: the default for the 'af' parameter of the udp(),
626         tcp(), and xfr() functions has been changed from AF_INET to None,
627         which causes dns.inet.af_for_address() to be used to determine the
628         address family.  If dns.inet.af_for_address() can't figure it out,
629         we fall back to AF_INET and hope for the best.
630
631 2004-07-31  Bob Halley  <halley@dnspython.org>
632
633         * dns/rdtypes/ANY/NSEC.py (NSEC.from_text): The NSEC text format
634         does not allow specifying types by number, so we shouldn't either.
635
636         * dns/renderer.py: the renderer module didn't import random,
637         causing an exception to be raised if a query id wasn't provided
638         when a Renderer was created.
639
640         * dns/resolver.py (Resolver.query): the resolver wasn't catching
641         dns.exception.Timeout, so a timeout erroneously caused the whole
642         resolution to fail instead of just going on to the next server.
643
644 2004-06-16  Bob Halley  <halley@dnspython.org>
645
646         * dns/rdtypes/ANY/LOC.py (LOC.from_text): LOC milliseconds values
647         were converted incorrectly if the length of the milliseconds
648         string was less than 3.
649
650 2004-06-06  Bob Halley  <halley@dnspython.org>
651
652         * (Version 1.3.1 released)
653
654 2004-05-22  Bob Halley  <halley@dnspython.org>
655
656         * dns/update.py (Update.delete): We erroneously specified a
657         "deleting" value of dns.rdatatype.NONE instead of
658         dns.rdataclass.NONE when the thing being deleted was either an
659         Rdataset instance or an Rdata instance.
660
661         * dns/rdtypes/ANY/SSHFP.py: Added support for the proposed SSHFP
662         RR type.
663
664 2004-05-14  Bob Halley  <halley@dnspython.org>
665
666         * dns/rdata.py (from_text): The masterfile reader did not
667         accept the unknown RR syntax when used with a known RR type.
668
669 2004-05-08  Bob Halley  <halley@dnspython.org>
670
671         * dns/name.py (from_text): dns.name.from_text() did not raise
672         an exception if a backslash escape ended prematurely.
673
674 2004-04-09  Bob Halley  <halley@dnspython.org>
675
676         * dns/zone.py (_MasterReader._rr_line): The masterfile reader
677         erroneously treated lines starting with leading whitespace but
678         not having any RR definition as an error.  It now treats
679         them like a blank line (which is not an error).
680
681 2004-04-01  Bob Halley  <halley@dnspython.org>
682
683         * (Version 1.3.0 released)
684
685 2004-03-19  Bob Halley  <halley@dnspython.org>
686
687         * Added support for new DNSSEC types RRSIG, NSEC, and DNSKEY.
688
689 2004-01-16  Bob Halley  <halley@dnspython.org>
690
691         * dns/query.py (_connect): Windows returns EWOULDBLOCK instead
692         of EINPROGRESS when trying to connect a nonblocking socket.
693
694 2003-11-13  Bob Halley  <halley@dnspython.org>
695
696         * dns/rdtypes/ANY/LOC.py (LOC.to_wire): We encoded and decoded LOC
697         incorrectly, since we were interpreting the values of altitiude,
698         size, hprec, and vprec in meters instead of centimeters.
699
700         * dns/rdtypes/IN/WKS.py (WKS.from_wire): The WKS protocol value is
701         encoded with just one octet, not two!
702
703 2003-11-09  Bob Halley  <halley@dnspython.org>
704
705         * dns/resolver.py (Cache.maybe_clean): The cleaner deleted items
706         from the dictionary while iterating it, causing a RuntimeError
707         to be raised.  Thanks to Mark R. Levinson for the bug report,
708         regression test, and fix.
709
710 2003-11-07  Bob Halley  <halley@dnspython.org>
711
712         * (Version 1.2.0 released)
713
714 2003-11-03  Bob Halley  <halley@dnspython.org>
715
716         * dns/zone.py (_MasterReader.read): The saved_state now includes
717         the default TTL.
718
719 2003-11-01  Bob Halley  <halley@dnspython.org>
720
721         * dns/tokenizer.py (Tokenizer.get): The tokenizer didn't
722         handle escaped delimiters.
723
724 2003-10-27  Bob Halley  <halley@dnspython.org>
725
726         * dns/resolver.py (Resolver.read_resolv_conf): If no nameservers
727         are configured in /etc/resolv.conf, the default nameserver
728         list should be ['127.0.0.1'].
729
730 2003-09-08  Bob Halley  <halley@dnspython.org>
731
732         * dns/resolver.py (Resolver._config_win32_fromkey): We didn't
733         catch WindowsError, which can happen if a key is not defined
734         in the registry.
735
736 2003-09-06  Bob Halley  <halley@dnspython.org>
737
738         * (Version 1.2.0b1 released)
739
740 2003-09-05  Bob Halley  <halley@dnspython.org>
741
742         * dns/query.py: Timeout support has been overhauled to provide
743         timeouts under Python 2.2 as well as 2.3, and to provide more
744         accurate expiration.
745
746 2003-08-30  Bob Halley  <halley@dnspython.org>
747
748         * dns/zone.py: dns.exception.SyntaxError is raised for unknown
749         master file directives.
750
751 2003-08-28  Bob Halley  <halley@dnspython.org>
752
753         * dns/zone.py: $INCLUDE processing is now enabled/disabled using
754         the allow_include parameter.  The default is to process $INCLUDE
755         for from_file(), and to disallow $INCLUDE for from_text().  The
756         master reader now calls zone.check_origin_node() by default after
757         the zone has been read.  find_rdataset() called get_node() instead
758         of find_node(), which result in an incorrect exception.  The
759         relativization state of a zone is now remembered and applied
760         consistently when looking up names.  from_xfr() now supports
761         relativization like the _MasterReader.
762
763 2003-08-22  Bob Halley  <halley@dnspython.org>
764
765         * dns/zone.py: The _MasterReader now understands $INCLUDE.
766
767 2003-08-12  Bob Halley  <halley@dnspython.org>
768
769         * dns/zone.py: The _MasterReader now specifies the file and line
770         number when a syntax error occurs.  The BIND 8 TTL format is now
771         understood when loading a zone, though it will never be emitted.
772         The from_file() function didn't pass the zone_factory parameter
773         to from_text().
774
775 2003-08-10  Bob Halley  <halley@dnspython.org>
776
777         * (Version 1.1.0 released)
778
779 2003-08-07  Bob Halley  <halley@dnspython.org>
780
781         * dns/update.py (Update._add): A typo meant that _add would
782         fail if the thing being added was an Rdata object (as
783         opposed to an Rdataset or the textual form of an Rdata).
784
785 2003-08-05  Bob Halley  <halley@dnspython.org>
786
787         * dns/set.py: the simple Set class has been moved to its
788         own module, and augmented to support more set operations.
789
790 2003-08-04  Bob Halley  <halley@dnspython.org>
791
792         * Node and all rdata types have been "slotted".  This speeds
793         things up a little and reduces memory usage noticeably.
794
795 2003-08-02  Bob Halley  <halley@dnspython.org>
796
797         * (Version 1.1.0c1 released)
798
799 2003-08-02  Bob Halley  <halley@dnspython.org>
800
801         * dns/rdataset.py: SimpleSets now support more set options.
802
803         * dns/message.py: Added the get_rrset() method.  from_file() now
804         allows Unicode filenames and turns on universal newline support if
805         it opens the file itself.
806
807         * dns/node.py: Added the delete_rdataset() and replace_rdataset()
808         methods.
809
810         * dns/zone.py: Added the delete_node(), delete_rdataset(), and
811         replace_rdataset() methods.  from_file() now allows Unicode
812         filenames and turns on universal newline support if it opens the
813         file itself.  Added a to_file() method.
814
815 2003-08-01  Bob Halley  <halley@dnspython.org>
816
817         * dns/opcode.py: Opcode from/to text converters now understand
818         numeric opcodes.  The to_text() method will return a numeric opcode
819         string if it doesn't know a text name for the opcode.
820
821         * dns/message.py: Added set_rcode().  Fixed code where ednsflags
822         wasn't treated as a long.
823
824         * dns/rcode.py: ednsflags wasn't treated as a long.  Rcode from/to
825         text converters now understand numeric rcodes.  The to_text()
826         method will return a numeric rcode string if it doesn't know
827         a text name for the rcode.
828
829         * examples/reverse.py: Added a new example program that builds a
830         reverse (address-to-name) mapping table from the name-to-address
831         mapping specified by A RRs in zone files.
832
833         * dns/node.py: Added get_rdataset() method.
834
835         * dns/zone.py: Added get_rdataset() and get_rrset() methods.  Added
836         iterate_rdatas().
837
838 2003-07-31  Bob Halley  <halley@dnspython.org>
839
840         * dns/zone.py: Added the iterate_rdatasets() method which returns
841         a generator which yields (name, rdataset) tuples for all the
842         rdatasets in the zone matching the specified rdatatype.
843
844 2003-07-30  Bob Halley  <halley@dnspython.org>
845
846         * (Version 1.1.0b2 released)
847
848 2003-07-30  Bob Halley  <halley@dnspython.org>
849
850         * dns/zone.py: Added find_rrset() and find_rdataset() convenience
851         methods.  They let you retrieve rdata with the specified name
852         and type in one call.
853
854         * dns/node.py: Nodes no longer have names; owner names are
855         associated with nodes in the Zone object's nodes dictionary.
856
857         * dns/zone.py: Zone objects now implement more of the standard
858         mapping interface.  __iter__ has been changed to iterate the keys
859         rather than values to match the standard mapping interface's
860         behavior.
861
862 2003-07-20  Bob Halley  <halley@dnspython.org>
863
864         * dns/ipv6.py (inet_ntoa): Handle embedded IPv4 addresses.
865
866 2003-07-19  Bob Halley  <halley@dnspython.org>
867
868         * (Version 1.1.0b1 released)
869
870 2003-07-18  Bob Halley  <halley@dnspython.org>
871
872         * dns/tsig.py: The TSIG validation of TCP streams where not
873         every message is signed now works correctly.
874
875         * dns/zone.py: Zones can now be compared for equality and
876         inequality.  If the other object in the comparison is also
877         a zone, then "the right thing" happens; i.e. the zones are
878         equal iff.: they have the same rdclass, origin, and nodes.
879
880 2003-07-17  Bob Halley  <halley@dnspython.org>
881
882         * dns/message.py (Message.use_tsig): The method now allows for
883         greater control over the various fields in the generated signature
884         (e.g. fudge).
885         (_WireReader._get_section): UnknownTSIGKey is now raised if an
886         unknown key is encountered, or if a signed message has no keyring.
887
888 2003-07-16  Bob Halley  <halley@dnspython.org>
889
890         * dns/tokenizer.py (Tokenizer._get_char): get_char and unget_char
891         have been renamed to _get_char and _unget_char since they are not
892         useful to clients of the tokenizer.
893
894 2003-07-15  Bob Halley  <halley@dnspython.org>
895
896         * dns/zone.py (_MasterReader._rr_line): owner names were being
897         unconditionally relativized; it makes much more sense for them
898         to be relativized according to the relativization setting of
899         the reader.
900
901 2003-07-12  Bob Halley  <halley@dnspython.org>
902
903         * dns/resolver.py (Resolver.read_resolv_conf): The resolv.conf
904         parser did not allow blank / whitespace-only lines, nor did it
905         allow comments.  Both are now supported.
906
907 2003-07-11  Bob Halley  <halley@dnspython.org>
908
909         * dns/name.py (Name.to_digestable): to_digestable() now
910         requires an origin to be specified if the name is relative.
911         It will raise NeedAbsoluteNameOrOrigin if the name is
912         relative and there is either no origin or the origin is
913         itself relative.
914         (Name.split): returned the wrong answer if depth was 0 or depth
915         was the length of the name.  split() now does bounds checking
916         on depth, and raises ValueError if depth < 0 or depth > the length
917         of the name.
918
919 2003-07-10  Bob Halley  <halley@dnspython.org>
920
921         * dns/ipv6.py (inet_ntoa): The routine now minimizes its output
922         strings.  E.g. the IPv6 address
923         "0000:0000:0000:0000:0000:0000:0000:0001" is minimized to "::1".
924         We do not, however, make any effort to display embedded IPv4
925         addresses in the dot-quad notation.
926
927 2003-07-09  Bob Halley  <halley@dnspython.org>
928
929         * dns/inet.py: We now supply our own AF_INET and AF_INET6
930         constants since AF_INET6 may not always be available.  If the
931         socket module has AF_INET6, we will use it.  If not, we will
932         use our own value for the constant.
933
934         * dns/query.py: the functions now take an optional af argument
935         specifying the address family to use when creating the socket.
936
937         * dns/rdatatype.py (is_metatype): a typo caused the function
938         return true only for type OPT.
939
940         * dns/message.py: message section list elements are now RRsets
941         instead of Nodes.  This API change makes processing messages
942         easier for many applications.
943
944 2003-07-07  Bob Halley  <halley@dnspython.org>
945
946         * dns/rrset.py: added.  An RRset is a named rdataset.
947
948         * dns/rdataset.py (Rdataset.__eq__): rdatasets may now be compared
949         for equality and inequality with other objects.  Rdataset instance
950         variables are now slotted.
951
952         * dns/message.py: The wire format and text format readers are now
953         classes.  Variables related to reader state have been moved out
954         of the message class.
955
956 2003-07-06  Bob Halley  <halley@dnspython.org>
957
958         * dns/name.py (from_text): '@' was not interpreted as the empty
959         name.
960
961         * dns/zone.py: the master file reader derelativized names in rdata
962         relative to the zone's origin, not relative to the current origin.
963         The reader now deals with relativization in two steps.  The rdata
964         is read and derelativized using the current origin.  The rdata's
965         relativity is then chosen using the zone origin and the relativize
966         boolean.  Here's an example.
967
968                 $ORIGIN foo.example.
969                 $TTL 300
970                 bar MX 0 blaz
971
972         If the zone origin is example., and relativization is on, then
973         This fragment will become:
974
975                 bar.foo.example. 300 IN MX 0 blaz.foo.example.
976
977         after the first step (derelativization to current origin), and
978
979                 bar.foo 300 IN MX 0 blaz.foo
980
981         after the second step (relativiation to zone origin).
982
983         * dns/namedict.py: added.
984
985         * dns/zone.py: The master file reader has been made into its
986         own class.  Reader-related instance variables have been moved
987         form the zone class into the reader class.
988
989         * dns/zone.py: Add node_factory class attribute.  An application
990         can now subclass Zone and Node and have a zone whose nodes are of
991         the subclassed Node type.  The from_text(), from_file(), and
992         from_xfr() algorithms now take an optional zone_factory argument.
993         This allows the algorithms to be used to create zones whose class
994         is a subclass of Zone.
995
996
997 2003-07-04  Bob Halley  <halley@dnspython.org>
998
999         * dns/renderer.py: added new wire format rendering module and
1000         converted message.py to use it.  Applications which want
1001         fine-grained control over the conversion to wire format may call
1002         the renderer directy, instead of having it called on their behalf
1003         by the message code.
1004
1005 2003-07-02  Bob Halley  <halley@dnspython.org>
1006
1007         * dns/name.py (_validate_labels): The NameTooLong test was
1008         incorrect.
1009
1010         * dns/message.py (Message.to_wire): dns.exception.TooBig is
1011         now raised if the wire encoding exceeds the specified
1012         maximum size.
1013
1014 2003-07-01  Bob Halley  <halley@dnspython.org>
1015
1016         * dns/message.py: EDNS encoding was broken.  from_text()
1017         didn't parse rcodes, flags, or eflags correctly.  Comparing
1018         messages with other types of objects didn't work.
1019
1020 2003-06-30  Bob Halley  <halley@dnspython.org>
1021
1022         * (Version 1.0.0 released)
1023
1024 2003-06-30  Bob Halley  <halley@dnspython.org>
1025
1026         * dns/rdata.py: Rdatas now implement rich comparisons instead of
1027         __cmp__.
1028
1029         * dns/name.py: Names now implement rich comparisons instead of
1030         __cmp__.
1031
1032         * dns/inet.py (inet_ntop): Always use our code, since the code
1033         in the socket module doesn't support AF_INET6 conversions if
1034         IPv6 sockets are not available on the system.
1035
1036         * dns/resolver.py (Answer.__init__): A dangling CNAME chain was
1037         not raising NoAnswer.
1038
1039         * Added a simple resolver Cache class.
1040
1041         * Added an expiration attribute to answer instances.
1042
1043 2003-06-24  Bob Halley  <halley@dnspython.org>
1044
1045         * (Version 1.0.0b3 released)
1046
1047 2003-06-24  Bob Halley  <halley@dnspython.org>
1048
1049         * Renamed module "DNS" to "dns" to avoid conflicting with
1050         PyDNS.
1051
1052 2003-06-23  Bob Halley  <halley@dnspython.org>
1053
1054         * The from_text() relativization controls now work the same way as
1055         the to_text() controls.
1056
1057         * DNS/rdata.py: The parsing of generic rdata was broken.
1058
1059 2003-06-21  Bob Halley  <halley@dnspython.org>
1060
1061         * (Version 1.0.0b2 released)
1062
1063 2003-06-21  Bob Halley  <halley@dnspython.org>
1064
1065         * The Python 2.2 socket.inet_aton() doesn't seem to like
1066         '255.255.255.255'.  We work around this.
1067
1068         * Fixed bugs in rdata to_wire() and from_wire() routines of a few
1069         types.  These bugs were discovered by running the tests/zone.py
1070         Torture1 test.
1071
1072         * Added implementation of type APL.
1073
1074 2003-06-20  Bob Halley  <halley@dnspython.org>
1075
1076         * DNS/rdtypes/IN/AAAA.py: Use our own versions of inet_ntop and
1077         inet_pton if the socket module doesn't provide them for us.
1078
1079         * The resolver now does a better job handling exceptions.  In
1080         particular, it no longer eats all exceptions; rather it handles
1081         those exceptions it understands, and leaves the rest uncaught.
1082
1083         * Exceptions have been pulled into their own module.  Almost all
1084         exceptions raised by the code are now subclasses of
1085         DNS.exception.DNSException.  All form errors are subclasses of
1086         DNS.exception.FormError (which is itself a subclass of
1087         DNS.exception.DNSException).
1088
1089 2003-06-19  Bob Halley  <halley@dnspython.org>
1090
1091         * Added implementations of types DS, NXT, SIG, and WKS.
1092
1093         * __cmp__ for type A and AAAA could produce incorrect results.
1094
1095 2003-06-18  Bob Halley  <halley@dnspython.org>
1096
1097         * Started test suites for zone.py and tokenizer.py.
1098
1099         * Added implementation of type KEY.
1100
1101         * DNS/rdata.py(_base64ify): \n could be emitted erroneously.
1102
1103         * DNS/rdtypes/ANY/SOA.py (SOA.from_text): The SOA RNAME field could
1104         be set to the value of MNAME in common cases.
1105
1106         * DNS/rdtypes/ANY/X25.py: __init__ was broken.
1107
1108         * DNS/zone.py (from_text): $TTL handling erroneously caused the
1109         next line to be eaten.
1110
1111         * DNS/tokenizer.py (Tokenizer.get): parsing was broken for empty
1112         quoted strings.  Quoted strings didn't handle \ddd escapes.  Such
1113         escapes are appear not to comply with RFC 1035, but BIND allows
1114         them and they seem useful, so we allow them too.
1115
1116         * DNS/rdtypes/ANY/ISDN.py (ISDN.from_text): parsing was
1117         broken for ISDN RRs without subaddresses.
1118
1119         * DNS/zone.py (from_file): from_file() didn't work because
1120         some required parameters were not passed to from_text().
1121
1122 2003-06-17  Bob Halley  <halley@dnspython.org>
1123
1124         * (Version 1.0.0b1 released)
1125
1126 2003-06-17  Bob Halley  <halley@dnspython.org>
1127
1128         * Added implementation of type PX.
1129
1130 2003-06-16  Bob Halley  <halley@dnspython.org>
1131
1132         * Added implementation of types CERT, GPOS, LOC, NSAP, NSAP-PTR.
1133
1134         * DNS/rdatatype.py (_by_value): A cut-and-paste error had broken
1135         NSAP and NSAP-PTR.
1136
1137 2003-06-12  Bob Halley  <halley@dnspython.org>
1138
1139         * Created a tests directory and started adding tests.
1140
1141         * Added "and its documentation" to the permission grant in the
1142         license.
1143
1144 2003-06-12  Bob Halley  <halley@dnspython.org>
1145
1146         * DNS/name.py (Name.is_wild): is_wild() erroneously raised IndexError
1147         if the name was empty.
1148
1149 2003-06-10  Bob Halley  <halley@dnspython.org>
1150
1151         * Added implementations of types AFSDB, X25, and ISDN.
1152
1153         * The documentation associated with the various rdata types has been
1154         improved.  In particular, instance variables are now described.
1155
1156 2003-06-09  Bob Halley  <halley@dnspython.org>
1157
1158         * Added implementations of types HINFO, RP, and RT.
1159
1160         * DNS/message.py (make_query): Document that make_query() sets
1161         flags to DNS.flags.RD, and chooses a random query id.
1162
1163 2003-06-05  Bob Halley  <halley@dnspython.org>
1164
1165         * (Version 1.0.0a2 released)
1166
1167 2003-06-05  Bob Halley  <halley@dnspython.org>
1168
1169         * DNS/node.py: removed __getitem__ and __setitem__, since
1170         they are not used by the codebase and were not useful in
1171         general either.
1172
1173         * DNS/message.py (from_file): from_file() now allows a
1174         filename to be specified instead of a file object.
1175
1176         * DNS/rdataset.py: The is_compatible() method of the
1177         DNS.rdataset.Rdataset class was deleted.
1178
1179 2003-06-04  Bob Halley  <halley@dnspython.org>
1180
1181         * DNS/name.py (class Name): Names are now immutable.
1182
1183         * DNS/name.py: the is_comparable() method has been removed, since
1184         names are always comparable.
1185
1186         * DNS/resolver.py (Resolver.query): A query could run for up
1187         to the lifetime + the timeout.  This has been corrected and the
1188         query will now only run up to the lifetime.
1189
1190 2003-06-03  Bob Halley  <halley@dnspython.org>
1191
1192         * DNS/resolver.py: removed the 'new' function since it is not the
1193         style of the library to have such a function.  Call
1194         DNS.resolver.Resolver() to make a new resolver.
1195
1196 2003-06-03  Bob Halley  <halley@dnspython.org>
1197
1198         * DNS/resolver.py (Resolver._config_win32_fromkey): The DhcpServer
1199         list is space separated, not comma separated.
1200
1201 2003-06-03  Bob Halley  <halley@dnspython.org>
1202
1203         * DNS/update.py: Added an update module to make generating updates
1204         easier.
1205
1206 2003-06-03  Bob Halley  <halley@dnspython.org>
1207
1208         * Commas were missing in some of the __all__ entries in various
1209         __init__.py files.
1210
1211 2003-05-30  Bob Halley  <halley@dnspython.org>
1212
1213         * (Version 1.0.0a1 released)