Version 2.0.8 - May 25, 2013 * Use ipaddr/ipaddres module in place of custom IP processing code * Numerous python3 compatibility fixes * Improved unicode error detection in SPF records * Fixed a bug caused by a null CNAME in cache Version 2.0.7 - January 19, 2012 * Allow for timeouts to be global for all DNS lookups instead of per DNS lookup to allow for MAY processing time limitsin RFC 4408 10.1. See README for details. * Use openspf.net for SPF web site instead of openspf.org * Extend query.get_header to return either Received-SPF (still default) or RFC 5451 Authentication Results headers (needs authres 0.3 or later) * Rework query.parse_header: - Make query.parse_header automatically select Received-DPF or Authentication Results header types and use them to collect SPF results from trusted relays - Add query.parse_header_spf and query.parse_header_ar functions for header type specific processing * Finish Python3 port - works with python2.6/2.7/3.2 and 2to3 is no longer required - will also work with newer py3dns where TXT records are returned as type bytes and not strings * Accounts for new py3dns error classes coming in py3dns 3.0.2 (but fully backward compatible with earlier versions) * check for 7-bit ascii on TXT and SPF records * fix CNAME chain duplicating TXT records Version 2.0.6 - October 27, 2011 * Refactor code so that 2to3 will provide a working python3 module - Now requires at least python2.6 * Update spfquery.py, type99.py, and testspf.py to work with either python or python3 (2to3 not needed for these scripts) - SPF test suite can now be run from either python or python3 * Ensure Temperror for all DNS rcodes other than 0 and 3 per RFC 4408 * Parse Received-SPF header * Report CIDR error only for valid mechanism * Handle invalid SPF record on command line * Add timeout to check2 Version 2.0.5 - July 29, 2008 * Add TCP fallback if DNS UDP reply is truncated - Fixes inconsistent results from trying to use partial UDP replies * Correct Received-SPF formatting * Minor updates to reflect RFC 4408 errata * Added License file for RFC 4408 test suite * Update RFC 4408 test suite from svn * Fix Type99 conversion script to work with multi-string TXT records * Timeout parameter Version 2.0.4 - January 24, 2007 * Correct unofficial 'best guess' processing. * PTR validation processing cleanup * Improved detection of exp= errors * Keyword parameters on get_header() Version 2.0.3 - January 15, 2007 * IPv6 compatibility test fix to support Python 2.2 * Change DNS queries to only check Type SPF in Harsh mode * pyspf requires pydns, python-pyspf requires python-pydns * Record matching mechanism and add to Received-SPF header. * Test for RFC4408 6.2/4, and fix spf.py to comply. * Permerror for more than one exp or redirect modifier. * Parse op= modifier Version 2.0.2 - January 4, 2007 * Update openspf URLs * Update Readme to better describe available pyspf interfaces * Add basic description of type99.py and spfquery.py scripts * Add usage instructions for type99.py DNS RR type conversion script * Add spfquery.py usage instructions * Incorporate downstream feedback from Debian packager * Fix key-value quoting in get_header Version 2.0.1 - December 08, 2006 * Prevent cache poisoning attack * Prevent malformed RR attack * Update license on a few files we missed last time Version 2.0 - November 20, 2006 * Completed RFC 4408 compliance * Added spf.check2 for RFC 4408 compatible result codes * Full IP6 support * Fedora Core compatible RPM spec file * Update README, licenses Version 1.8 - July 26, 2006 * YAML test suite syntax * trailing dot support (RFC4408 8.1) Version 1.7 - July 21, 2005 * Strict processing limits per newly official SPF RFC * Fixed several parsing bugs under RFC * Support official IANA SPF record (type99) * Extended SPF processing results beyond strict RFC limits * Validate spf.py against test suite, and add Received-SPF support to spf.py * Support best_guess for SPF * Support SPF delegation Version 1.6 - December 18, 2003 * Arik Baratz pointed out endian problems using socket.inet_ntoa() and socket.inet_aton(). Use struct.pack("!L", struct.unpack("!L") to fix. Version 1.5 - December 17, 2003 * Replace DNS.addr2bin() and DNS.bin2addr() with socket.inet_ntoa() and socket.inet_aton(). New code supports n, n.n, and n.n.n formats for IPv4 addresses, and gets rid of annoying Python 2.4 future warnings Version 1.4 - December 16, 2003 * Greg Connor discovered that SPF queries to altavista.com were broken. This was testing to see if a mechanism needs to be macro expanded _before_ leading ? + - characters were removed. * Fixed include handling to be a real mechanism: -include must work. Version 1.3.1 - December 14, 2003 * Forgot to include new test file in distribution. * Forgot CHANGELOG in distribution. Version 1.3 - December 13, 2003 * Add %{o} (original sender domain) macro * The ./spf.py {spf} {ipaddr} {sender} {helo} command line didn't print out the results. Oops. * Support default= so Meng's test #6 'v=spf1 default=deny' works * Any IP address '127.*.*.*' automatically pass, so all Meng's tests work * Follow DNS CNAMES * Cache DNS results, including additional info, reducing DNS query load * Support Python 2.2 (doesn't have bool, True, False: those are added in Python 2.2.1) Version 1.2 - December 11, 2003 * Added exp= (explanation) and redirect= modifiers * Added macros Version 1.1 - December 9, 2003 * Meng Weng Wong added PTR code, THANK YOU Version 1.0 - December 9, 2003 * Initial Version