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.

