2007-04-26  Jason R. Mastaler  <jason@mastaler.com>

	* pythonlib/email: Sync up with email 4.0.2.

2007-03-01  Jason R. Mastaler  <jason@mastaler.com>

	* SMTP.py (Connection.__connect): bugfix: TLS must come before
	SMTP AUTH or else you won't be able to use both of them together.

2007-02-23  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (format_timeout): Use Defaults.TIMEOUT_UNITS.

	* Defaults.py: (TIMEOUT_UNITS): New variable to give users the
	ability to customize the timeout strings for languages other than
	English. Contributed by Vitor Espindola.

2006-12-07  Jason R. Mastaler  <jason@mastaler.com>

	* Pending.py (Message.release): Add the IP address and browser
	info of the releaser to an 'X-TMDA-CGI' header if the message was
	released via tmda-cgi.
	
2006-10-27  Mark Horn  <mark@hornclan.com>

	* Defaults.py: added additional description to
	ACTION_EXPIRED_DATED
	
2006-10-07  Jason R. Mastaler  <jason@mastaler.com>

	* pythonlib/email: Sync up with email 4.0.1.

2006-10-04  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (PENDING_QUEUE_FORMAT): Add 'maildir'.
	
2006-09-28  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (PENDING_QUEUE_FORMAT): New variable.
	
2006-09-27  Jason R. Mastaler  <jason@mastaler.com>

	* Pending.py: Modified to use new Tmda.Queue interface.
	
	(Queue.cleanQueue): Removed.  Functionality moved into
	Queue.Queue.

	* Util.py (pager): Now accepts a string rather than a filepath.

	(pickleit): Use 'protocol' argument as introduced in Python 2.3.
	Also make the default protocol the new efficient
	binary storage format compatible with Python2.3 and up.

2006-09-19  Jason R. Mastaler  <jason@mastaler.com>

	* AutoResponse.py: Remove arabic -> iso-8859-6 alias.  UTF-8 is
	what's used for Arabic these days AFAIK.

2004-03-01  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Pending.py (Queue.listDeliveredIds): Removed.
	(Queue.listConfirmedIds): Ditto.
	(Queue.listReleasedIds): Ditto.
	(Queue.checkDelivered): Ditto.
	(Message.wasDelivered): Ditto.
	
2004-03-01  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py: Removed CONFIRM_ACCEPT_ALREADY_CONFIRMED_NOTIFY,
	CONFIRM_ACCEPT_ALREADY_RELEASED_NOTIFY
	CONFIRM_ACCEPT_INITIAL_NOTIFY.  Restored CONFIRM_ACCEPT_NOTIFY.

2004-03-01  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (TMDARC): Allow TMDARC to be specified by
	GLOBAL_TMDARC if $TMDARC is not set.

2004-02-20  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py: Removed BOUNCE_TEXT_* and CONFIRM_ACCEPT_TEXT_* in
	favour of bounce_*.txt and confirm_accept_*.txt	templates.

	New variables: ACTION_MISSING_PENDING,
	ACTION_INVALID_CONFIRMATION,
	CONFIRM_ACCEPT_ALREADY_CONFIRMED_NOTIFY,
	CONFIRM_ACCEPT_ALREADY_RELEASED_NOTIFY
	CONFIRM_ACCEPT_INITIAL_NOTIFY

2004-02-17  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (wraptext): Utilize the new builtin textwrap module.
	
2004-02-05  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (_path_vars): New dict to hold variables that
	contain a pathname, and therefore should be run through
	os.path.expandusers().
	
2004-02-05  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (MAIL_FOLLOWUP_TO): New variable.

2004-01-30  Jason R. Mastaler  <jason@mastaler.com>

	* FilterParser.py (_FilterFile.__init__): Add 'pipe-headers'.
	(FilterParser.firstmatch): Ditto.

2004-01-17  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (TMDARC): ~/.tmdarc is deprecated.

2004-01-11  Jason R. Mastaler  <jason@mastaler.com>

	* MessageLogger.py (MessageLogger.write): Use Util.make_date().
	
	* Pending.py (Message.getDate): Use Util.make_date().

2004-01-10  Jason R. Mastaler  <jason@mastaler.com>

	* Pending.py (Message.release): Use Util.make_date() for
	X-TMDA-Released.
	
2004-01-09  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (DATED_TIMEOUT): TIMEOUT renamed.

	* Util.py (confirm_append_address): Return the envelope sender
	address immediately if either the Return-Path address or
	X-Primary-Address is not in user@hostname format.

2003-12-10  Tim Legant  <tim@catseye.net>

	* Pending.py (Message.show): Change implementation to catch
	failure to Generate and re-parse the message using HeaderParser.

	(Message.release): Call self.show() instead of Util.msg_as_string().
	(Message.summary): Ditto.

2003-12-09  Jason R. Mastaler  <jason@mastaler.com>

	* Pending.py (Message.initMessage): Remove unnecessary method, and
	move that code into Message.__init__.

	(Message.__init__): New variables x_primary_address and
	append_address.

	(Message.release): Append append_address instead of return_path.
	(Message.delete): Ditto.
	(Message.whitelist): Ditto.
	(Message.blacklist): Ditto.
		
	(Queue.mainLoop): Remove call to Message.initMessage().
	(Message.release): Ditto.
	(Message.delete): Ditto.
	(Message.whitelist): Ditto.
	(Message.blacklist): Ditto.
	
2003-12-03  Jason R. Mastaler  <jason@mastaler.com>

	* AutoResponse.py (AutoResponse.create): Add an RFC 2183
	Content-Disposition = 'inline' header to the main header of the
	message, as well as each of the MIME bodyparts if
	AUTORESPONSE_INCLUDE_SENDER_COPY is a positive value.

	(AutoResponse.create): Add a default charset for get_charsets() to
	fall back to in case the triggering message lacks its own charset
	parameter.

2003-12-03  Tim Legant  <tim@catseye.net>

	* AutoResponse.py (AutoResponse.__init__): Made msgin_as_string a
	member (instead of a local).  It was once a member, then switched
	to a local with the change of 2003-11-11.  Then the change of
	2003-11-16 used it in create, but it wasn't changed back to a
	member.

2003-11-19  Tim Legant  <tim@catseye.net>

	* Errors.py (AddressError, QueueError): In the last change I
	forgot to pass 'self' to the ancestor's __init__ method.  D'oh!
	Pointy-hat to me.

2003-11-16  Tim Legant  <tim@catseye.net>

	* AutoResponse.py (AutoResponse.__init__): Changed to re-parse the
	message only if AUTORESPONSE_INCLUDE_SENDER_COPY is 2 or greater,
	since that's the only case in which it matters.

	* Auth.py (Auth.init_auth_method): Cleaned up exception handling
	so that error messages could actually be read!

	* (Auth.init_remote): Fixed IMAP4_SSL class definition.
	Previously, it was defined as a local variable which just
	disappeared after init_remote() finished.  Now, we store it in an
	instance variable named IMAP4_SSL.  Also, fixed various code
	issues to bring it in line with the version distributed with
	Python 2.3.

	* Errors.py (AddressError, QueueError): Removed __repr__ method.
	Called ancestor's __init__.

	* (AuthError): Renamed __repr__ to __str__; cleaned it up.  Called
	ancestor's __init__.

2003-11-11  Tim Legant  <tim@catseye.net>

	* AutoResponse.py (AutoResponse.__init__): Recreate incoming
	message using the full email.Parser.Parser rather than the
	HeaderParser.  Substitute 'body suppressed" message if necessary
	before re-parsing.  This allows us to attach the message object to
	the auto-response and allows Generator to correctly produce a
	message in send(), even if the original message contained an
	attachment of type message/rfc822.

	(AutoResponse.create): Moved code checking message size to
	__init__.

2003-10-14  Jason R. Mastaler  <jason@mastaler.com>

	* Deliver.py (Deliver.__deliver_maildir): Use os.open() and
	os.fdopen() in place of __builtins__.open() to create the file.
	
2003-10-13  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (OUTGOINGMAIL): Change default to 'sendmail'.
	(MAIL_TRANSPORT): OUTGOINGMAIL renamed.

2003-10-09  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (sendmail): If using /usr/sbin/sendmail, pass a tuple of
	arguments into pipecmd() instead of a string to avoid the shell
	completely.  Also, add '-i' to the list of args.
	
	* Version.py (PLATFORM): Use the more descriptive 'platform'
	module if it's available.

2003-10-01  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (getfullname): Change default fallback value to an empty
	string instead of 'Jane Doe'.

2003-09-22  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (append_to_file): Strip inline comments before checking
	for duplicate entries.

2003-08-21  Tim Legant  <tim@catseye.net>

	* Pending.py (initQueue): After reading message list from stdin,
	close stdin and re-open on the tty, so interactive operation is
	possible.  Also, minor change to allow multiple message names on
	the same line while reading stdin.

2003-08-19  Jason R. Mastaler  <jason@mastaler.com>

	* FilterParser.py (_FilterFile.__init__): confirm can now take an
	option, which is the path to a specific template.

2003-08-01  Tim Legant  <tim@catseye.net>

	* Util.py (msg_from_file): When parsing a message with the
	HeaderParser, add a "custom" attribute to the Message object
	called 'header_parsed'.  If it exists and is True (1), then the
	Message was read and parsed by HeaderParser.

	(msg_as_string): AutoResponse.py and Pending.py use fully parsed
	MIME messages, so HeaderParsedGenerator won't work for those
	messages.  Made msg_as_string sensitive to 'header_parsed'
	attribute of Message, defined in Util.msg_from_file.

2003-07-31  Tim Legant  <tim@catseye.net>

	* Util.py (msg_as_string): Use HeaderParsedGenerator rather than
	the standard Generator, which fails on messages parsed with
	HeaderParser.

2003-07-18  Tim Legant  <tim@catseye.net>

	* MTA.py (MTA.deliver, MTA.stop, Qmail.deliver): Added support for
	the delivery when Defaults.DELIVERY = '_filter_'.

	* Deliver.py (Deliver.get_instructions, Deliver.deliver): Added
	support for the '_filter_' style of delivery, where the message is
	simply piped to stdout.

2003-07-11  Tim Legant  <tim@catseye.net>

	* Defaults.py: New variables DB_BARE_APPEND and
	DB_CONFIRM_APPEND.

	* FilterParser.py (FilterParser): Removed {from,to}-mysql code.
	Moved __create_sql_params method to module-level function
	create_sql_params.  Removed -domains argument and always add the
	domains into the keys.  Made the domains list contain only unique
	domains.

	* Util.py (db_insert): New function, used by the DB_BARE_APPEND
	and DB_CONFIRM_APPEND code.

2003-07-01  Tim Legant  <tim@catseye.net>

	* Util.py (filter_match): Create FilterParser with DB_CONNECTION.

	* FilterParser.py (FilterParser): Fixed two regular expressions
	that were too "greedy".
	(__create_sql_params, __create_sql_criteria, __get_column_index):
	New SQL support functions.
	(__search_sql): Main SQL searching function.
	(firstmatch): Added from-sql/to-sql rules.  Should work for any
	SQL database that has a Python DB API 2.0 module.

	* Defaults.py (DB_CONNECTION): New variable.

2003-06-25  Tim Legant  <tim@catseye.net>

	* Address.py: Fixed ConfirmAddress, removed formatting code from
	DatedAddress.timestamp().

2003-06-20  Gre7g Luterman  <gre7g@wolfhome.com>

	* Fixed a bug in the LDAP code found by Chet McNeill.

2003-06-08  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (maketext): Now accepts an absolute pathname to a
	template file which short-circuits the searching process.

2003-06-08  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* FilterParser.py (_FilterFile.__init__): bounce,reject now can
	take an option, which is the path to a specific template.

2003-06-05  Cory Wright <cwright@standblue.net>

	* Util.py (maketext): Recognize TEMPLATE_DIR_MATCH_RECIPIENT.
	
	* Defaults.py (TEMPLATE_DIR_MATCH_RECIPIENT): New variable

2003-06-04  Tim Legant  <tim@catseye.net>

	* Util.py (make_msgid): Added ability for TMDAIDTAG environment
	variable to override the string "TMDA" in the tag portion of the
	generated Message-ID.

2003-05-25  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (PENDING_DIR): New variable.

	* Pending.py (Queue.initQueue): Use Defaults.PENDING_DIR.
	(Message.__init__): Ditto.

2003-05-24  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (CGI_VIRTUALUSER): New variable.

2003-05-24  Tim Legant  <tim@catseye.net>

	* MTA.py (MTA.getvdomainprepend): Removed function.
	(Qmail.getvdomainprepend): Moved function to Util.py.

	* Util.py (getvdomainprepend): New function, moved from MTA.py.
	(add_headers): New function.
	(purge_headers): New function.

	* AutoResponse.py (AutoResponse.create): Used add_headers in place
	of loop.  Added ability to purge headers (PURGED_HEADERS_SERVER).

	* Defaults.py (PURGED_HEADERS_CLIENT): Renamed from
	PURGED_HEADERS.
	(PURGED_HEADERS_SERVER, PURGED_HEADERS_DELIVERY): New variables.

	* Deliver.py (Deliver.deliver): Added ability to purge headers
	during delivery (PURGED_HEADERS_DELIVERY).

2003-05-22  Jason R. Mastaler  <jason@mastaler.com>

	* Version.py (ALL): Add CODENAME.

2003-04-29  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Pending.py (Queue.cleanQueue): New method for pending queue
	cleanup.
	
	* Defaults.py (PENDING_LIFETIME, PENDING_CLEANUP_ODDS): New
	variables.
	
2003-04-26  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (msg_from_file): New function.

2003-04-23  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (make_date): Don't import Defaults.LOCALDATE.
	
	* Defaults.py (TMDAINJECT): New variable.
	(LOCALDATE): Removed.

	* Util.py (gethostname): $TMDAHOST takes precedence.
	(getfullname): $TMDANAME takes precedence.
	(getusername): $TMDAUSER takes precedence.
	(make_msgid): $TMDAIDHOST takes precedence.

2003-04-22  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (msg_as_string): New function.  Replacement for
	Message.as_string().
	
	* AutoResponse.py (AutoResponse.__init__): Use
	Util.msg_as_string() instead of msg.as_string().
	(AutoResponse.send): Ditto.

	* Pending.py (Message.release): Ditto.
	(Message.show): Ditto.
	(Message.summary): Ditto.

	* Deliver.py (Deliver.deliver): Ditto.
	* (Deliver.__deliver_mbox): No need to add the leading From_ line
	or escape "From" ourselves.

2003-04-19  Gre7g Luterman  <gre7g@wolfhome.com>

	* Removed virtual user processing from Util.
	* Added RunTask to Util to help process virtual users.
	* Removed tons of CGI_ variables from Defaults
	  (these are now handled directly by tmda-cgi).
	* Added a bunch of debugging statements to Auth.

2003-04-07  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (headers_as_string): Return the raw (undecoded) headers
	if we encounter a HeaderParseError exception while trying to
	decode the headers.
	
2003-03-12  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* FilterParser.py (_FilterFile.__init__): Add `-domains', a new
	argument for from-(file|cdb|dbm) and to-(file|cdb|dbm).

	(FilterParser.__extract_domains): New method.

	(FilterParser.firstmatch): Use __extract_domains if the `-domains'
	argument is specified.
	
2003-03-04  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* FilterParser.py (_FilterFile.__init__): Add `pipe', a new filter
	source.

	(_FilterFile.__init__): Ditto.

	(FilterParser.firstmatch): Ditto.

2003-02-26  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* AutoResponse.py (AutoResponse.create): Sort ADDED_HEADERS_SERVER
	before adding them to the message.

2003-02-20  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Message.py: New module.

2003-02-13  Mark Horn  <mark@hornclan.com>
	
	* Defaults.py: Added ACTION_HEADER_INCOMING to enable the logfile
	stuff to get written in a header message.

2003-01-30  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Deliver.py (Deliver.__deliver_mbox): The UUCP-style From_ line's
	timestamp is now based on localtime() instead of gmtime().

2003-01-29  Tim Legant  <tim@catseye.net>

	* FilterStore.py (FlatFileStore.__init__): Added code to lowercase
	the list of email addresses.

	* Util.py (findmatch): Fix bug where the for loop just kept going,
	regardless of whether a match was found or not.

2003-01-28  Tim Legant  <tim@catseye.net>

	* FilterStore.py: New file.  Part of FilterParser.firstmatch
	cleanup patch from Jonathan Ellis.

	* FilterParser.py (FilterParser.firstmatch): Massive cleanup of
	the ever-lengthening firstmatch method.  Now uses the classes from
	FilterStore where possible.  Part of FilterParser.firstmatch
	cleanup patch from Jonathan Ellis.

	* Util.py: Move CDB and DBM-building functions to appropriate
	classes in FilterStore.  Part of FilterParser.firstmatch cleanup
	patch from Jonathan Ellis.

	(findmatch): Return only true or false.  We no longer support an
	action override in flat files or databases.  Part of the
	FilterParser.firstmatch cleanup patch from Jonathan Ellis.

2003-01-27  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Deliver.py (Deliver.__deliver_maildir): Strengthen the
	uniqueness of maildir filenames based on djb's updated maildir
	spec.
	
2003-01-20  Tim Legant  <tim@catseye.net>

	* MTA.py (MTA.getvdomainprepend): Added this method to abstract
	ancestor.  It raises NotImplementedError if called.

	(Qmail.getvdomainprepend): Added method to return the prepend from
	qmail's virtualdomains file if the passed address matches one of
	the lines in virtualdomains.

	(__init__): All classes now take a default delivery action in
	their __init__ methods.

	(init): The init() function now takes a the name of an MTA and the
	default delivery action as parameters.  This removes MTA.py's
	dependence on Defaults.py

	* Deliver.py (Deliver.__deliver_maildir): Changed Defaults.PID to
	str(os.getpid()) in order to remove Deliver.py's dependency on
	Defaults.py.

	* Util.py (getvuserhomedir): Added function to run a script that
	is expected to print the passed in virtual user's home directory.
	That string is captured and returned.

2003-01-06  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* AutoResponse.py (AutoResponse.create): Replace input characters
	in header values which can not be decoded with ``U+FFFD'', which
	is the official Unicode replacement character.

2002-12-09  Tim Legant  <tim@catseye.net>

	* Pending.py (Queue.__init__): Saved value of dispose as
	self.dispose and not self.dispose_def.  self.dispose_def is only
	used interactively and so belongs in InteractiveQueue.

	(Queue.initQueue): Removed re-initialization of self.dispose_def.

	(Queue.checkDelivered): Changed 'delete' compare from
	self.dispose_def to self.dispose.

	(Queue.disposeMessage): Return 0 now on both self.dispose is None
	and self.dispose == 'pass'.  self.pretend is not relevant for
	either of these tests.

	(Queue.showMessage): Summary was getting printed when both
	self.summary and self.terse were false.  Changed 'or not
	self.terse' to 'and not self.terse'.

	(Queue.mainLoop): Removed setting of self.dispose from
	self.dispose_def.  This should only happen interactively and does
	in InteractiveQueue.userInput.

	(InteractiveQueue.initQueue): New method.  Initialize
	self.dispose_def here.

	(InteractiveQueue.processMessage): Print blank line if interactive
	and self.terse is true.

2002-12-06  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (CGI_URL): New variable.

2002-12-02  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (GLOBAL_TMDARC): Don't skip if there is an error.
	
2002-11-25  David Guerizec  <david@guerizec.net>

	* Pending.py: new module

2002-11-21  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py: Removed DELIVERED_CACHE and DELIVERED_CACHE_LEN.
	
2002-11-12  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (confirm_append_address): New function.

	* MessageLogger.py (MessageLogger.write): Log X-Primary-Address.

	* Defaults.py (PRIMARY_ADDRESS_MATCH): New variable.

2002-11-10  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (build_cdb): Uniquify ftmp when doing cdbmake.

2002-11-08  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (SUMMARY_HEADERS): New variable.

	* Deliver.py (Deliver.deliver): Retain From_ when doing a program
	delivery.

2002-11-03  Jason R. Mastaler  <jason@aguirre.la.mastaler.com>

	* AutoResponse.py (AutoResponse.create): Add Version.CODENAME to
	X-Delivery-Agent.
	
2002-11-01  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (maketext): Recognize TEMPLATE_DIR_MATCH_SENDER.
	
	* Defaults.py (TEMPLATE_DIR_MATCH_SENDER): New variable.

2002-10-18  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (normalize_sender): New fuction, moved from
	tmda-rfilter.
	
	* Defaults.py (AUTORESPONSE_INCLUDE_SENDER_COPY): New variable.

	(TEMPLATE_EMAIL_HEADERS): Ditto.
	(TEMPLATE_ENCODED_HEADERS): Ditto.

	* AutoResponse.py: New file.

2002-10-04  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (MESSAGE_TAG_HEADER_STYLE): New variable.

2002-10-01  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* pythonlib/email: Sync up with email 2.4.

2002-09-30  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (sendmail): Accept a whole message string rather than
	header and body strings as two separate arguments.

	(body_as_raw_string): New function.
	(headers_as_list): Ditto.
	(headers_as_raw_string): Ditto.
	(headers_as_string): Ditto.
	(rename_headers): Ditto.
	
	* Deliver.py: Use an email.Message object rather than an
	rfc822.Message object and message body.

	* MTA.py: Ditto.

	* MessageLogger.py: Ditto.

2002-09-26  Tim Legant  <tim@catseye.net>

	* FilterParser.py (FilterParser.__expandmacros): Fixed bug where
	more than one instance of the same macro in a rule failed
	miserably.

2002-09-20  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (decode_header): New function.

2002-09-12  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Util.py (formataddr): Remove function.

	(make_date): Utilize email.Utils.formatdate().

2002-09-11  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* pythonlib: New directory to house any overrides of standard
	modules and packages.

	* pythonlib/email: Add version 2.3 of the `email' package.

2002-08-29  <sen_ml@eccosys.com>

	* FilterParser.py: Make the parser recognize the "hold" action by
	adding "hold" to in_action.

	* Defaults.py: Added documentation for "hold" action to
	ACTION_INCOMING, ACTION_FAIL_DATED, ACTION_EXPIRED_DATED,
	ACTION_FAIL_SENDER, ACTION_FAIL_KEYWORD.

2002-08-22  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* SMTP.py (Connection.__connect): Add support for SSL.

	* Defaults.py (SMTPSSL, SMTPSSL_KEYFILE, SMTPSSL_CERTFILE): New
	variables.
	
2002-08-21  Jason R. Mastaler  <jasonrm@hrothgar.la.mastaler.com>

	* Defaults.py (SMTPAUTH_USERNAME, SMTPAUTH_PASSWORD): New
	variables.
	
	* SMTP.py (Connection.__connect): Add support for SMTP
	authentication.
	
	* Defaults.py (MAX_AUTORESPONSES_PER_DAY, RESPONSE_DIR): New
	variables.

2002-08-08  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MessageLogger.py: New module.

	* Defaults.py (LOGFILE_OUTGOING): New variable.

2002-08-07  Tim Legant  <tim@catseye.net>

	* FilterParser.py (_FilterFile): New class to hold per-file data.

	(FilterParser.__loadedby): New function to determine if file to be
	included has already been included (to prevent infinite loops).

	(FilterParser.read): Added code to detect file include loops and
	prevent infinite loops.

	(FilterParser.__init__): Moved Parser initialization to
	constructor.

	(FilterParser.__pushfile, FilterParser.__popfile,
	FilterParser.__file): New methods.

	(FilterParser.read, FilterParser.__readrule,
	FilterParser.__parseargs): Re-coded so recursive calls work.

	(FilterParser.__parse): Re-coded so recursive calls work.  The
	nested exception is now propagated all the way out.

	(FilterParser.__includefilter): New function.  Recursively loads
	and parses included filter files.

2002-08-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.__findvarsub): Query the Defaults
	vardict when checking the namespace.
	
2002-08-06  Tim Legant  <tim@catseye.net>

	* FilterParser.py: Added macro substitution and variable
	interpolation.

	(Macro): New class.

	(FilterParser.__parsemacro, FilterParser.__expandmacros,
	FilterParser.__findvarsub, FilterParser.__interpolatevars): New
	functions.

	(FilterParser.firstmatch): Added '-optional' argument to all rules
	that access files.

2002-07-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (X_TMDA_IN_SUBJECT, ADDED_HEADERS_SERVER): New
	variables.

	Renamed ADDED_HEADERS to ADDED_HEADERS_CLIENT.
	
2002-06-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py: New helper functions: getuid, getgid, gethomedir, and
	getgrouplist.

2002-06-18  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (CONFIG_EXEC): New variable.

2002-06-16  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Add PENDING_WHITELIST_APPEND &
	PENDING_BLACKLIST_APPEND.
	
2002-06-15  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_keyword_cookie): Replace RECIPIENT_DELIMITER
	with `?' in the keyword.

2002-06-12  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (getfileuid): New function that returns the numerical
	UID of a given file.

2002-06-11  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BOUNCE_ENV_SENDER): Set default to '<>' in all
	cases except where OUTGOINGMAIL = "sendmail" *and*
	MAIL_TRANSFER_AGENT is qmail or postfix.

2002-06-10  Mark Horn  <mark@hornclan.com>

	* Defaults.py: Added ACTION_FAIL* variables and BOUNCE_TEXT_FAIL*
	variables

2002-06-06  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py: Refer to the first element of TAGS_* lists for the
	identifying string when creating an address.

	* Defaults.py: New variables: TAGS_CONFIRM, TAGS_DATED,
	TAGS_KEYWORD, TAGS_SENDER.

2002-05-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py: Replace all uses of the string module with string
	methods.
	
2002-05-22  Jason R. Mastaler  <jason@mastaler.com>

	* Util.py (sendmail): Terminate commandline switch processing with
	`--'.

	* Defaults.py (ADDED_HEADERS): New variable.

2002-05-16  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (PURGED_HEADERS): Add "Bcc:" and "Resent-Bcc" to the
	default list.

	* SMTP.py: New module.

	* Util.py (sendmail): Send mail either via SMTP or using
	/usr/sbin/sendmail depending on Defaults.OUTGOINGMAIL.

	* Defaults.py (OUTGOINGMAIL, SMTPHOST,
	SMTP_MAX_SESSIONS_PER_CONNECTION): New variables.

	(SENDMAIL_PROGRAM): Replaces SENDMAIL.

2002-05-14  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (getfilemode): New utility function which takes a file
	and returns its octal number representing the file permissions bit
	pattern.
		
	* Defaults.py (CRYPT_KEY_FILE): Read CRYPT_KEY from CRYPT_KEY_FILE
	which defaults to ~/.tmda/crypt_key.

2002-05-09  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): *-ezmlm sources now
	match the parent directory DIR rather than DIR/subscribers.

	(FilterParser.firstmatch): *-mailman sources now match just the
	list directory.  The config database is located automatically.

2002-05-02  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MTA.py (MTA.deliver): Deliver the message according to
	Defaults.DELIVERY via a Deliver.Deliver() object.

	(Qmail.deliver): Ditto.

	* Defaults.py: DELIVERY replaces LOCAL_DELIVERY_AGENT.

2002-05-01  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDARC): Allow ~/.tmda/config as a second default
	location for the configuration file.

2002-04-30  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py: Include example settings for optional variables
	here instead of sample.tmdarc.
	
2002-04-30  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (PLATFORM): Use distutils.util.get_platform().

2002-04-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (PENDING_DELETE_APPEND, PENDING_RELEASE_APPEND): New
	variables.
	
2002-04-28  Jason R. Mastaler  <jason@mastaler.com>

	* HMAC.py: XOR optimizations.

2002-04-23  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TERSE_SUMMARY_HEADERS): New variable.

	* Util.py (make_date): Support LOCALDATE.

	* Defaults.py (LOCALDATE): New variable.

2002-04-22  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_date): Include our own code until such time as
	we can assume availability of the email package.

2002-04-02  Jason R. Mastaler  <jason@aguirre.la.mastaler.com>

	* Util.py (pickleit): Bugfix. Insure the tempfile directory is the
	same one which we are writing to pickle to.

2002-04-01  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (ALL): Fall back to using sys.platform if os.uname()
	isn't available on the host.  Also, use SYSNAME and MACHINE
	instead of PLATFORM and ARCH to match the os.uname() docs.
	PLATFORM is now SYSNAME/MACHINE.

	* Util.py (pickleit): Write to a tmpfile, and then rename to the
	target file.

2002-03-31  Jason R. Mastaler  <jason@aguirre.la.mastaler.com>

	* Version.py (ALL): Separate PLATFORM and ARCH with '/'.

	(PLATFORM, ARCH): Replace any frontslashes with underscores.
		
2002-03-30  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Failure notices can now be disabled by setting the
	appropriate BOUNCE_TEXT_* variable to None.

	(CONFIRM_ACCEPT_TEXT_INITIAL,
	CONFIRM_ACCEPT_TEXT_ALREADY_CONFIRMED,
	CONFIRM_ACCEPT_TEXT_ALREADY_RELEASED): New variables.

2002-03-26  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BOUNCE_TEXT_ALREADY_CONFIRMED): Removed.  No longer
	prudent to bounce a message in this situation because of
	tmda-pending's `release' capability.

	(DELIVERED_CACHE, DELIVERED_CACHE_LEN): New variables.
	
2002-03-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (ARCH, PLATFORM): Replace any spaces with
	underscores.

2002-03-21  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py: Add machine architecture to the mix, and base ALL on
	os.uname().

2002-03-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_msgid): Simplify the algorithm.

2002-03-18  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (formataddr): Sync code with email 1.3.

2002-03-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (formataddr): New function.

	* Defaults.py (MESSAGE_FROM_STYLE): Deprecate 'parens' and
	'unquoted'.
	
	* Util.py (make_date): Use the formatdate() method from
	email.Utils (if available) or rfc822 instead of doing it ourselves.

2002-03-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (pipecmd): Bugfix.  A program that exits 0 but outputs
	to stderr should not be considered a failed delivery.

2002-03-06  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BOUNCE_TEXT_*): New variables containing the text
	used in TMDA's various failure notices.

	* Util.py (maketext): Search for the templatefile in a series of
	directories.  First match wins.
	
	* Defaults.py (TEMPLATE_DIR): New variable, replaces
	CONFIRM_ACCEPT_TEMPLATE and CONFIRM_REQUEST_TEMPLATE.

2002-02-28  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_confirm_address): Use Defaults.CONFIRM_ADDRESS
	if set.

	* Defaults.py (CONFIRM_ADDRESS): New variable.

	* Deliver.py (Deliver.__deliver_mbox): New method to reliably
	deliver a message into an mboxrd-format mbox.

2002-02-27  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Deliver.py (Deliver.__deliver_maildir): New method to reliably
	deliver a message into a qmail-style Maildir.

	* Util.py (pipecmd): Include getmail copyright for borrowed GPL
	code.

	(wraptext): Include Mailman copyright for borrowed GPL code.

	(maketext): Ditto.

2002-02-26  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Deliver.py: Run mta.stop() from tmda-rfilter instead of from
	every delivery method.

	* Util.py (sendmail): Add quotes around both the sender and
	recipient when calling sendmail from the shell.

2002-02-25  Tim Legant  <tim@catseye.net>

	* Defaults.py: Documented additional options for ACTION_OUTGOING.

2002-02-25  Tim Legant  <webmaster@catseye.net>

	* FilterParser.py (FilterParser): Fixed in_action regexp to allow
	the 'ok' and 'accept' actions to accept options just like
	'deliver'.

2002-02-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Deliver.py: New module to handle local mail delivery.

2002-02-23  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

        * Util.py (pipecmd): New function that runs child processes with
        error checking.

        (sendmail): New function to send e-mail with the sendmail program.
                
        * MTA.py (MTA.deliver): Use Util.pipecmd() to deliver the
        message.  Also raise an exception rather than sys.exit(75) upon
        error.
                
        * Errors.py: Add DeliveryError for delivery module related errors.
        
        * Defaults.py: Remove SENDMAIL path checking; Util.sendmail() will
        catch any such errors.

2002-02-22  Tim Legant  <tim@catseye.net>

	* Util.py (build_dbm): Fixed bug; DBM was renamed to current
	directory instead of respecting the path.

	* FilterParser.py (FilterParser.firstmatch): If no rule is found,
	return an empty dictionary instead of None.

	* FilterParser.py (FilterParser.__autobuild_db): New function.

	(FilterParser.firstmatch): Factored above function out of
	'from-/to-file' clause to clean up code.
	
	* FilterParser.py (FilterParser.firstmatch): Made autodbm
	functionality use a surrogate file to determine whether the DBM is
	up to date.  This is because of the varied naming of DBM files
	across platforms.  It was suggested by Matt Armstrong.

	(FilterParser._actionstr): Fixed bug introduced by new
	dictionary layout for incoming rules.

	* Util.py (build_dbm): New function, based on the list2dbm
	utility.

	* FilterParser.py (FilterParser): Added -autodbm option to
	'from-file' and 'to-file'.

	(FilterParser.__search_dbm): New function.

	(FilterParser.firstmatch): Modified 'from-/to-file' clause to
	support the -autodbm argument.  Modified 'from-/to-dbm' clause to
	use the new __search_dbm function.

2002-02-21  Tim Legant  <tim@catseye.net>

	* FilterParser.py (FilterParser): Modified 'in_action' and
	'action_option' regexps to handle new option on 'deliver' action.
	
	(FilterParser.__buildactions): Allowed incoming filter actions to
	have options.

2002-02-21  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: raise TMDA.Errors.ConfigError for tmdarc problems
	instead of using print; sys.exit(75).

	* Errors.py: Add ConfigError for tmdarc related errors.
	
2002-02-21  Tim Legant  <tim@catseye.net>

	* FilterParser.py (FilterParser.__readrule): Fixed bug.  Last rule
	was being ignored.

2002-02-20  Tim Legant  <tim@catseye.net>

	* FilterParser.py (FilterParser.__parse): Cleaned up the last of
	the error handling.  Removed self.__exception and added local
	variable 'exception'.

	(FilterParser.__adderror): Removed function.  No longer needed.

	(FilterParser.__readrule): Now throws EOFError on end-of-file.
	Caught in FilterParser.__parse.

2002-02-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.read): Partially restore old
	behavior: allow missing filter files, but not IOErrors.

	(FilterParser.firstmatch): Correct Python2.2isms.

2002-02-20  Tim Legant  <tim@catseye.net>

	* FilterParser.py (Error): Moved __repr__ and __str__ to
	descendent ParsingError.

	(ParsingError): Added __repr__ and __str__ functions.

	(MatchError): New exception class.  Descendent of Error.

	(FilterParser): Modified 'most_sources' and 'hdrbody_sources'
	regexps to better support detailed error checking.  Added
	'arg_option' regexp and 'arguments' dictionary.

	(FilterParser.__init__): Removed 'checking' parameter.

	(FilterParser.read): Removed exception handling around file
	opening.  Now, if the file is missing or can't be opened, the
	exception will propagate up to tmda-filter and cause the mail to
	be deferred.

	(FilterParser.__parse): Catch parsing exceptions here and add to
	singleton ParsingException object.

	(FilterParser.__parseargs): New function.

	(FilterParser.__parserule): Rules now have five fields.  Raise
	exceptions directly rather than calling __adderror.  Call
	__parseargs to get the arguments.

	(FilterParser.__adderror): Removed test for 'checking'.

	(FilterParser.__buildactions): Change second parameter from
	'rule_line' to 'source'.  Raise exceptions instead of calling
	__adderror.  Use 'source' in exception error messages.

	(FilterParser.__search_file): Lowercase the first field on each
	line before attempting to match.  Add 'source' parameter to pass
	along to __buildactions.

	(FilterParser.__search_cdb): Add 'source' parameter to pass along
	to __buildactions.

	(FilterParser.firstmatch): Hoist invariant 'keys' initialization
	to beginning of loop.  Add autocdb functionality (-autocdb
	argument) to 'from-/to-file' code.  Remove 'from-/to-autocdb'
	code.  'from-/to-mailman' now use '-attr' arguments to specify
	which list attribute to search.  'body/headers/body-/headers-file'
	now all take a '-case' argument to turn on case-sensitivity.
	Catch exceptions where appropriate and translate to MatchError
	exceptions.

	(_rulestr): Updated to include arguments in the string.

	(_argstr): New function to build argument string.

	(_cookiestr): Now adds quotes to the second field, if necessary.

	* Util.py (file_to_list): Removed second parameter (list).
	Removed lowercasing of first field.

	(build_cdb): Lowercase first field.

	(filter_match): Removed 'checking' argument in call to
	FilterParser.FilterParser.

2002-02-18  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (pager): New function to display a file using a UNIX
	text paging program such as less or more.

	* Defaults.py (FINGERPRINT): Document 'body'.

	* Cookie.py (make_fingerprint): Use the binascii module instead of
	base64 to do the binary to base64 encoding since we already have
	it imported.

	* Util.py (wraptext): New function to wrap and fill text.

2002-02-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (pickleit): New helper function to save an object to a
	Python pickle file.

	(unpickle): New helper function to retrieve an object from a
	Python pickle file.
	
	* Defaults.py (PENDING_CACHE, PENDING_CACHE_LEN): New variables
	used by tmda-pending's --cache option.

2002-02-11  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_date): Import just email.Utils.

	* Version.py (PLATFORM): Just use sys.platform instead of
	distutils.util.get_platform().
	
2002-02-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (seconds): Remove the exit(75) upon exception, as
	tmda-filter will now catch this.

	(writefile): Ditto.

	(append_to_file): Ditto.

	(maketext): Ditto.

	(substring_match): Removed.
	
2002-02-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_msgid): Change the idstring to 'TMDA', and reverse
	the order of randint and pid.

2002-02-01  Tim Legant  <tim@catseye.net>

	* FilterParser.py: Modified 'tag_action' regular expression to
	allow arbitrary quoted strings.
	
	(FilterParser.__buildactions): Allow arbitrary headers with quoted
	string values.

	(_actionstr): Handle arbitrary headers/values appropriately.

2002-01-31  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.__buildactions): Lowercase the
	incoming action as file_to_list no longer does.

	* Util.py (file_to_list): Only lowercase the first field of a
	whitespace split line.

2002-01-31  Tim Legant  <tim@catseye.net>

	* FilterParser.py: Add 'to/from-autocdb' and 'to/from-autodbm' to
	the 'most_sources' regular expression.

	(FilterParser.__search_file): New function to search a text file
	of email addresses with optional second field (action).

	(FilterParser.__search_cdb): New function to search a CDB database
	of email addresses with optional value (action).

	(FilterParser.firstmatch): Added support for 'to/from-autocdb'.
	Moved the guts of 'to/from-file' and 'to/from-cdb' to the two
	functions listed just above.

	* Util.py (build_cdb): New function to build a CDB file from a
	text file.

2002-01-30  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* HMAC.py (_strxor): Python2ism - string method ok to use now.
	
	* Util.py (gethostname): Remove Python 1.x support.

	* Defaults.py (CRYPT_KEY): Use binascii.unhexlify instead of 
	Util.unhexlify.
	
	* Cookie.py (confirmationmac): Use binascii.hexlify instead of
	Util.hexlify.
	
	(datemac): Ditto.

	(make_sender_cookie): Ditto.

	(make_keywordmac): Ditto.

	* Util.py: Remove hexlify and unhexlify functions; use the
	binascii module instead.

2002-01-30  Tim Legant  <tim@catseye.net>

	* Defaults.py: Updated PARENTDIR to support relative symlinks in
	addition to absolute symlinks.

2002-01-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Add a new variable PARENTDIR that refers to the
	TMDA parent directory.  Used internally.

	* FilterParser.py (FilterParser.firstmatch): Add from/to-ezmlm
	rules to support matching from ezmlm `subscribers' directories
	which contain hash files of list subscriber addresses.

2002-01-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py: Remove the trailing space in the matches regex.

	(FilterParser.firstmatch): If the regex in headers-file or
	body-file includes quotes, extract the regex from the quotes
	before matching.  This is so the -file methods are consistent with
	headers and body.

2002-01-24  Tim Legant  <tim@catseye.net>

	* FilterParser.py: Changed 'matches' regular expression to expect
	either single or double quotes as the delimiters for the 'headers'
	or 'body' filter sources.

	* (FilterParser.__parserule): Text matched by 'matches' now
	appears in either group 2 or group 3.
	
2002-01-24  Tim Legant  <tim@catseye.net>

	* FilterParser.py (FilterParser): Removed 'whitespace' and
	source_match regular expressions and added 'most_sources',
	'hdrbody_sources' and 'matches' regular expressions. Modified
	'tag_action' regular expression.
	
	* (FilterParser.__readrule): Changed whitespace collapse to simply
	substitue a space for every tab.

	* (FilterParser.__parserule): Rewrote to handle parenthesized
	regular expressions with embedded spaces (for the 'headers' and
	'body' sources).

	* (FilterParser.__adderror): Fixed massive bug. Should have been
	'__exception', not 'exception'.  When 'checking' was True, this
	resulted in a NameError exception.

	* (FilterParser.__buildactions): Fixed to handle multiple spaces
	between headers and actions.

	* (FilterParser.firstmatch): Created 'line' return value by
	calling new module-level function, '_rulestr'.

	* (_rulestr): New function.

2002-01-19  Tim Legant  <tim@catseye.net>

	* FilterParser.py: Rewrite to support multiline,
	whitespace-delimited, multi-action filter files.  The only
	function that didn't change much is FilterParser.firstmatch.

	(FilterParser.firstmatch): Return value changed to a 2-tuple
	(dictionary of actions, string describing matching rule).  The
	string is not necessarily the exact string from the file because
	it's reconstructed when needed.  All callers needed to be
	changed.  These were Util.filter_match, tmda-inject and
	tmda-rfilter.

	* Util.py (filter_match): FilterParser.firstmatch return value changed.

2002-01-14  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): For file based
	sources, no longer just skip the filter line if the file is
	missing or if an exception occurs.  Let the exception be raised so
	it will be caught by tmda-filter.

2002-01-11  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): Also pass if
	cdb.error is raised while matching a CDB file.

	* Defaults.py (RECIPIENT_HEADER): New variable specifying the
	header whose contents will be taken as the envelope recipient of
	the message.

2002-01-09  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): Add support for
	matching lists of addresses contained within a Mailman
	configuration database.

2002-01-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (TMDA): 0.43+ --> 0.44.
	(TMDA): 0.44 --> 0.44+.

2002-01-06  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDARC): Let tmda-filter catch the exception if
	there is one raised when trying to read the ~/.tmdarc.

2002-01-05  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Errors.py: import of sys and Defaults no longer necessary, and
	leave the exit EX_TEMPFAIL.to tmda-filter.

2002-01-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_msgid): Add a random integer to the message id to
	strengthen its uniqueness.

2002-01-03  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (LOGFILE_INCOMING): Replaces LOGFILE.

	(LOGFILE_DEBUG): New logfile to hold the tracebacks generated by
	uncaught exceptions.

2001-12-27  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (unixdate): New function to return a date string in the
	same format as the UNIX `date' command.

2001-12-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (TMDA): 0.42+ --> 0.43.
	(TMDA): 0.43 --> 0.43+.

	* Errors.py: New module to hold TMDA custom exceptions.
	
2001-12-17  Matt Armstrong  <matt@lickey.com>

	* Cookie.py (make_keyword_cookie): Substitute '?' for keyword
	chars not part of an RFC2822 atom.  This prevents us from creating
	an invalid keyword address.

2001-12-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_sender_cookie): Lowercase the address before
	generating the cookie.  Otherwise, mixed or uppercase sender
	addresses will fail verification.
	Patch contributed by Brian Lalor.

2001-12-15  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Version.py (ALL): Change SUMMARY to ALL.

2001-12-14  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MTA.py (Sendmail.__init__): New class to support Sendmail.  We
	just inherit from the MTA superclass with no method overrides.

	* Defaults.py: Add support for Sendmail.

2001-12-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Remove PYTHON_VERSION, PLATFORM, and
	DELIVERY_AGENT.  This info is now kept in Version.py.

	* Version.py: New module to keep all versioning information in one
	easily accessible place.

2001-12-12  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (FINGERPRINT): New list which contains the headers
	to be used to create X-TMDA-Fingerprint.

	* Cookie.py (make_fingerprint): New function to create an HMAC
	from one or more message headers.

2001-12-11  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (PURGED_HEADERS): New variable specifying a list of
	headers to remove before sending outgoing mail.

2001-12-09  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (DELIVERY_AGENT): Modify DELIVERY_AGENT to use
	distutils.util.get_platform() if available which is more
	descriptive than sys.platform.
	
2001-12-08  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py: Only import time once at the toplevel.

	* Defaults.py: Remove TIMEZONE, and import the Util module after
	/etc/tmdarc and ~/.tmdarc are read so TZ can be set there if need
	be.
	
2001-12-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (MESSAGE_FROM_STYLE):  Add an `unquoted' option
	which is similar to `angles' except that the fullname is not
	double quoted.

2001-12-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.43 development.

	(CONFIRM_ACCEPT_CC): New variable specifying an e-mail address to
	send the confirmation replies.
	Patch contributed by Matt Armstrong.

2001-11-30  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (make_msgid): New function to create and return an
	rfc2822 compliant Message-ID string.

	(make_date): New function to create and return an rfc2822
	compliant Date string.

	* Defaults.py (PID): Store the process id here so all areas of the
	code can access it without having to re-fetch it.

2001-11-28  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): Add support for DJB's
	constant databases via M. J. Pomraning's python-cdb extension
	module.  The `to-cdb', and `from-cdb' source specifiers were
	added.

	* Util.py (findmatch): Bugfix for the `@=' handling syntax.  Now
	split on `@=' using only the last `@'.  This is in case you start
	getting spammed from "@="@randomdomain.com, you will be able to
	match this using the current syntax.
	Patch contributed by Ron Bickers.
		
2001-11-26  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): Bugfix.  The DBM
	support was broken for DBM backends that store information in
	multiple external files instead of just one.  The
	os.path.exists(match) check was removed to fix this.

2001-11-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.42 development.

2001-11-19  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (filter_match): New function to open a filter file and
	try to match the given addresses.  Used to test addresses against
	your filter files with tmda-filter/inject --filter-match.

	* FilterParser.py: Add some exception classes that will be
	utilized only if an instance is created with checking=1, which at
	the moment is only if tmda-filter/inject are using the
	`--filter-match' option.

	Also, 'break' within nested for loops only exits one level.  For
	those cases, added a second break if self.action was set.  This
	oversight was causing to/from-dbm and body/header-file matches to
	be ignored.
	
2001-11-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Look for FILTER_INCOMING and FILTER_OUTGOING in the
	environment first, which are set via tmda-inject/tmda-filter
	command-line options.

	* FilterParser.py: Moved filter file documentation into
	config-filter.html.
	
2001-11-15  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Change default location of FILTER_INCOMING and
	FILTER_OUTGOING to ~/.tmda/filters/ instead of ~/.tmda/lists/.

	* Util.py (gethostname): socket module was not returning the FQDN
	on Solaris.  So now we at least attempt to first use
	socket.getfqdn() which does work on Solaris, but only on Python2.
	
2001-11-14  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BARE_APPEND): New variable specifying the filename
	to append the recipient address of outgoing messages when <action>
	is 'bare=append'.

	* FilterParser.py: Document bare=append <action>.

	* Defaults.py (ACTION_OUTGOING): New variable replacing
	COOKIE_TYPE to specify the default tag on outgoing messages.

	(ACTION_INCOMING): New variable to specify how incoming messages
	are disposed of by default.

2001-11-08  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDARC): Exit(75) to force a deferral if any
	exceptions arise when running execfile on TMDARC.  This is
	necessary for non-qmail MTAs which bounce rather than defer by
	default.

	* Util.py (findmatch): addrs should now be a list to iterate over.
	
	* FilterParser.py: Add support for incoming filter files.

	* Defaults.py: Remove: BOUNCE_BLACKLIST_CC, BOUNCE_CONFIRM_CC,
	BOUNCE_REVOKED_CC BLACKLIST, WHITELIST, SACRED_FILE, REVOKED_FILE,
	BARE_FILE, DATED_FILE, EXP_FILE, EXT_FILE, KEYWORD_FILE,
	SENDER_FILE, WHITELIST_TO_BARE, WHITELIST_AUTO_APPEND

	Add: FILTER_DROP_CC, CONFIRM_CC, FILTER_BOUNCE_CC,
	FILTER_INCOMING, FILTER_OUTGOING, CONFIRM_APPEND

2001-11-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* FilterParser.py (FilterParser.firstmatch): Catch the TypeError
	exception which is returned by Python 1.x instead of
	AttributeError when string.split is run on None.

	* Defaults.py (FILTER_INCOMING): New variable specifying the
	location of the 'incoming' filter file.

	* FilterParser.py: Document outgoing <action> aliases: 'as' and
	'explicit' for exp, 'extension' for ext, and 'keyword' for kw.

2001-11-06  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (FILTER_OUTGOING): New variable specifying the
	location of the 'outgoing' filter file.

	* FilterParser.py: New file implementing the parser for TMDA
	filter files.

2001-11-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.41 development.

2001-11-01  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TIMEZONE): New variable specifying the timezone
	(TZ) other than that of the local host.

2001-10-31  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Add 'exim' as another option for
	MAIL_TRANSFER_AGENT, and change BOUNCE_ENV_SENDER default if MTA
	is Exim.

	* MTA.py: Move the Postfix instance variables and methods up to
	the MTA superclass.  Subclasses automatically inherit this
	functionality.  The Qmail subclass then overrides all of it since
	it's unique.  Also, add an Exim subclass.

	(TMDA_VERSION): Begin 0.40 development.

2001-10-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (findmatch): Downcase each address for case-insensitive
	comparison with list.

2001-10-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (MESSAGE_FROM_STYLE): New variable that specifies
	how `From' headers should look on outgoing tagged messages.

	(KEYWORD_FILE): New variable pointing to the list file containing
	destinations that should receive keyword tagged messages.

2001-10-24  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_keyword_address): Lowercase keyword before
	creating the keyword address.  E-mail addresses are
	case-insensitive.
	
2001-10-23  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_keywordmac, make_keyword_cookie,
	make_keyword_address): New functions to return an HMAC, a cookie,
	and an e-mail address based on a 'keyword'.

2001-10-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.39 development.

2001-10-15  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MTA.py (Postfix.deliver): Bugfix.  The exit code from
	LOCAL_DELIVERY_AGENT was not being propagated to the MTA.  
	(e.g, tmda-filter returns 0 if procmail returns 77.)  
	The fix is to do some more processing on the exitcode before
	passing it to sys.exit.  Patch contributed by Matt Armstrong.

2001-10-10  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MTA.py (Postfix.deliver): Check whether LOCAL_DELIVERY_AGENT
	actually exists and defer if it doesn't.  Otherwise, pass the
	message to LOCAL_DELIVERY_AGENT for final delivery.

	* Defaults.py (LOCAL_DELIVERY_AGENT): Remove os.path.exists check
	since it's not necessary to verify this upon each import of
	Defaults.
	
2001-10-08  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Removed INJECT & INJECT_FLAGS.

2001-10-05  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* MTA.py (Postfix.deliver): Exit the deliver method by the same
	exit code as that of LOCAL_DELIVERY_AGENT's exit status.

	* Util.py: Replaced ERR_CONFIG and ERR_IO with EX_TEMPFAIL.
	
	* Defaults.py: Replace qmail-specific exit status codes with
	general codes that work under both Postfix and qmail.  An
	"success" code and a "defer" code were all that were necessary in
	the modules anyway.
	
	(LOCAL_DELIVERY_AGENT): New variable to specify the path to the
	local delivery agent, which is necessary if not running qmail.
	
	(MAIL_TRANSFER_AGENT): New variable to specify which mail transfer
	agent software we are running.
	
2001-10-02  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (RECIPIENT_DELIMITER): New variable specifing the
	character used to separate user names and address extensions.
	
	* Cookie.py (make_confirm_address): Replace references to `-' with
	RECIPIENT_DELIMITER.

	(make_sender_address): Ditto.

	(make_dated_address): Ditto.

	* Defaults.py (SENDMAIL): New variable defining the path to the
	sendmail program or sendmail compatibility interface.

2001-09-19  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (GLOBAL_TMDARC): Add a global configuration file
	(/etc/tmdarc) that is read first before ~/.tmdarc.  

	(TMDA_VERSION): Begin 0.38 development.

2001-09-18  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_sender_cookie): Support variable length HMACs
	via HMAC_BYTES.

	(confirmationmac): Ditto.

	(datemac): Ditto.

	* Defaults.py (HMAC_BYTES): New variable specifying the number of
	bytes for all HMACs.

2001-09-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.37 development.

2001-09-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (REVOKED_FILE): New variable pointing to the file
	which contains "revoked" recipient addresses.

	(BOUNCE_REVOKED_CC): New variable specifying the address to CC
	"revoked" bounces.

2001-09-12  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.36 development.

2001-09-10  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (WHITELIST_TO_BARE): Turn on by default.

2001-09-05  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (WHITELIST_AUTO_APPEND): New variable to toggle
	whether tmda-filter should automatically append a confirming
	sender's address to the WHITELIST.

	* Util.py (append_to_file): New function which appends a string to
	a textfile.
	
2001-09-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (CONFIRM_MAX_MESSAGE_SIZE): New variable that
	specifies the maximum size the a message can be before its body is
	excluded from the confirmation request/acceptance notices.

	(CONFIRM_MAX_MESSAGE_SIZE): Change default to 50000 bytes.

2001-09-01  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_HOMEPAGE): Use sf.net instead of
	sourceforge.net (shorter alias).

2001-08-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.35 development.

2001-08-28  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.34 development.

	(mode): Remove check for VIRTUALDOMAINS for sites that don't have
	any such file.
	
2001-08-27  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (USEVIRTUALDOMAINS): Replaces QMAILVIRTUALDOMAINS.
	
2001-08-24  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (QMAILVIRTUALDOMAINS): New variable to toggle qmail
	virtualdomains support.

	(VIRTUALDOMAINS): New variable pointing to qmail's virtualdomains
	control file.

	* Cookie.py (make_confirm_address): New function to create full
        confirmation-style addresses (both 'accept' and 'done).

	* Defaults.py (TMDA_VERSION): Begin 0.33 development.

2001-08-21  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (SACRED_FILE): New variable pointing to a filename
	which contains a list of sacred keywords, the prescence of which
	automatically zaps the mail into your mailbox.
	Patch contributed by Binesh Bannerjee.

2001-08-15  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (format_timeout): Added `Y' for years, and `M' for
	months.

	(seconds): Ditto.

2001-08-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.32 development.

2001-07-26  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.31 development.

	(LOCALS): Variable no longer necessary.

	(USERPREFIX): Ditto.

2001-07-23  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (maketext): Add error checking for template variables.

	* Defaults.py: Remove BOUNCE_DATED_CC, BOUNCE_SENDER_CC, and add
	BOUNCE_CONFIRM_CC.

	(DATED_TEMPLATE_VARS,SENDER_TEMPLATE_VARS): New variables to allow
	'dated' and 'sender' address variables to be included in the
	templates.

2001-07-22  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Remove CONFIRMATION_MODE, BOUNCE_DATED_TEMPLATE,
	BOUNCE_SENDER_TEMPLATE, and add CONFIRM_REQUEST_TEMPLATE.  

2001-07-20  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Change default location of former dot-tmda files to
	lie within DATADIR/lists/. (e.g, ~/.tmda-bare --> ~/.tmda/lists/bare)

2001-07-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py: Change default location of dot-tmda files to lie
	within DATADIR.  (e.g, ~/.tmda-bare == ~/.tmda/bare.txt)

2001-07-16  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (CONFIRM_ACCEPT_TEMPLATE): New template for
	notification that a confirmation request was accepted.

	(CONFIRM_ACCEPT_NOTIFY): New variable to toggle generation of
	confirmation acceptance notices.

2001-07-12  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BOUNCE_DATED_TEMPLATE): Allow for an alternate
	template based on CONFIRMATION_MODE.
	
	(BOUNCE_SENDER_TEMPLATE): Ditto.

	* Util.py (writefile): New function to write contents to a
	new file.
	
2001-07-11  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (CONFIRMATION_MODE): New variable which turns
	confirmation mode on or off. 

	(DATADIR): New variable for TMDA data-manipulation directory.

	* Cookie.py (confirmationmac,make_confirm_cookie): Add two new
	functions for creation of confirmation-style cookies.

	* Defaults.py (TMDA_VERSION): Begin 0.30 development.

2001-07-03  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.23 development.

2001-06-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.22 development.

2001-06-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (findmatch): Add support for custom matching syntax.
	@=domain.dom matches both @domain.dom and @*.domain.dom.  The
	rationale is that this situation is common enough to justify the
	special syntax.

2001-06-12  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (findmatch): Function re-written to support patterns
	based on Unix style wildcards.

2001-06-07  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.21 development.

2001-06-06  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (BOUNCE_DATED_TEMPLATE): Define the default template
	as ../templates/*.txt.

	(TMDA_VERSION): Update version number.

	(BOUNCE_SENDER_TEMPLATE): Ditto.

2001-06-04  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (maketext): Accept the fullpathname of the template file
	instead of assuming it lies in ../templates/.

	* Defaults.py (BOUNCE_ENV_SENDER): New variable to specify the
	envelope sender of bounce messages.

	(DELIVERY_AGENT): New variable containing TMDA version info.

	(BOUNCE_DATED_TEMPLATE): New variable specifying an optional
	custom template for 'dated' bounce messages.

	(BOUNCE_SENDER_TEMPLATE): New variable specifying an optional
	custom template for 'sender' bounce messages.
	
2001-06-01  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (format_timeout): A more efficient implementation which
	only contains one re.match call.  Also, return the singular
	version of the unit if the value is 1.
		
	(seconds): Ditto, plus fix a bug in the sys.exit() call where
	Defaults wasn't being imported.
	
2001-05-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (file_to_list): Allow inline comments in the .tmda-*
	files.  For example:
	friend@fbi.org       # My friend at the FBI

	(substring_match): Ditto.

	* Defaults.py (TMDA_VERSION): Begin 0.16 development.

2001-05-28  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.15 development.

	* Util.py:  Import Defaults only for functions that need them.
	Fixes tmda-keygen.

2001-05-24  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (ALLOW_MODE_640): New variable to support mode 640
	tmdarc files which are necessary when running TMDA through a qmail
	relay.

2001-05-23  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (USERPREFIX): New variable introduced to support
	"pre-extension" definitions in /var/qmail/users/assign.

	* Util.py (findmatch): New function to facilitate matching
	substrings for the special-case addresses.  Used by tmda-inject.

2001-05-22  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (substring_match): Moved Greylist.py into this function.
	Greylist.py now obsolete.

2001-05-17  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (LOCALS): Introduced new variable to support
	virtualdomain detection.

2001-05-13  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Cookie.py (make_dated_cookie): Support `X-TMDA: dated timeout'
	(to override Defaults.TIMEOUT)

2001-05-10  Jason R. Mastaler  <jason@mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.13 development.

2001-05-02  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.12 development.

2001-05-02  Jason R. Mastaler  <jasonrm@nightshade.acl.lanl.gov>

	* Util.py (maketext): New function to make text from a template file.

2001-05-01  Jason R. Mastaler  <jasonrm@nightshade.acl.lanl.gov>

	* Defaults.py: To speed startup, the user's .tmdarc is now read
	first with default values computed only if necessary.

2001-04-29  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDARC): Add support for alternate config-file.

2001-04-28  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Begin 0.11 development.

2001-04-27  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Util.py (hexlify): New function to convert binary data strings to
	their hexidecimal notation.
	(unhexlify): New function to convert hex back to binary.

	(gethostname): Replaced socket.getfqdn() with
	socket.gethostbyaddr(socket.gethostname())[0] to get the machine's
	FQDN since the former is only available in Python >= 2.0.

	* Cookie.py (datemac): Replace binascii.hexlify with my own binary
	to hex function to support Python < 2.0.
	(make_sender_cookie): Ditto.

	* Defaults.py (mode): Ditto.

	* HMAC.py (_strxor): Python version earlier than 2.0 don't have
	built-in string methods; replace with string.join().

2001-04-26  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Bump up to a new major release level
	(0.10) indicating a major functionality change (HMAC).

	* Cookie.py (datemac): New function to compute an HMAC for a given
	date in time.
	
	* Defaults.py (BLOCK_CIPHER): Now obsolete.
	(CRYPT_IV): Ditto.
	(HASH_FUNCTION): Ditto.
	
	* Cookie.py (make_cipher_object): Function now obsolete.
	(make_sender_cookie): Generate cookies with HMACs.
	(make_dated_cookie): Generate cookies with HMACs.
	(get_cookie_date): Function now obsolete.
	(make_dated_address): New HMAC format.

	* HMAC.py: New module for HMAC implementation.

2001-04-25  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Defaults.py (TMDA_VERSION): Release v0.02.
	Added BOUNCE_BLACKLIST_CC, BOUNCE_DATED_CC, BOUNCE_SENDER_CC

2001-04-24  Jason R. Mastaler  <jasonrm@nightshade.la.mastaler.com>

	* Greylist.py (match): function now takes an extra argument
	`listfile' which is the file containing addresses/regex to match
	against, so that it can be used for both the black and white lists.

