2007-02-23 Jason R. Mastaler * 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 * 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 * Defaults.py: added additional description to ACTION_EXPIRED_DATED 2006-10-07 Jason R. Mastaler * pythonlib/email: Sync up with email 4.0.1. 2006-10-04 Jason R. Mastaler * Defaults.py (PENDING_QUEUE_FORMAT): Add 'maildir'. 2006-09-28 Jason R. Mastaler * Defaults.py (PENDING_QUEUE_FORMAT): New variable. 2006-09-27 Jason R. Mastaler * 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 * 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 * Pending.py (Queue.listDeliveredIds): Removed. (Queue.listConfirmedIds): Ditto. (Queue.listReleasedIds): Ditto. (Queue.checkDelivered): Ditto. (Message.wasDelivered): Ditto. 2004-03-01 Jason R. Mastaler * 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 * Defaults.py (TMDARC): Allow TMDARC to be specified by GLOBAL_TMDARC if $TMDARC is not set. 2004-02-20 Jason R. Mastaler * 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 * Util.py (wraptext): Utilize the new builtin textwrap module. 2004-02-05 Jason R. Mastaler * 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 * Defaults.py (MAIL_FOLLOWUP_TO): New variable. 2004-01-30 Jason R. Mastaler * FilterParser.py (_FilterFile.__init__): Add 'pipe-headers'. (FilterParser.firstmatch): Ditto. 2004-01-17 Jason R. Mastaler * Defaults.py (TMDARC): ~/.tmdarc is deprecated. 2004-01-11 Jason R. Mastaler * MessageLogger.py (MessageLogger.write): Use Util.make_date(). * Pending.py (Message.getDate): Use Util.make_date(). 2004-01-10 Jason R. Mastaler * Pending.py (Message.release): Use Util.make_date() for X-TMDA-Released. 2004-01-09 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * Defaults.py (OUTGOINGMAIL): Change default to 'sendmail'. (MAIL_TRANSPORT): OUTGOINGMAIL renamed. 2003-10-09 Jason R. Mastaler * 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 * Util.py (getfullname): Change default fallback value to an empty string instead of 'Jane Doe'. 2003-09-22 Jason R. Mastaler * Util.py (append_to_file): Strip inline comments before checking for duplicate entries. 2003-08-21 Tim Legant * 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 * FilterParser.py (_FilterFile.__init__): confirm can now take an option, which is the path to a specific template. 2003-08-01 Tim Legant * 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 * Util.py (msg_as_string): Use HeaderParsedGenerator rather than the standard Generator, which fails on messages parsed with HeaderParser. 2003-07-18 Tim Legant * 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 * 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 * 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 * Address.py: Fixed ConfirmAddress, removed formatting code from DatedAddress.timestamp(). 2003-06-20 Gre7g Luterman * Fixed a bug in the LDAP code found by Chet McNeill. 2003-06-08 Jason R. Mastaler * Util.py (maketext): Now accepts an absolute pathname to a template file which short-circuits the searching process. 2003-06-08 Jason R. Mastaler * FilterParser.py (_FilterFile.__init__): bounce,reject now can take an option, which is the path to a specific template. 2003-06-05 Cory Wright * Util.py (maketext): Recognize TEMPLATE_DIR_MATCH_RECIPIENT. * Defaults.py (TEMPLATE_DIR_MATCH_RECIPIENT): New variable 2003-06-04 Tim Legant * 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 * Defaults.py (PENDING_DIR): New variable. * Pending.py (Queue.initQueue): Use Defaults.PENDING_DIR. (Message.__init__): Ditto. 2003-05-24 Jason R. Mastaler * Defaults.py (CGI_VIRTUALUSER): New variable. 2003-05-24 Tim Legant * 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 * Version.py (ALL): Add CODENAME. 2003-04-29 Jason R. Mastaler * 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 * Util.py (msg_from_file): New function. 2003-04-23 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * FilterParser.py (_FilterFile.__init__): Add `pipe', a new filter source. (_FilterFile.__init__): Ditto. (FilterParser.firstmatch): Ditto. 2003-02-26 Jason R. Mastaler * AutoResponse.py (AutoResponse.create): Sort ADDED_HEADERS_SERVER before adding them to the message. 2003-02-20 Jason R. Mastaler * Message.py: New module. 2003-02-13 Mark Horn * Defaults.py: Added ACTION_HEADER_INCOMING to enable the logfile stuff to get written in a header message. 2003-01-30 Jason R. Mastaler * 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 * 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 * 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 * Deliver.py (Deliver.__deliver_maildir): Strengthen the uniqueness of maildir filenames based on djb's updated maildir spec. 2003-01-20 Tim Legant * 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 * 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 * 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 * Defaults.py (CGI_URL): New variable. 2002-12-02 Jason R. Mastaler * Defaults.py (GLOBAL_TMDARC): Don't skip if there is an error. 2002-11-25 David Guerizec * Pending.py: new module 2002-11-21 Jason R. Mastaler * Defaults.py: Removed DELIVERED_CACHE and DELIVERED_CACHE_LEN. 2002-11-12 Jason R. Mastaler * 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 * Util.py (build_cdb): Uniquify ftmp when doing cdbmake. 2002-11-08 Jason R. Mastaler * Defaults.py (SUMMARY_HEADERS): New variable. * Deliver.py (Deliver.deliver): Retain From_ when doing a program delivery. 2002-11-03 Jason R. Mastaler * AutoResponse.py (AutoResponse.create): Add Version.CODENAME to X-Delivery-Agent. 2002-11-01 Jason R. Mastaler * Util.py (maketext): Recognize TEMPLATE_DIR_MATCH_SENDER. * Defaults.py (TEMPLATE_DIR_MATCH_SENDER): New variable. 2002-10-18 Jason R. Mastaler * 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 * Defaults.py (MESSAGE_TAG_HEADER_STYLE): New variable. 2002-10-01 Jason R. Mastaler * pythonlib/email: Sync up with email 2.4. 2002-09-30 Jason R. Mastaler * 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 * 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 * Util.py (decode_header): New function. 2002-09-12 Jason R. Mastaler * Util.py (formataddr): Remove function. (make_date): Utilize email.Utils.formatdate(). 2002-09-11 Jason R. Mastaler * 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 * 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 * SMTP.py (Connection.__connect): Add support for SSL. * Defaults.py (SMTPSSL, SMTPSSL_KEYFILE, SMTPSSL_CERTFILE): New variables. 2002-08-21 Jason R. Mastaler * 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 * MessageLogger.py: New module. * Defaults.py (LOGFILE_OUTGOING): New variable. 2002-08-07 Tim Legant * 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 * FilterParser.py (FilterParser.__findvarsub): Query the Defaults vardict when checking the namespace. 2002-08-06 Tim Legant * 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 * Defaults.py (X_TMDA_IN_SUBJECT, ADDED_HEADERS_SERVER): New variables. Renamed ADDED_HEADERS to ADDED_HEADERS_CLIENT. 2002-06-20 Jason R. Mastaler * Util.py: New helper functions: getuid, getgid, gethomedir, and getgrouplist. 2002-06-18 Jason R. Mastaler * Defaults.py (CONFIG_EXEC): New variable. 2002-06-16 Jason R. Mastaler * Defaults.py: Add PENDING_WHITELIST_APPEND & PENDING_BLACKLIST_APPEND. 2002-06-15 Jason R. Mastaler * Cookie.py (make_keyword_cookie): Replace RECIPIENT_DELIMITER with `?' in the keyword. 2002-06-12 Jason R. Mastaler * Util.py (getfileuid): New function that returns the numerical UID of a given file. 2002-06-11 Jason R. Mastaler * 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 * Defaults.py: Added ACTION_FAIL* variables and BOUNCE_TEXT_FAIL* variables 2002-06-06 Jason R. Mastaler * 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 * Cookie.py: Replace all uses of the string module with string methods. 2002-05-22 Jason R. Mastaler * Util.py (sendmail): Terminate commandline switch processing with `--'. * Defaults.py (ADDED_HEADERS): New variable. 2002-05-16 Jason R. Mastaler * 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 * 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 * 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 * 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 * Defaults.py (TMDARC): Allow ~/.tmda/config as a second default location for the configuration file. 2002-04-30 Jason R. Mastaler * Defaults.py: Include example settings for optional variables here instead of sample.tmdarc. 2002-04-30 Jason R. Mastaler * Version.py (PLATFORM): Use distutils.util.get_platform(). 2002-04-29 Jason R. Mastaler * Defaults.py (PENDING_DELETE_APPEND, PENDING_RELEASE_APPEND): New variables. 2002-04-28 Jason R. Mastaler * HMAC.py: XOR optimizations. 2002-04-23 Jason R. Mastaler * Defaults.py (TERSE_SUMMARY_HEADERS): New variable. * Util.py (make_date): Support LOCALDATE. * Defaults.py (LOCALDATE): New variable. 2002-04-22 Jason R. Mastaler * 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 * 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 * 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 * Version.py (ALL): Separate PLATFORM and ARCH with '/'. (PLATFORM, ARCH): Replace any frontslashes with underscores. 2002-03-30 Jason R. Mastaler * 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 * 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 * Version.py (ARCH, PLATFORM): Replace any spaces with underscores. 2002-03-21 Jason R. Mastaler * Version.py: Add machine architecture to the mix, and base ALL on os.uname(). 2002-03-20 Jason R. Mastaler * Util.py (make_msgid): Simplify the algorithm. 2002-03-18 Jason R. Mastaler * Util.py (formataddr): Sync code with email 1.3. 2002-03-13 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * 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 * Defaults.py: Documented additional options for ACTION_OUTGOING. 2002-02-25 Tim Legant * 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 * Deliver.py: New module to handle local mail delivery. 2002-02-23 Jason R. Mastaler * 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 * 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 * 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 * 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 * FilterParser.py (FilterParser.__readrule): Fixed bug. Last rule was being ignored. 2002-02-20 Tim Legant * 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 * 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 * 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 * 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 * 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 * 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 * 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 * Util.py (make_msgid): Change the idstring to 'TMDA', and reverse the order of randint and pid. 2002-02-01 Tim Legant * 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 * 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 * 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 * 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 * Defaults.py: Updated PARENTDIR to support relative symlinks in addition to absolute symlinks. 2002-01-29 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * 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 * 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 * FilterParser.py (FilterParser.firstmatch): Add support for matching lists of addresses contained within a Mailman configuration database. 2002-01-07 Jason R. Mastaler * Version.py (TMDA): 0.43+ --> 0.44. (TMDA): 0.44 --> 0.44+. 2002-01-06 Jason R. Mastaler * 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 * 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 * Util.py (make_msgid): Add a random integer to the message id to strengthen its uniqueness. 2002-01-03 Jason R. Mastaler * Defaults.py (LOGFILE_INCOMING): Replaces LOGFILE. (LOGFILE_DEBUG): New logfile to hold the tracebacks generated by uncaught exceptions. 2001-12-27 Jason R. Mastaler * 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 * 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 * 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 * 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 * Version.py (ALL): Change SUMMARY to ALL. 2001-12-14 Jason R. Mastaler * 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 * 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 * 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 * Defaults.py (PURGED_HEADERS): New variable specifying a list of headers to remove before sending outgoing mail. 2001-12-09 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * 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 * 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 * Defaults.py (TMDA_VERSION): Begin 0.42 development. 2001-11-19 Jason R. Mastaler * 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 * 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 * 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 * Defaults.py (BARE_APPEND): New variable specifying the filename to append the recipient address of outgoing messages when is 'bare=append'. * FilterParser.py: Document bare=append . * 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 * 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 * 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 aliases: 'as' and 'explicit' for exp, 'extension' for ext, and 'keyword' for kw. 2001-11-06 Jason R. Mastaler * 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 * Defaults.py (TMDA_VERSION): Begin 0.41 development. 2001-11-01 Jason R. Mastaler * Defaults.py (TIMEZONE): New variable specifying the timezone (TZ) other than that of the local host. 2001-10-31 Jason R. Mastaler * 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 * Util.py (findmatch): Downcase each address for case-insensitive comparison with list. 2001-10-25 Jason R. Mastaler * 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 * Cookie.py (make_keyword_address): Lowercase keyword before creating the keyword address. E-mail addresses are case-insensitive. 2001-10-23 Jason R. Mastaler * 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 * Defaults.py (TMDA_VERSION): Begin 0.39 development. 2001-10-15 Jason R. Mastaler * 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 * 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 * Defaults.py: Removed INJECT & INJECT_FLAGS. 2001-10-05 Jason R. Mastaler * 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 * 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 * 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 * 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 * Defaults.py (TMDA_VERSION): Begin 0.37 development. 2001-09-13 Jason R. Mastaler * 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 * Defaults.py (TMDA_VERSION): Begin 0.36 development. 2001-09-10 Jason R. Mastaler * Defaults.py (WHITELIST_TO_BARE): Turn on by default. 2001-09-05 Jason R. Mastaler * 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 * 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 * Defaults.py (TMDA_HOMEPAGE): Use sf.net instead of sourceforge.net (shorter alias). 2001-08-29 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.35 development. 2001-08-28 Jason R. Mastaler * 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 * Defaults.py (USEVIRTUALDOMAINS): Replaces QMAILVIRTUALDOMAINS. 2001-08-24 Jason R. Mastaler * 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 * 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 * Util.py (format_timeout): Added `Y' for years, and `M' for months. (seconds): Ditto. 2001-08-13 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.32 development. 2001-07-26 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.31 development. (LOCALS): Variable no longer necessary. (USERPREFIX): Ditto. 2001-07-23 Jason R. Mastaler * 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 * Defaults.py: Remove CONFIRMATION_MODE, BOUNCE_DATED_TEMPLATE, BOUNCE_SENDER_TEMPLATE, and add CONFIRM_REQUEST_TEMPLATE. 2001-07-20 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * Defaults.py (TMDA_VERSION): Begin 0.23 development. 2001-06-25 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.22 development. 2001-06-13 Jason R. Mastaler * 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 * Util.py (findmatch): Function re-written to support patterns based on Unix style wildcards. 2001-06-07 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.21 development. 2001-06-06 Jason R. Mastaler * 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 * 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 * 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 * 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 * 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 * 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 * 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 * Util.py (substring_match): Moved Greylist.py into this function. Greylist.py now obsolete. 2001-05-17 Jason R. Mastaler * Defaults.py (LOCALS): Introduced new variable to support virtualdomain detection. 2001-05-13 Jason R. Mastaler * Cookie.py (make_dated_cookie): Support `X-TMDA: dated timeout' (to override Defaults.TIMEOUT) 2001-05-10 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.13 development. 2001-05-02 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.12 development. 2001-05-02 Jason R. Mastaler * Util.py (maketext): New function to make text from a template file. 2001-05-01 Jason R. Mastaler * 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 * Defaults.py (TMDARC): Add support for alternate config-file. 2001-04-28 Jason R. Mastaler * Defaults.py (TMDA_VERSION): Begin 0.11 development. 2001-04-27 Jason R. Mastaler * 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 * 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 * Defaults.py (TMDA_VERSION): Release v0.02. Added BOUNCE_BLACKLIST_CC, BOUNCE_DATED_CC, BOUNCE_SENDER_CC 2001-04-24 Jason R. Mastaler * 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.