-*- coding: iso-8859-1 -*-
Mailman - The GNU Mailing List Management System
Copyright (C) 1998-2016 by the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Here is a history of user visible changes to Mailman.
2.1.23 (xx-xxx-xxxx)
New Features
- RFC 2047 encoded headers are now decoded and re-encoded in the charset of
the list's preferred language for matching by header_filter_rules using
errors='backslashreplace' instead of the former errors='replace'. This
means that characters that can't be represented in the charset of the
list's preferred language will now be represented as '\uxxxx' escapes
rather than '?' enabling regexps to be constructed to match specific
characters or ranges. (LP: #558155)
- Thanks to Jim Popovitch REMOVE_DKIM_HEADERS can now be set to 3 to
preserve the original headers as X-Mailman-Original-... before removing
them.
- Several additional templates have been added to those that can be edited
via the web admin GUI. (LP: #1583387)
- SMTPDirect.py can now do SASL authentication and STARTTLS security when
connecting to the outgoiung MTA. Associated with this are new
Defaults.py/mm_cfg.py settings SMTP_AUTH, SMTP_USER, SMTP_PASSWD and
SMTP_USE_TLS. (LP: #558281)
- There is a new Defaults.py/mm_cfg.py setting SMTPLIB_DEBUG_LEVEL which
can be set to 1 to enable verbose smtplib debugging to Mailman's error
log to help with debugging 'low level smtp failures'. (LP: #1573074)
- A list's nonmember_rejection_notice attribute will now be the default
rejection reason for a held non-member post in addition to it's prior
role as the reson for an automatically rejected non-member post.
(LP: #1572330)
i18n
- Japanese documentation in messages/ja has been updated by
Yasuhito FUTATSUKI.
Bug fixes and other patches
- Scrubber links in archives are now in the list's preferred_language
rather than the poster's language. (LP: #1586505)
- Improved logging of banned subscription and address change attempts.
(LP: #1582856)
- In rare circumstances a list can be removed while the admin or listinfo
CGI or bin/list_lists is running causing an uncaught MMUnknownListError
to be thrown. The exception is now caught and handled. (LP: #1582532)
- Set the Date: header in the wrapper message when from_is_list or
dmarc_moderation_action is Wrap Message. (LP: #1581215)
- A site can now set DMARC_ORGANIZATIONAL_DOMAIN_DATA_URL to None or the
null string if it wants to avoid using this. (LP: #1578450)
- The white space to the left of the admindb Logout link is no longer
part of the link. (LP: #1573623)
2.1.22 (17-Apr-2016)
i18n
- Fixed a typo in the German options.html template. (LP: #1562408)
- An error in the Brazilian Portugese translation of Quarterly has been
fixed thanks to Kleber A. Benatti.
- The Brazilian Portugese translation has been updated by Emerson Ribeiro
de Mello.
Bug fixes and other patches
- All addresses in data/virtual-mailman are now properly appended with
VIRTUAL_MAILMAN_LOCAL_DOMAIN and duplicates are not generated if the
site list is in a virtual domain. (LP: #1570630)
- DMARC mitigations will now find the From: domain to the right of the
rightmost '@' rather than the leftmost '@'. (LP: #1568445)
- DMARC mitigations for a sub-domain of an organizational domain will now
use the organizational domain's sp= policy if any. (LP: #1568398)
- Modified NewsRunner.py to ensure that messages gated to Usenet have a
non-blank Subject: header and when munging the Message-ID to add the
original to References: to help with threading. (LP: #557955)
- Fixed the pipermail archiver to do a better job of figuring the date of
a post when its Date: header is missing, unparseable or has an obviously
out of range date. This should only affect bin/arch as ArchRunner has
code to fix dates at least if ARCHIVER_CLOBBER_DATE_POLICY has not been
set to 0 in mm_cfg.py. If posts have been added in the past to a list's
archive using bin/arch and an imported mbox, running bin/arch again could
result is some of those posts being archived with a different date.
(LP: #1555798)
- Fixed an issue with CommandRunner shunting a malformed message with a
null byte in the body. (LP: #1553888)
- Don't collapse multipart with a single sub-part inside multipart/signed
parts. (LP: #1551075)
2.1.21 (28-Feb-2016)
New Features
- There is a new dmarc_none_moderation_action list setting and a
DEFAULT_DMARC_NONE_MODERATION_ACTION mm_cfg.py setting to optionally
apply Munge From or Wrap Message actions to posts From: domains that
publish DMARC p=none. The intent is to eliminate failure reports to
the domain owner for messages that would be munged or wrapped if the
domain published a stronger DMARC policy. See the descriptions in
Defaults.py, the web UI and the bug report for more. (LP: #1539384)
- Thanks to Jim Popovitch there is now a feature to automatically turn
on moderation for a malicious list member who attempts to flood a list
with spam. See the details for the Privacy options ... -> Sender
filters -> member_verbosity_threshold and member_verbosity_interval
settings in the web admin UI and the documentation in Defaults.py for
the DEFAULT_MEMBER_VERBOSITY_* and VERBOSE_CLEAN_LIMIT settings for
information.
- bin/list_members now has options to display all moderated or all
non-moderated members.
- There is now a mm_cfg.py setting GLOBAL_BAN_LIST which is like the
individual list's ban_list but applies globally to all subscribe
requests. See the description in Defaults.py for more details.
i18n
- The Japanese translation has been updated by Yasuhito FUTATSUKI.
- Also thanks to Miloslav Trmac and Yasuhito FUTATSUKI, the l10n for
Mailman's bin/ commands has been fixed to display using the character
set of the user's work station even when Mailman's character set for
the language is different. Because this has not been tested over a
wide set of locales, there is an mm_cfg.py switch
DISABLE_COMMAND_LOCALE_CSET to disable it if it causes problems.
(LP: #558167)
- The Polish translation has been updated by Stefan Plewako.
- The German translation has been updated by Mirian Margiani and
Bernhard Schmidt.
- The Russian translation has been updated by Danil Smirnov.
- Several Galician templates that were improperly encoded as iso-8859-1
have been fixed. (LP: #1532504)
- The Brazilian Portugese translation has been updated by Emerson Ribeiro
de Mello.
Bug fixes and other patches
- If DMARC lookup fails to find a policy, also try the Organizational
Domain. Associated with this is a new mm_cfg.py setting
DMARC_ORGANIZATIONAL_DOMAIN_DATA_URL which sets the URL used to
retrieve the data for the algorithm that computes the Organizational
Domain. See https://publicsuffix.org/list/ for info. (LP: #1549420)
- Modified contrib/mmdsr to correctly report No such list names that
contain ".
- User's "Acknowledge" option will now be honored for posts to anonymous
lists. (LP: #1546679)
- Fixed a typo in the Non-digest options regular_exclude_ignore
description thanks to Yasuhito FUTATSUKI.
- DEFAULT_PASS_MIME_TYPES has been changed to accept text/plain sub-parts
from message/rfc822 parts and multipart parts other than mixed and
alternative and also accept pgp signatures. This only applies to newly
created lists and other than pgp signatures, still only accepts
text/plain. (LP: #1517446)
- Modified contrib/mmdsr to report held and banned subscriptions and DMARC
lookups in their own categories.
- Fixed a bug that could create a garbled From: header with certain DMARC
mitigation actions. (LP: #1536816)
- Treat a poster's address which matches an equivalent_domains address as
a list member for the regular_exclude_ignore check. (LP: #1526550)
- Fixed an issue that sometimes left no white space following
subject_prefix. (LP: #1525954)
- Vette log entries for banned subscriptions now include the source of
the request if available. (LP: #1525733)
- Submitting the user options form for a user who was asynchronously
unsubscribed would throw an uncaught NotAMemberError. (LP: #1523273)
- It was possible under some circumstances for a message to be shunted
after a handler rejected or discarded it, and the handler would be
skipped upon unshunting and the message accepted. (LP: #1519062)
- Posts gated to usenet will no longer have other than the target group
in the Newsgroups: header. (LP: #1512866)
- Invalid regexps in *_these_nonmembers, subscribe_auto_approval and
ban_list are now logged. (LP: #1507241)
- Refactored the GetPattern list method to simplify extending @listname
syntax to new attributes in the future. Changed Moderate.py to use the
GetPattern method to process the *_these_nonmembers lists.
- Changed CookHeaders to default to using space rather than tab as
continuation_ws when folding headers. (LP: #1505878)
- Fixed the 'pidfile' path in the sample init.d script. (LP: #1503422)
- Subject prefixing could fail to collapse multiple 'Re:' in an incomming
message if they all came after the list's subject_prefix. This is now
fixed. (LP: #1496620)
- Defended against a user submitting URLs with query fragments or POST
data containing multiple occurrences of the same variable.
(LP: #1496632)
- Fixed bin/mailmanctl to check its effective rather than real uid.
(LP: #1491187)
- Fixed cron/gate_news to catch EOFError on opening the newsgroup.
(LP: #1486263)
- Fixed a bug where a delayed probe bounce can throw an AttributeError.
(LP: #1482940)
- If a list is not digestable an the user is not currently set to
receive digests, the digest options will not be shown on the user's
options page. (LP: #1476298)
- Improved identification of remote clients for logging and subscribe
form checking in cases where access is via a proxy server. Thanks to
Jim Popovitch. Also updated contrib/mmdsr for log change.
- Fixed an issue with shunted messages on a list where the charset for
the list's preferred_language had been changed from iso-8859-1 to
utf-8 without recoding the list's description. (LP: #1462755)
- Mailman-Postfix integration will now add mailman@domain entries in
data/virtual-mailman for each domain in POSTFIX_STYLE_VIRTUAL_DOMAINS
which is a host_name of a list. This is so the addresses which are
exposed on admin and listinfo overview pages of virtual domains will
be deliverable. (LP: #1459236)
- The vette log entry for DMARC policy hits now contains the list name.
(LP: #1450826)
- If SUBSCRIBE_FORM_SECRET is enabled and a user's network has a load
balancer or similar in use the POSTing IP might not exactly match the
GETting IP. This is now accounted for by not requiring the last
octet (16 bits for ipV6) to match. (LP: #1447445)
- DKIM-Signature:, DomainKey-Signature: and Authentication-Results:
headers are now removed by default from posts to anonymous lists.
(LP: #1444673)
- The list admin web UI Mambership List search function often doesn't
return correct results for search strings (regexps) that contain
non-ascii characters. This is partially fixed. (LP: #1442298)
2.1.20 (31-Mar-2015)
Security
- A path traversal vulnerability has been discovered and fixed. This
vulnerability is only exploitable by a local user on a Mailman server
where the suggested Exim transport, the Postfix postfix_to_mailman.py
transport or some other programmatic MTA delivery not using aliases
is employed. CVE-2015-2775 (LP: #1437145)
New Features
- There is a new Address Change sub-section in the web admin Membership
Management section to allow a list admin to change a list member's
address in one step rather than adding the new address, copying settings
and deleting the old address. (LP: #266809)
i18n
- The Russian translation has been updated by Danil Smirnov.
- The Polish translation has been updated by Stefan Plewako.
Bug fixes and other patches
- A LookupError in SpamDetect on a message with RFC 2047 encoded headers
in an unknown character set is fixed. (LP: #1427389)
- Fixed a bug in CommandRunner that could process the second word of a
body line as a command word and a case sensitivity in commands in
Subject: with an Re: prefix. (LP: #1426829)
- Fixed a bug in CommandRunner that threw an uncaught KeyError if
the input to the list-request address contained a command word
terminated by a period. (LP: #1426825)
2.2 Branch Backports (released in conjunction with 2.1.19)
The following New Features and Bug Fixes have been in an "unofficial,
never to be released" Mailman 2.2 branch for several years. Until now,
they were never implemented on the official 2.1 branch because of their
i18n impacts. Given that there have been a number of i18n impacting
changes due to DMARC mitigations in the last few releases, it has been
decided to backport these as well.
All of these changes have been running in production on several lists
for years without problems other than untranslated strings, so they should
be reasonably "bug free".
New Features
- There is a new list attribute 'subscribe_auto_approval' which is a list
of email addresses and regular expressions matching email addresses
whose subscriptions are exempt from admin approval. (LP: #266609)
- Confirmed member change of address is logged in the 'subscribe' log,
and if admin_notify_mchanges is true, a notice is sent to the list
owner using a new adminaddrchgack.txt template.
- Added an 'automate' option to bin/newlist to send the notice to the
admin without the prompt.
- The processing of Topics regular expressions has changed. Previously the
Topics regexp was compiled in verbose mode but not documented as such
which caused some confusion. Also, the documentation indicated that
topic keywords could be entered one per line, but these entries were not
handled properly. Topics regexps are now compiled in non-verbose mode
and multi-line entries are 'ored'. Existing Topics regexps will be
converted when the list is updated so they will continue to work.
- Added real name display to the web roster. (LP: #266754)
Bug fixes and other patches
- Changed the response to an invalid confirmation to be more generic.
Not all confirmations are subscription requests.
- Changed the default nonmember_rejection_notice to be more user friendly.
(LP: #418728)
- Added "If you are a list member" qualification to some messages from the
options login page. (LP: #266442)
- Changed the 'Approve' wording in the admindbdetails.html template to
'Accept/Approve' for better agreement with the button labels.
- Added '(by thread)' to the previous and next message links in the
archive to emphasize that even if you got to the message from a
subject, date or author index, previous and next are still by thread.
2.1.19 (28-Feb-2015)
New Features
- The subscribe_auto_approval feature backported from the 2.2 branch and
described above has been enhanced to accept entries of the form
@listname to auto approve members of another list. (LP: #1417093)
- There is a new list attribute dmarc_wrapped_message_text and a
DEFAULT_DMARC_WRAPPED_MESSAGE_TEXT setting to set the default for new
lists. This text is added to a message which is wrapped because of
dmarc_moderation_action in a separate text/plain part that precedes the
message/rfc822 part containing the original message. It can be used to
provide an explanation of why the message was wrapped or similar info.
- There is a new list attribute equivalent_domains and a
DEFAULT_EQUIVALENT_DOMAINS setting to set the default for new lists which
in turn defaults to the empty string. This provides a way to specify one
or more groups of domains, e.g., mac.com, me.com, icloud.com, which are
considered equivalent for validating list membership for posting and
moderation purposes.
- There is a new WEB_HEAD_ADD setting to specify text to be added to the
<HEAD> section of Mailman's internally generated web pages. This doesn't
apply to pages built from templates, but in those cases, custom templates
can be created. (LP: #1409396)
- There is a new DEFAULT_SUBSCRIBE_OR_INVITE setting. Set this to Yes
to make the default selection on the admin Mass Subscriptions page
Invite rather than Subscribe. (LP: #1404511)
- There is a new list attribute in the Bounce processing section.
bounce_notify_owner_on_bounce_increment if set to Yes will cause
Mailman to notify the list owner on every bounce that increments a
list member's score but doesn't result in a probe or disable. There
is a new configuration setting setting
DEFAULT_BOUNCE_NOTIFY_OWNER_ON_BOUNCE_INCREMENT to set the default
for new lists. This in turn defaults to No. (LP: #1382150)
Changed behavior
- Mailman's log files, request.pck files and heldmsg-* files are no
longer created world readable to protect against access by untrusted
local users. Note that permissions on existing log files won't be
changed so if you are concerned about this and don't rotate logs or
have a logrotate process that creates new log files instead of letting
Mailman create them, you will need to address that. (LP: #1327404)
Other changes
- The Python Powered logo image has been replaced in the misc/ directory
in the source distribution. Depending on how you've installed these
images, you may need to copy PythonPowered.png from the misc/ directory
in the source or from the $prefix/icons/ installed directory to another
location for your web server. (LP: #1408575)
i18n
- The Polish translation has been updated by Stefan Plewako.
- The Interlingua translation has been updated by Martijn Dekker.
- The Japanese message catalog has been updated by SATOH Fumiyasu.
- Mailman's character set for Romanian has been changed from iso-8859-2
to utf-8 and the templates and messages recoded. This change will
require running 'bin/arch --wipe' on any existing Romanian language
lists in order to recode the list's archives, and will require recoding
any edited templates in lists/LISTNAME/ro/*, templates/DOMAIN/ro/* and
templates/site/ro/*. It may also require recoding any existing
iso-8859-2 text in list attributes. (LP: #1418735)
- Mailman's character set for Russian has been changed from koi8-r to
utf-8 and the templates and messages recoded. This change will
require running 'bin/arch --wipe' on any existing Russian language
lists in order to recode the list's archives, and will require recoding
any edited templates in lists/LISTNAME/ru/*, templates/DOMAIN/ru/* and
templates/site/ru/*. It may also require recoding any existing koi8-r
text in list attributes. (LP: #1418448)
- Mailman's versions.py has been augmented to help with the above two
character set changes. The first time a list with preferred_language
of Romanian or Russian is accessed or upon upgrade to this release,
any list attributes which have string values such as description, info,
welcome_msg, etc. that appear to be in the old character set will be
converted to utf-8. This is done recursively for the values (but not
the keys) of dictionary attributes and the elements of list and tuple
attributes.
- The Russian message catalog and templates have been further updated by
Danil Smirnov.
- The Romanian message catalog has been updated. (LP: #1415489)
- The Russian templates have been updated by Danil Smirnov. (LP: #1403462)
- The Japanese translation has been updated by SATOH Fumiyasu.
(LP: #1402989)
- A minor change in the French translation of a listinfo subscribe form
message has been made. (LP: #1331194)
Bug fixes and other patches
- Because of privacy concerns with the 2.2 backport adding real name to
list rosters, this is controlled by a new ROSTER_DISPLAY_REALNAME
setting that defaults to No. You may wish to set this to Yes in
mm_cfg.py.
- Organization: headers are now unconditionally removed from posts to
anonymous lists. Regexps in ANONYMOUS_LIST_KEEP_HEADERS weren't kept
if the regexp included the trailing ':'. This is fixed too.
(LP: #1419132)
- The admindb interface has been fixed so the the detail message body
display doesn't lose part of a multi-byte character, and characters which
are invalid in the message's charset are replaced rather than the whole
body not being converted to the display charset. (LP: #1415406)
- Fixed a bug in bin/rmlist that would throw an exception or just fail to
remove held message files for a list with regexp special characters in
its name. (LP:#1414864)
- When applying DMARC mitigations, CookHeaders now adds the original From:
to Cc: rather than Reply-To: in some cases to make MUA 'reply' and
'reply all' more consistent with the non-DMARC cases. (LP: #1407098)
- The Subject: of the list welcome message wasn't always in the user's
preferred language. Fixed. (LP: #1400988)
- Accept email command in Subject: prefixed with Re: or similar with no
intervening space. (LP: #1400200)
- Fixed a UnicodeDecodeError that could occur in the web admin interface
if 'text' valued attributes have unicode values. (LP: #1397170)
- We now catch the NotAMemberError exception thrown if an authenticated
unsubscribe is submitted from the user options page for a nonmember.
(LP: #1390653)
- Fixed an archiving bug that would cause messages with 'Subject: Re:'
only to be indexed in the archives without a link to the message.
(LP: #1388614)
- The vette log entry for a message discarded by a handler now includes
the list name and the name of the handler. (LP: #558096)
- The options CGI now rejects all but HTTP GET and POST requests.
(LP: #1372199)
- A list's poster password will now be accepted on an Urgent: header.
(LP: #1371678)
- Fixed a bug which caused a setting of 2 for REMOVE_DKIM_HEADERS to be
ignored. (LP: #1363278)
- Renamed messages/sr/readme.sr to README.sr. (LP: #1360616)
- Moved the dmarc_moderation_action checks from the Moderate handler to
the SpamDetect handler so that the Reject and Discard actions will be
done before the message might be held by header_filter_rules, and the
Wrap Message and Munge From actions will be done on messages held by
header_filter_rules if the message is approved. (LP: #1334450)
- <label> tags have been added around most check boxes and radio buttons
and their text labels in the admin and admindb web GUI so they can be
(de)selected by clicking the text. (LP: #266391)
- If checking DNS for dmarc_moderation_action and DNS lookup is not
available, log it. (LP: #1324541)
- Handle missing From: header addresses for DMARC mitigation actions.
(LP: #1318025)
2.1.18-1 (06-May-2014)
Bug fixes and other patches
- A critical incompatibility between the DMARC Wrap Message action and
Python versions older than 2.6.x for some x <= 5 existed and caused
Wrapped message to be shunted. This is fixed. (LP: #1316682)
- Sender: headers are no longer removed in from_is_list Munge From
actions. (LP: #1315970)
2.1.18 (03-May-2014)
Acknowledgements
- Thanks to Jim Popovitch and Phil Pennock for the branch that formed the
basis of the dmarc_moderation_action feature.
- Thanks to Franck Martin et al for the branch that formed the basis of
the from_is_list feature.
Dependencies
- There is a new dependency associated with the new Privacy options ->
Sender filters -> dmarc_moderation_action feature discussed below.
This requires that the dnspython <http://www.dnspython.org/> package
be available in Python. This package can be downloaded from the above
site or from the CheeseShop <https://pypi.python.org/pypi/dnspython/>
or installed with pip.
New Features
- The from_is_list feature introduced in 2.1.16 is now unconditionally
available to list owners. There is also, a new Privacy options ->
Sender filters -> dmarc_moderation_action feature which applies to list
messages where the From: address is in a domain which publishes a DMARC
policy of reject or possibly quarantine. This is a list setting with
values of Accept, Wrap Message, Munge From, Reject or Discard. There is
a new DEFAULT_DMARC_MODERATION_ACTION configuration setting to set the
default for this, and the list admin UI is not able to set an action
which is 'less' than the default. The prior ALLOW_FROM_IS_LIST setting
has been removed and is effectively always Yes. There is a new
dmarc_quarantine_moderation_action list setting with default set by a
new DEFAULT_DMARC_QUARANTINE_MODERATION_ACTION configuration setting
which in turn defaults to Yes. The list setting can be set to No to
exclude domains with DMARC policy of quarantine from
dmarc_moderation_action.
dmarc_moderation_action and from_is_list interact in the following way.
If the message is From: a domain to which dmarc_moderation_action applies
and if dmarc_moderation_action is other than Accept,
dmarc_moderation_action applies to that message. Otherwise the
from_is_list action applies.
Also associated with dmarc_moderation_action are configuration settings
DMARC_RESOLVER_TIMEOUT and DMARC_RESOLVER_LIFETIME. These are described
in more detail in Defaults.py. There are also new vette log entries
written when dmarc_moderation_action is found to apply to a post.
i18n
- Added missing <mm-digest-question-start> tag to French listinfo template.
(LP: #1275964)
Bug Fixes and other patches
- Removed HTML tags from the title of a couple of rmlist.py pages because
browsers don't render tags in the title. (LP: #265848)
- Most Mailman generated notices to list owners and moderators are now
sent as Precedence: list instead of bulk. (LP: #1313146)
- The Reply-To: munging options weren't honored if there was no
from_is_list action. (LP: #1313010)
- Changed from_is_list actions to insert the list address in Cc: if the
list is fully personalized. Otherwise, the list address is only in
From: and Reply-To: overrides it. (LP: #1312970)
- Fixed the Munge From action to only Munge the From: and/or Reply-To: in
the outgoing message and not in archives, digests and messages sent via
the usenet gateway. (LP: #1311431)
- Fixed a long standing issue in which a notice sent to a user whose
language is other than that of the list can cause subsequent things
which should be in the list's language to be in the user's language
instead. (LP: #1308655)
- Fixed the admin Membership List so a search string if any is not lost
when visiting subsequent fragments of a chunked list. (LP: #1307454)
- For from_is_list feature, use email address from original From: if
original From: has no display name and strip domain part from resultant
names that look like email addresses. (LP: #1304511)
- Added the list name to the vette log "held message approved" entry.
(LP: 1295875)
- Added the CGI module name to various "No such list" error log entries.
(LP: 1295875)
- Modified contrib/mmdsr to report module name if present in "No such list
error log entries.
- Fixed a NameError exception in cron/nightly_gzip when it tries to print
the usage message. (LP: #1291038)
- Fixed a bug in ListAdmin._handlepost that would crash when trying to
preserve a held message for the site admin if HOLD_MESSAGES_AS_PICKLES
is False. (LP: #1282365)
- The from_is_list header munging feature introduced in Mailman 2.1.16 is
no longer erroneously applied to Mailman generated notices.
(LP: #1279667)
- Changed the message from the confirm CGI to not indicate approval is
required for an acceptance of an invitation. (LP: #1277744)
- Fixed POSTFIX_STYLE_VIRTUAL_DOMAINS to be case-insensitiive.
(LP: #1267003)
- Added recognition for another simple warning to bounce processing.
(LP: #1263247)
- Fixed a few failing tests in tests/test_handlers.py. (LP: #1262950)
- Fixed bin/arch to not create scrubbed attachments for messages skipped
when processing the --start= option. (LP: #1260883)
- Fixed email address validation to do a bit better in obscure cases.
(LP: #1258703)
- Fixed a bug which caused some authentication cookies to expire too soon
if AUTHENTICATION_COOKIE_LIFETIME is non-zero. (LP: #1257112)
- Fixed a possible TypeError in bin/sync_members introduced in 2.1.17.
(LP: #1243343)
Miscellaneous
- Added to the contrib directory, a script from Alain Williams to count
posts in a list's archive.
2.1.17 (23-Nov-2013)
New Features
- Handling of posts gated from usenet to a list via the Mail <-> News
gateway is changed. Formerly, no list membership, moderation or
*_these_nonmembers checks were done. Now, if the sender of the usenet
post is a moderated member or a nonmember matching a *_these_nonmembers
filter, those checks will be done and actions applied. Nonmember posts
from senders not matching a *_these_nonmembers filter are still accepted
as before. (LP: #1252575)
- There is a new mm_cfg.py setting ANONYMOUS_LIST_KEEP_HEADERS. Since it
is not possible to know which non-standard headers in a message might
reveal sender information, we now remove all headers from incoming posts
to anonymous lists except those which match regular expressions in this
list. The default setting keeps non X- headers except those known to
reveal sender information, Mailman added X- headers and x-Spam- headers.
See the description in Defaults.py for more information. (LP: #1246039)
i18n
- The Japanese message catalog has been updated by SATOH Fumiyasu.
(LP: #1248855)
Bug Fixes and other patches
- Added a reopen command to the sample init.d script in misc/mailman.in.
(LP: #1251917)
- Fixed a misspelling in Tagger.py causing an "unexpected keyword argument
'Delete'" exception. (LP: #1251495)
- Fixed contrib/qmail-to-mailman.py to work with a user other than
'mailman' and to recognize more listname-* addresses. (LP: #412293)
- Fixed a possible UnicodeDecodeError in bin/sync_members. (LP: #1243343)
- Fixed Makefile to not include $DESTDIR in paths compiled into .pyc
files for traceback purposes. (LP: #1241770)
2.1.16 (16-Oct-2013)
New Features
- There is a new list attribute from_is_list to either rewrite the From:
header of posts replacing the posters address with that of the list or
wrap the message in an outer message From: the list for compatability
with DMARC and or ADSP. There is a new mm_cfg.py setting
DEFAULT_FROM_IS_LIST to control the default for new lists, and the
existing REMOVE_DKIM_HEADERS setting has been extended to allow removing
those headers only for certain from_is_list lists. This feature must
be enabled by setting ALLOW_FROM_IS_LIST to Yes in mm_cfg.py. See the
description of these settings in Defaults.py for more detail. This
feature is experimental in 2.1.16, and it is subject to change or to
become just one of the two methods in a subsequent release. People
interested in this feature are encouraged to try it and report their
experiences to the mailman-users@python.org list.
- There is a new DISPLAY_HELD_SUMMARY_SORT_BUTTONS setting which if set
in mm_cfg.py will display a set of radio buttons in the admindb held
message summary to select how the held messages are sorted and grouped
for display. The exact setting determines the default grouping and
sorting. See the description in Defaults.py for details.
- Setting digest_size_threshhold to zero now means no digests will be
sent based on size instead of a digest being sent with every post.
(LP: #558274)
- There is a new mm_cfg.py setting SUBSCRIBE_FORM_SECRET which will put
a dynamically generated, hidden hash in the listinfo subscribe form and
check it upon submission. Setting this will prevent automated processes
(bots) from successfully POSTing web subscribes without first retrieving
and parsing the form from the listinfo page. The form must also be
submitted no later than FORM_LIFETIME nor no earlier than
SUBSCRIBE_FORM_MIN_TIME after retrieval. Note that enabling this will
break any static subscribe forms on your site. See the description in
Defaults.py for more info. (LP: #1082746)
- add_members now has an option to add members with mail delivery disabled
by admin. (LP: #1070574)
- IncomingRunner now logs rejected messages to the vette log.
(LP: #1068837)
- The name of the mailmanctl master lock file is now congigurable via the
mm_cfg.py setting MASTER_LOCK_FILE. (LP: #1082308)
- list_lists now has an option to list only lists with public archives.
(LP: #1082711)
Contributed programs
- A new import_majordomo_into_mailman.pl script has been contributed by
Geoff Mayes. (LP: #1129742)
- A new "sitemap" bash script has been contributed by Tomasz Chmielewski
<mangoo@wpkg.org> to generate a sitemap.xml file of an installation's
public archives for submission to search engines.
i18n
- The Danish translation has been updated thanks to Tom Christensen.
- Fixed a string in the Czech message catalog. (LP: #1234567)
- A Farsi (Persian) translation has been added thanks to Javad Hoseini and
Mahyar Moghimi.
- Fixed several misspelled or garbled string replacements in the Spanish
message catalog. (LP: #1160138)
- pt_BR message catalog has two new and an updated message per Hugo Koji
Kobayashi. (LP: #1138578)
- German message catalog has been updated per Ralf Hildebrandt.
- Corrected typo in templates/it/private.html.
Bug Fixes and other patches
- Fixed a crash in SpamDetect.py which caused messages with unparseable
RFC 2047 encoded headers to be shunted. (LP: #1235101)
- Fixed cron/disabled to send a fresh cookie when notifying disabled
members. (LP: #1203200)
- Added "message_id" to the interpolation dictionary for the Article.html
template. (LP: #725498)
- Changed the admin GUI to report only the bad entries in a list of email
addresses if any are bad. (LP: #558253)
- Added logging for template errors in HyperArch.py. (LP: #558254)
- Added more explanation to the bad owner address message from
bin/newlist. (LP: #1200763)
- Fixed a bug causing the admin web interface to fail CSRF checking if
the list name contains a '+' character. (LP: #1190802)
- Fixed bin/mailmanctl -s to not remove the master lock if it can't be
determined to be truly stale. (LP: #1189558)
- It is no longer possible to add 'invalid' addresses to the ban_list
and the *_these_nonmembers filters from the check boxes on the admindb
interface. (LP: #1187201)
- Backported recognition for mail.ru DSNs and minor bug fixes from
lp:flufl.bounce. (LP: #1074592, LP: #1079249 and #1079254)
- Defended against buggy web servers that don't include an empty
QUERY_STRING in the CGI environment. (LP: #1160647)
- The Switchboard.finish() method now logs the text of the exception when
it fails to unlink/preserve a .bak file. (LP: #1165589)
- The pending (un)subscriptions waiting approval are now sorted by email
address in the admindb interface as intended. (LP: #1164160)
- The subscribe log entry for a bin/add_members subscribe now identifies
bin/add_members as the source. (LP: #1161642)
- Fixed a bug where the Subject: of the user notification of a
bin/remove_members unsubscribe was not in the user's language.
(LP: #1161445)
- Fixed a bug where BounceRunner could create and leave behind zero length
bounce-events files. (LP: #1161610)
- Added recognition for another Yahoo bounce format. (LP: #1157961)
- Changed configure's method for getting Python's include directory from
distutils.sysconfig.get_config_var('CONFINCLUDEPY') to
distutils.sysconfig.get_python_inc(). (LP: #1098162)
- Added an Auto-Generated: header to password reminders. (LP: #558240)
- Fixed a bug where non-ascii characters in the real name in a subscription
request could throw a UnicodeEncodeError upon subscription approval and
perhaps in other situations too. (LP: #1047100)
- The query fragments send_unsub_notifications_to_list_owner and
send_unsub_ack_to_this_batch will now assume default values if not set
in mass unsubscribe URLs. (LP: #1032378)
- Replaced utf-8 encoded characters in newly added German templates with
HTML entities. (LP: #1018208)
2.1.15 (13-Jun-2012)
Security
- Strengthened the validation of email addresses.
- An XSS vulnerability, CVE-2011-0707, has been fixed.
- The web admin interface has been hardened against CSRF attacks by adding
a hidden, encrypted token with a time stamp to form submissions and not
accepting authentication by cookie if the token is missing, invalid or
older than the new mm_cfg.py setting FORM_LIFETIME which defaults to one
hour. Posthumous thanks go to Tokio Kikuchi for this implementation
which is only one of his many contributions to Mailman prior to his
death from cancer on 14 January 2012.
New Features
- Added a password reminder button to the private archive login page.
Backported from the 2.2 branch.
- There is a new list attribute regular_exclude_ignore set from mm_cfg.py
DEFAULT_REGULAR_EXCLUDE_IGNORE. This defaults to True even though the
prior behavior is equivalent to False. A True setting will ignore an
exclude list if the poster is not a member of that list. The False
setting can result in list members not receiving posts if the nonmember
post is not accepted by the exclude list. Backported from 2.2 branch.
- Eliminated the list cache from the qrunners. Indirect self-references
caused lists to never be dropped from the cache which in turn caused
the qrunners to grow very large in installations with many lists or
multiple large lists. Bug #862683.
- The user options 'list my other subscriptions' page now indicates for
each list if the subscription is 'nomail' or 'digest'. Bug #793669.
- A new list poster password has been implemented. This password may only
be used in Approved: or X-Approved: headers for pre-approving posts.
Using this password for that purpose precludes compromise of a more
valuable password sent in plain text email. Bug #770581.
- A new mm_cfg.py setting AUTHENTICATION_COOKIE_LIFETIME has been added.
If this is set to a non-zero value, web authentication cookies will
expire that many seconds following their last use. Its default value is
zero to preserve current behavior.
- A new mm_cfg.py setting RESPONSE_INCLUDE_LEVEL has been added to control
how much of the original message is included in automatic responses to
email commands. The default is 2 to preserve the prior behavior of
including the full message. Setting this to 1 in mm_cfg.py will include
only the original headers, and 0 will include none of the original. It
is recommended to set this to 0 in mm_cfg.py to minimize the effects of
backscatter. Bug #265835.
- A new mm_cfg.py setting DEFAULT_RESPOND_TO_POST_REQUESTS has been added
to control the default for respond_to_post_requests for new lists. It is
set to Yes for backwards compatibility, but it is recommended that
serious consideration be given to setting it to No. Bug #266051.
- A new mm_cfg.py setting DISCARD_MESSAGE_WITH_NO_COMMAND has been added to
control whether a message to the -request address without any commands or
a message to -confirm whose To: address doesn't match VERP_CONFIRM_REGEXP
is responded to or just logged. It defaults to Yes which is different
from prior behavior. Bug #410236.
- Two new mm_cfg.py settings, BROKEN_BROWSER_WORKAROUND and
BROKEN_BROWSER_REPLACEMENTS, have been added to control escaping of
additional characters beyond the standard <, >, &, and " in the web UI.
See the documentation of these settings in Defaults.py. The default
values for these settings result in no change from the prior release.
Bug #774588.
i18n
- Added some missing German templates from Egon Frerich.
- Added Greek translation from Antonis Limperis.
- A few errors in the Basque translation are fixed. Bug #836861.
- Fixed a misspelling in the German invite.txt template. Bug #815444.
- Fixed a missing format character in the Spanish translation.
Bug #670988.
- Thanks go to the following for updating translations for the changes in
this release.
Thijs Kinkhorst
Stefan F�rster
Fabian Wenk
Bug Fixes and other patches
- Fixed a bug that could send an admin notice of a held subscription with
the subject in the user's preferred language instead of the list's
preferred language and possibly not properly RFC 2047 encoded.
(LP: #998949)
- Fixed a possible CPU bound loop in OutgoingRunner if the attempt to
Connect to the SMTP server throws a socket.error. (LP: #966531)
- Fixed a potential crash in the web UI if a language is removed from the
LC_DESCRIPTIONS dictionary. (LP: #966565)
- Added an Auto-Submitted: header to invitations and (un)subscription
confirmation requests to reduce the possibility of an autoresponder
confirming the request. (LP: #265831)
- Added javascript to the private.html and admlogin.html templates to
focus the cursor on the entry field. (LP: #266054)
- Added CPPFLAGS and LDFLAGS to src/Makefile to support their use.
(LP: #637652)
- Stopped removing the trailing slash from the List-Archive: header URL.
(LP: #964190)
- A configured version of contrib/courier-to-mailman.py is now created in
build/contrib/courier-to-mailman.py. (LP: #999250)
- Subscription disabled warnings are now sent without a Precedence:
header. Bug #808821.
- Backported 2.2 branch fix for a problem in SpamDetect.py that could
cause header_filter_rules to fail to match RFC 2047 encoded headers.
- Fix for bug #629738 could cause a crash in the admindb details display
if the decoded message body contained characters not in the character
set of the list's preferred language. Fixed. Bug #910440.
- Added recognition for another Qmail bounce format.
- Fixed an erroneous seek in the Mailman.Mailbox.Mailbox.AppendMessage
method that could cause a corrupt mailbox for files opened 'w+'.
Bug #901957.
- A held message with a null sender caused a crash in the admindb
interface. This is fixed by changing the sender to <missing>.
Bug #897103.
- Changed subject prefixing to allow for possible whitespace between an
'Re' and the following colon when determining how to add the prefix.
Bug #893290.
- Fixed a problem where topics regexps would not match RFC 2047 encoded
Keywords: and/or Subject: headers. Bug #891676.
- Fixed misleading response to an email approval of a held message.
Bug #889968.
- Added masthead.txt to the list of templates that can be edited via the
web admin interface. Bug #266805.
- Changed the way digest_footer is added to the RFC 1153 (plain) format
digest for RFC compliance. Bug #887610.
- Fixed cron/checkdbs to report unsubscriptions waiting approval.
Bug #873821.
- The fix for BUG #266220 (sf1181161) has been enhanced so that if there
is a pathological HTML part such that the Approved: password text isn't
found, but it is found after stripping out HTML tags, the post is
rejected with an informative message.
- A bug that would cause reset of any new_member_options bits other than
the four displayed as checkboxes on the list admin General Options page
whenever the page was updated or bin/config_list attempted to update
new_member_options has been fixed. Bug #865825.
- A problem with the logic avoiding unnecessarily reloading a current list
object from the config.pck arises if the list is updated by another
process within the same second that it was last read/written. That can
cause the reading of latest version of the list to be skipped. This has
been fixed. Bug #862675.
- Fixed bin/export.py to accept case insensitive password schemes.
Bug #833134.
- Added Tokio Kikuchi's icons to the misc/ and installed icons/
directories. Bug #782474.
- Fixed a problem which could result in raw, undecoded message bodies
appearing in plain digests and archives. Bug #787790.
- Fixed a problem in admindb.py where the character set for the display of
the message body excerpt was not correctly determined. Bug #779751.
- Prevented setting user passwords with leading/trailing whitespace.
Bug #778088.
- Mailman now sets the 'secure' flag in cookies set via https URLs.
Bug #770377.
- Added a logout link to the admindb interface and made both admin and
admindb logout effective for a site admin cookie if allowed.
Bug #769318.
- Replaced the old Mailman logos and icon that install to Mailman's icons
directory with the new ones. If you copy these elsewhere on your
server, please copy these new ones.
- Changed bin/genaliases to only call the POSTFIX_*_CMD commands once when
MTA = 'Postfix'. Bug #266408.
- Added a report of the affected members to the warnings issued when
setting a list with digest members digestable=No and when setting a list
with non-digest members nondigestable=no. Bug #761232.
- Fixed a problem where content filtering could remove the headers from
an attached message/rfc822 part if the message in that part is
multipart/alternative and collapse_alternatives is Yes. Bug #757062.
- Changed the subscribe CGI to strip leading and trailing whitespace from
the supplied email address. Bug #745432.
- Changed the maximum number of arguments for the who command to be
considered administrivia from 2 to 1 to help avoid false positives.
Bug #739524.
- Added the list name as 'display-name' in added Sender: headers to help
mitigate Outlook et al 'on behalf of' displays. Bug #736849.
- Fixed a typo in the usage() definition cron/gate_news. Bug #721015.
- Fixed an uncaught KeyError when poster tries to cancel a post which was
already handled. Bug #266224.
- Held message user notifications now come From: list-owner instead of
list-bounces. Bug #714424.
- Issue an HTTP 404 status for private archive file not found.
- @listname entries in *_these_nonmembers are no longer case sensitive.
Bug #705715.
- Changed bin/rmlist to also remove heldmsg files for the removed list and
fixed a problem with removal of stale locks for the list. Bug #700528.
- Fixed a bug where content filtering could leave a multipart message or
part with just one sub-part. These should be recast to just the sub-part.
Bug #701558.
- Fixed a bug that could erroneously handle posts from addresses in
*_these_nonmembers and send held/rejected notices to bogus addresses when
The From or other sender header is RFC 2047 encoded. Bug #702516.
- Updated contrib/mm-handler-2.1.10 to better handle lists with names that
look like admin addresses. Bug #697161.
- Added bounce recognition for a bogus Dovecot MDN. Bug #693134.
- Fixed a problem where an emailed command in the Subject: header with a
non-ascii l10n of an 'Re:' prefix is ignored. Bug #685261.
- Fixed a problem with approving a post by email when the body of the
approval mail is base64 encoded. Bug #677115.
- Fixed the host name in the From: address of the owner notification from
bin/add_members. Bug #666181.
2.1.14 (20-Sep-2010)
Security
- Two potential XSS vulnerabilities have been identified and fixed.
New Features
- A new feature for controlling the addition/replacement of the Sender:
header in outgoing mail has been implemented. This allows a list owner
to set include_sender_header on the list's General Options page in the
admin GUI. The default for this setting is Yes which preserves the prior
behavior of removing any pre-existing Sender: and setting it to the
list's -bounces address. Setting this to No stops Mailman from adding or
modifying the Sender: at all.
Additionally, there is a new Defaults.py/mm_cfg.py setting
ALLOW_SENDER_OVERRIDES which defaults to Yes but which can be set to No
to remove the include_sender_header setting from General Options, and
thus preserve the prior behavior completely.
- Bounce processing has been enhanced so that if a bounce is returned to a
list from a non-member who is a member of a regular_include_list, the
bounce will be processed as a bounce for the included list.
i18n
- Fixed a missing format character in the German bin/mailmanctl docstring.
- Updated Dutch translation from Jan Veuger.
- Updated Japanese Translation from Tokio Kikuchi.
- Updated Finnish translation from Joni T�yryl�.
- Made a few corrections to some Polish templates. Bug #566731.
- Made a minor change to the Chinese (China) message catalog. Bug #545772.
- Changed a few DOCTYPE directives in templates for compliance.
Bug #500952 and Bug #500955.
Bug Fixes and other patches
- Made minor wording improvements and typo corrections in some messages.
Bug #426979.
- Fixed i18n._() to catch exceptions due to bad formats. Bug #632660.
- Fixed admindb interface to decode base64 and quoted-printable encoded
message body excerpts for display. Bug #629738.
- Fixed web CGI tracebacks to properly report sys.path. Bug #615114.
- Changed the member options login page unsubscribe request to include the
requesters IP address in the confirmation request. Bug #610527.
- Changed fix_url to lock the list if not locked. Bug #610364.
- Made a minor change to the English subscribeack.txt (welcome message)
template to emphasize that a password is only required to unsubscribe
*without confirmation*.
- Fixed an issue in admindb that could result in a KeyError and "we hit a
bug" response when a moderator acts on a post that had been handled by
someone else after the first moderator had retrieved it. Bug #598671.
- Fixed a bug which would fail to show a list on the admin and listinfo
overview pages if its web_page_url contained a :port. Bug # 597741.
- Fixed bin/genaliases to not throw TypeError when MTA = None.
Bug #587657.
- Provided the ability to specify in mm_cfg.py a local domain (e.g.
'localhost') for the local addresses in the generated virtual-mailman
when MTA = 'Postfix'. See VIRTUAL_MAILMAN_LOCAL_DOMAIN in Defaults.py.
Bug #328907.
- Made a minor change to the removal of an Approved: pseudo-header from
a text/html alternative to allow for an inserted '\xA0' before the
password.
- Fixed Content Filtering collapse_alternatives to work on deeply nested
multipart/alternative parts. Bug #576675.
- We now accept/remove X-Approved: and X-Approve: headers in addition to
Approved: and Approve: for pre-approving posts. Bug #557750.
- Reordered the 'cancel' and 'subscribe' buttons on the subscription
confirmation web page so the default action upon 'enter' will be the
subscribe button in browsers that pick the first button. Bug #530654.
- Fixed a bug in the admindb interface that could apply a moderator
action to a message not displayed. Bug #533468.
- Added a traceback to the log message produced when processing the
digest.mbox throws an exception.
- Added a urlhost argument to the MailList.MailList.Create() method to
allow bin/newlist and the the create CGI to pass urlhost so the host
will be correct in the listinfo link on the emptyarchive page.
Bug #529100.
- Added the List-Post header to the default list of headers retained in
messages in the MIME digest. Bug #526143.
- When daemonizing mailmanctl, we now ensure terminal files are closed.
- Fixed a bug in pipermail archiving that caused fallback threading by
subject to fail. Bug #266572.
- We now give an HTTP 401 status for authentication failures from admin,
admindb, private, options and roster CGIs, and an HTTP 404 status from
all the CGIs for an invalid list name.
- Backported the listinfo template change from the 2.2 branch to fix
Bug #514050.
- Fixed a bug where going to an archives/private/list.mbox/list.mbox URL
would result in a munged URL if authentication was required. Bug #266164.
- Fixed a bug where check_perms would throw an OSError if an entry in
Mailman's lists/ directory was not a directory. Bug #265613.
- Fixed a bug where a message with an Approved: header held by a handler
that precedes Approve (SpamDetect by default) would not have the
Approved: header removed if the held message was approved. Bug #501739.
2.1.13 (22-Dec-2009)
i18n
- Updated Dutch message catalog from Jan Veuger.
- Added Asturian translation from Marcos Costales and the Asturian
Language Team.
Bug Fixes and other patches
- Added "white-space: pre-wrap" style for <pre> tag in archives.
Bug #266467.
- Added vette logging for rejected and discarded (un)subscribe requests.
- Fixed a bug in admindb.py that could erroneously discard an unsubscribe
request as a duplicate.
- Decoded RFC 2047 encoded message subjects for a few reports.
Bug #266428.
- Fixed the French, Spanish and Hebrew translations which improperly
translated the 'coding:' line in bin/config_list output.
- Fixed the auto-responder to treat messages to -confirm, -join, -leave,
-subscribe and -unsubscribe as requests rather than posts. Bug #427962.
- Configure/make no longer builds Japanese and Korean codecs in
pythonlib if Python already has them.
- Inadvertently setting a null site or list password allowed access
to a list's web admin interface without authentication. Fixed by
not accepting null passwords.
- Changed VERP_CONFIRM_REGEXP in Defaults.py to work if the replying
MUA folds the To: header and in cases where the list name includes '+'.
- Fixed some paths in contrib/check_perms_grsecurity.py. Bug #411192.
- Replies to commands sent to list-request now come From: list-owner
instead of list-bounces.
- Mailman no longer folds long sub-part headers in multipart messages.
In addition, Mailman no longer escapes From_ lines in the body of
messages sent to regular list members, although MTA's may do it anyway.
This is to avoid breaking signatures per Bug #265967.
- XSS protection in the web interface went too far in escaping HTML
entities. Fixed.
- Removed or anonymized additional headers in posts to anonymous lists.
- Fixed a bug that could cause incorrect threading of replies to archived
messages that arrive with timestamps in the same second.
- Scrubbed HTML attachments containing tab characters would get the tabs
replaced by a string of ' ' without a semicolon. Fixed.
- Caught a TypeError in content filtering, collapse alternatives that
occurred with a malformed message if a multipart/alternative part
wasn't multi-part. Reported in comments to bug #266230.
- Fixed a few things in bin/update:
- Changed some old messages for more current meaning.
- Fixed qfiles update to not lose metadata from 2.1.5+ format entries.
- Fixed 2.0.x template migration to not die if the templates/ tree
contains subdirectories from a version control system.
- Fixed a bug that would show a list on the admin and listinfo overview
pages if its web_page_url host contained the current host as a
substring. Bug #342162.
- Fixed a bug in Utils.canonstr() that would throw a UnicodeDecodeError
if the string contained an HTML entity > 255 and also characters in the
128-255 range. Bug #341594.
- Added recognition for more bounces.
- Updated contrib/mmdsr to report preserved messages and to use mktemp to
create temp files.
2.1.12 (23-Feb-2009)
Bug fixes and other patches
- Fix compatibility with Python 2.6.
- Fixed a bug in admin.py which would result in chunked pages of the
membership list for members whose address begins with a non-alphanumeric
character to not be visible or retrievable.
- Changed ListAdmin.py to make rejected post messages From: the -owner
address instead of the -bounces address.
- With MTA = 'Postfix', if the STANZA END for a list being removed is
missing or munged, the remainder of the aliases and/or virtual-mailman
file is lost. Fixed.
- Since Mailman 2.1.1, 2.0.x outstanding subscription and held message
requests have not been migrated properly. This is fixed.
Bug #266106 (sf998384).
- Changed cron/gate_news to continue processing the remaining lists on
certain errors that can be caused by configuration of a particular list.
Bug #265941 (sf775100).
- Fixed a bug in AvoidDuplicates.py that caused it to fail if the address
in the To: or Cc: header differed in case from the case-preserved member
address. Bug #297795.
- Fixed a problem in SecurityManager that caused it to not find the
cookie when CheckCookie was not given a user and the user in the cookie
had a %xx encoded character. Bug # 299220.
- Fixed a minor fromusenet reporting issue in the contributed mmdsr
script.
- Fixed a minor issue in cron/gate_news that could cause a list's
watermark to not be completely updated.
- Fixed an issue that prevented editing the options.html template from
the web admin interface. SF Bug #2164798.
- Fixed a problem in Decorate which could throw a TypeError on conversion
to unicode of a header/footer that was already unicode because of
interpolating a unicode value.
- Fixed an issue where list creation would report bad owner email
instead of bad listname when the list name had non-ascii characters.
SF Bug #2126489.
- Fixed an issue where in some circumstances HyperArch.py would translate
' at ' into the wrong language ultimately throwing a UnicodeDecodeError
when the translation was decoded with a different character set.
Bug #308152.
- Corrected a typo in Mailman/Gui/Privacy.py. Bug #309757.
- Changed the pattern used to recognize URLs in messages for the pipermail
archive in order to try to do a better job of making hyperlinks.
Bug #310124.
- Added missing --bare option to French translation of list_lists help.
Bug #312119.
- Fixed a long standing error that stopped relative hrefs from being
generated for links on Mailman's web pages.
- Changed the admindb interface so that when messages are rejected from
the summary page, the reject reason is the rejection message from the
Errors.HoldMessage subclass instead of the generic "No reason given".
- Fixed the admin Membership List Find member function so the 'letter'
links to a chunked result would still be limited to the Find member
search. SF patch #1532081.
- Changed scripts/driver to return a 405 status for non GET, POST, HEAD
methods. SF patch #1578756.
- Fixed a bug in admindb.py in the implementation of replacing "No Reason
Given" with the default rejection reason. Bug #325016.
- Changed Gui/Topics.py to validate regexps in VERBOSE mode. Bug #327008.
- Worked around a potential problem in HyperArch.py with unicode character
set arguments. Bug #328353.
- Recognize a couple more bounces.
- Fixed a bug introduced in 2.1.11 which would attempt to store bounce info
for a member just deleted if bounce_you_are_disabled_warnings is zero.
i18n
- Updated Dutch, Catalan and Polish translations.
Miscellaneous
- Added Lindsay Haisley's courier_to_mailman.py to the contrib directory.
- Added John Dennis' (RedHat) FHS patch to the contrib directory.
2.1.11 (30-Jun-2008)
New Features
- Added a new cron/cull_bad_shunt script to cull and optionally
archive old entries from the bad and shunt queues. This is controlled
by new Defaults.py/mm_cfg.py settings BAD_SHUNT_STALE_AFTER (default
7 days) and BAD_SHUNT_ARCHIVE_DIRECTORY (default None) which determine
how long to keep bad and shunt queue entries and optionally, where to
archive removed entries.
- Prepended list name to bounce log unrecognized bounce messages.
- Added a new Defaults.py|mm_cfg.py setting ACCEPTABLE_LISTNAME_CHARACTERS
with default value '[-+_.=a-z0-9]'. This Python regular expression
character class specifies the characters allowed in list names. The
motivation for this is the fact that previously, a list named, e.g.,
xxx&yyy could be created and MTA aliases generated that would cause
The MTA to execute yyy as a command. There is a possible security issue
here, but it is not believed to be exploitable in any meaningful way.
Bug fixes and other patches
- Changed the preservation of unparseable messages to be conditional on
the Defaults.py/mm_cfg.py setting of QRUNNER_SAVE_BAD_MESSAGES and
changed the queue directory in which messages are preserved from 'shunt'
to 'bad'.
- Fixed a bug introduced in 2.1.10 that caused some email subscribe
requests to be shunted (1966837).
- Fixed a problem with bin/update erroneously moving templates from
templates/xx to lists/xx if a list has the same name as a language
code. Also fixed the absolute path to lists/ (1418670 ).
- Changed Utils.ValidateEmail to not allow specials (particularly ':')
in unquoted local parts (1956393).
- Changed bin/update to remove .bak files erroneously left behind in
qfiles/*/ by a 2.1.9 bug.
- Added 's' to %(listname) in templates/ia/admlogin.html and
templates/sl/help.txt (1682990).
- Use newer template variable for site-owner address in
templates/ko/newlist.txt and templates/ru/newlist.txt (1578766).
- Corrections to Spanish translation submitted by Wikimedia Foundation
(1433262) and Debian.
- Corrections to German translation submitted by Ralf Doeblitz (916196).
- Correction to French translation submitted by Maxime Carron (1588617).
- Correction to Portuguese translation submitted by Gabriel P. Silva
(1733057).
- Add #! line to fblast.py test script (1578740).
- Fixed unescaped '%' in templates/nl/newlist.txt (1719017).
- Changed non-ascii characters in some templates/*/*.html files to HTML
entities.
- Fixed a problem in Decorate.py that could result in a multipart
message with no part headers for the original body part (1991348).
- Improved recognition of some bounce messages.
- Rearranged calls to the list setBounceInfo() method in Bouncer.py
to accommodate MemberAdaptors that store bounce info outside the
list instance.
- Fixed CookHeaders.py which in some cases with new style prefixing
would insert an extra space between the prefix and the subject.
- Changed OldStyleMemberships.py to remove the member from one_last_digest
when changing from regular to digest delivery to avoid the possibility
of a duplicate digest in some circumstances.
- Patched Danish message catalog for proper use of HTML entities per
Jonas Smedegaard (1999966).
- Improved bounce loop detection and handling in BounceRunner.py.
- Merged the Catalan i18n from the Mailman Catalan Translation Team.
- German translation updated by Peer Heinlein.
- Added check for gateway_to_news before holding for ModeratedNewsgroup.
- At some point, cron/senddigests and bin/update were inadvertently
'preconfigured'. This has been fixed.
- Brazilian Portuguese translation updated by Diego Francisco
de Gastal Morales.
- Added 'listname' to the replacements for the archidxfoot.html template.
Miscellaneous
- Brad Knowles' mailman daily status report script updated to 0.0.18.
2.1.10 (21-Apr-2008)
Security
- The 2.1.9 fixes for CVE-2006-3636 were not complete. In particular,
some potential cross-site scripting attacks were not detected in
editing templates and updating the list's info attribute via the web
admin interface. This has been assigned CVE-2008-0564 and has been
fixed. Thanks again to Moritz Naumann for assistance with this.
- There is a new mm_cfg.py/Defaults.py variable
OWNERS_CAN_CHANGE_MEMBER_PASSWORDS which controls whether the list
owner can change a member's password from the member's options page.
This defaults to No and should be changed to Yes only if list owners
are trusted to not change a member's password, log in as the member
and make global membership changes.
New Features
- Changed cmd_who.py to list all members if authorization is with the
list's admin or moderator password and to accept the password if the
roster is public. Also changed the web roster to show hidden members
when authorization is by site or list's admin or moderator password
(1587651).
- Added the ability to put a list name in accept_these_nonmembers
to accept posts from members of that list (1220144).
- Added a new 'sibling list' feature to exclude members of another list
from receiving a post from this list if the other list is in the To: or
Cc: of the post or to include members of the other list if that list is
not in the To: or Cc: of the post (Patch ID 1347962).
- Added the admin_member_chunksize attribute to the admin General Options
interface (Bug 1072002, Partial RFE 782436).
Internationalization
- Added the Hebrew translation from Dov Zamir. This includes addition of
a direction ('ltr', 'rtl') to the LC_DESCRIPTIONS table. The
add_language() function defaults direction to 'ltr' to not break
existing mm_cfg.py files.
- Added the Slovak translation from Martin Matuska.
- Added the Galician translation from Frco. Javier Rial Rodr�guez.
Bug fixes and other patches
- Added bounce recognition for several additional bounce formats.
- Fixed CommandRunner.py to decode a quoted-printable or base64 encoded
message part (1829061).
- Fixed Scrubber.py to avoid loss of an implicit text/plain message part
with no Content-* headers in a MIME multipart message (759841). Fixed
several other minor scrubber issues (1242450).
- Added Date and Message-ID headers to the confirm reply message that
Mailman adds to the admin notification (1471318).
- Fixed Cgi/options.py to not present the "empty" topic to user.
- Fixed Handlers/CalcRecips.py to not process topics if topics are
disabled for the list. This caused users who had previously subscribed
to topics and elected to not receive non-matching posts to receive no
messages after topics were disabled for the list.
- Fixed MaildirRunner.py to handle hyphenated list names.
- Fixed a bug in MimeDel.py (content filtering) which caused
*_filename_extensions to not match if the extension in the message was
not all lower case.
- Fixed versions.py to not call a non-existant method when converting held
posts from Mailman 1.0.x lists.
- Added a test to configure to detect a missing python-devel package on
some RedHat systems.
- Fixed bin/dumpdb to once again be able to dump marshals (broken since
2.1.5) (963137).
- Worked around a bug in the Python email library that could cause Mailman
to not get the correct value for the sender of a message from an RFC
2231 encoded header causing spurious held messages.
- Fixed bin/check_perms to detect certain missing permissions on the
archives/private/ and archives/private/<list>/database/ directories.
- Improved exception handling in cron/senddigests.
- Changed the admindb page to not show the "Discard all messages marked
Defer" checkbox when there are only (un)subscribes and no held messages.
Also added a separator and heading for "Held Messages" like the ones for
"Subscribe Requests" and "Unsubscribe Requests". Suppressed the
"Database Updated" message when coming from the login page. Also
removed the "Discard all messages marked Defer" checkbox from the
details page where it didn't work (1562922, 1000699).
- Fixed admin.py so null VARHELP category is handled (1573393).
- Fixed OldStyleMemberships.py to preserve delivery statuses BYADMIN
and BYUSER on a straight change of address (1642388). Also fixed a
bug that could result in a member key with uppercase in the domain.
- Fixed bin/withlist so that -r can take a full package path to a
callable.
- Removal of DomainKey/DKIM signatures is now controlled by Defaults.py
mm_cfg.py variable REMOVE_DKIM_HEADERS (default = No). Also, if
REMOVE_DKIM_HEADERS = Yes, an Authentication-Results: header will be
removed if present.
- The DeprecationWarning issued by Python 2.5 regarding string exceptions
is supressed.
- format=flowed and delsp=yes are now preserved for message bodies when
message headers/footers are added and attachments are scrubbed
(1495122).
- Queue runner processing is improved to log and preserve for analysis in
the shunt queue certain bad queue entries that were previously logged
but lost. Also, entries are preserved when an attempt to shunt throws
an exception (1656289).
- The admin Membership List pages have been changed in that the email
address which forms a part of the various CGI data keys is now
urllib.quote()ed. This allows changing options for and unsubbing an
address which contains a double-quote character, but it may require
changes to scripts that screen-scrape the web admin interface to
produce a membership list so they will report an unquoted address.
- The fix for bug 1181161 in 2.1.7 was incomplete. The Approve(d): line
wasn't always found in quoted-printable encoded parts and was never
found in base64 encoded parts. This is now fixed.
- Fixed a mail loop if a list owner puts the list's -bounces or -admin
address in the list's owner attribute (1834569).
- Fixed the mailto: link in archived messages to prefix the subject with
Re: and to put the correct message-id in In-Reply-To (1621278, 1834281).
- Coerced list name arguments to lower case in the change_pw, inject,
list_admins and list_owners command line tools (patch 1842412).
- Fixed cron/disabled to test if bounce info is stale before disabling
a member when the threshold has been reduced.
- It wasn't noted here, but in 2.1.9, queue runner processing was made
more robust by making backups of queue entries when they were dequeued
so they could be recovered in the event of a system failure. This
opened the possibility that if a message itself caused a runner to
crash, a loop could result that would endlessly reprocess the message.
This has now been fixed by adding a dequeue count to the entry and
moving the entry aside and logging the fact after the third dequeue of
the same entry.
- Fixed the command line scripts add_members, sync_members and
clone_member to properly handle banned addresses (1904737).
- Fixed bin/newlist to add the list's preferred language to the list's
available_languages if it is other than the server's default language
(1906368).
- Changed the first URL in the RFC 2369 List-Unsubscribe: header to go
to the options login page instead of the listinfo page.
- Changed the options login page to not issue the "No address given" error
when coming from the List-Unsubscribe and other direct links. Also
changed to remember the user's language selection when redisplaying the
page following an error.
- Changed cmd_subscribe.py to properly accept (no)digest without a
password and to recognize (no)digest and address= case insensitively.
- Fixed a problem where GuiBase._getValidValue() would truncate a
floating point Number type to an int if the value was a float instead
of a numeric string. This affected setting floating point values with
config_list.
Miscellaneous
- Brad Knowles' mailman daily status report script updated to 0.0.17.
- An updated mm-handler (mm-handler-2.1.10) that can help reduce
backscatter has been added to the contrib directory.
2.1.9 (12-Sep-2006)
Security
- A malicious user could visit a specially crafted URI and inject an
apparent log message into Mailman's error log which might induce an
unsuspecting administrator to visit a phishing site. This has been
blocked. Thanks to Moritz Naumann for its discovery.
- Fixed denial of service attack which can be caused by some
standards-breaking RFC 2231 formatted headers. CVE-2006-2941.
- Several cross-site scripting issues have been fixed. Thanks to Moritz
Naumann for their discovery. CVE-2006-3636
- Fixed an unexploitable format string vulnerability. Discovery and fix
by Karl Chen. Analysis of non-exploitability by Martin 'Joey' Schulze.
Also thanks go to Lionel Elie Mamane. CVE-2006-2191.
Internationalization
- New languages: Arabic, Vietnamese.
Bug fixes and other patches
- Fixed Decorate.py so that characters in message header/footer which
are not in the character set of the list's language are ignored rather
than causing shunted messages (1507248).
- Switchboard.py - Closed very tiny holes at the upper ends of queue
slices that could result in unprocessable queue entries. Improved FIFO
processing when two queue entries have the same timestamp.
2.1.8 (15-Apr-2006)
Security
- A cross-site scripting hole in the private archive script of 2.1.7
has been closed. Thanks to Moritz Naumann for its discovery.
Bug fixes and other patches
- Bouncers support added: 'unknown user', Microsoft SMTPSVC, Prodigy.net
and several others.
- Updated email library to 2.5.7 which will encode payload into qp/base64
upon setting. This enabled backing out the scrubber related patches
including 'X-Mailman-Scrubbed' header in 2.1.7.
- Fix SpamDetect.py potential hold/reject loop problem.
- A warning message from email package to the stderr can cause error
in Logging because stderr may be detached from the process during
the qrunner run. We chose not to output errors to stderr but to
the logs/error if the process is running under mailmanctl subprocess.
- DKIM header cleansing was separated from Cleanse.py and added to
-owner messages too.
- Fixes: Lose Topics when go directly to topics URL (1194419).
UnicodeError running bin/arch (1395683). edithtml.py missing import
(1400128). Bad escape in cleanarch. Wrong timezone in list archive
index pages (1433673). bin/arch fails with TypeError (1430236).
Subscription fails with some Language combinations (1435722).
Postfix delayed notification not recognized (863989). 2.1.7 (VERP)
mistakes delay notice for bounce (1421285). show_qfiles: 'str'
object has no attribute 'as_string' (1444447). Utils.get_domain()
wrong if VIRTUAL_HOST_OVERVIEW off (1275856).
Miscellaneous
- Brad Knowles' mailman daily status report script updated to 0.0.16.
2.1.7 (31-Dec-2005)
Security
- The fix for CAN-2005-0202 has been enhanced to issue an appropriate
message instead of just quietly dropping ./ and ../ from URLs.
- A note on CVE-2005-3573: Although the RFC2231 bug example in the CVE has
been solved in Mailman 2.1.6, there may be more cases where
ToDigest.send_digests() can block regular delivery. We put the
send_digests() calling part in a try/except clause and leave a message
in the error log if something happened in send_digests(). Daily call of
cron/senddigests will provide more detail to the site administrator.
- List administrators can no longer change the user's option/subscription
globally. Site admin can change these only if
mm_cfg.ALLOW_SITE_ADMIN_COOKIES is set to Yes.
- <script> tags are HTML-escaped in the edithtml CGI script.
- Since the probe message for disabled users may reach unintended
recipients, the password is excluded from sendProbe() and probe.txt.
Note that the default value of VERP_PROBE has been set to `No' from
2.1.6., thus this change doesn't affect the default behavior.
New Features
- Always remove DomainKey (and similar) headers from messages sent to the
list. (1287546)
- List owners can control the content filter behavior when collapsing
multipart/alternative parts to its first subpart. This allows the
option of letting the HTML part pass through after other content
filtering is done.
Internationalization
- New language: Interlingua.
Bug fixes and other patches
- Defaults.py.in: SCRUBBER_DONT_USE_ATTACHMENT_FILENAME is set to True for
safer operation.
- Fixed the bug where Scrubber.py munges quoted-printable by introducing
the 'X-Mailman-Scrubbed' header which marks that the payload is
scrubber-munged. The flag is referenced in ToDigest.py, ToArchive.py,
Decorate.py and Archiver. A similar problem in ToDigest.py where the
plain digest is generated is also fixed.
- Fixed Syslog.py to write quopri encoded messages when it fail to write
8-bit characters.
- Fixed MTA/Postfix.py to check aliases group permission in check_perms
and fixed mailman-install document on this matter (1378270).
- Fixed private.py to go to the original URL after authorization
(1080943).
- Fixed bounce log score messages to be more consistent.
- Fixed bin/remove_members to accept no arguments when both --fromall and
--file= options are specified.
- Changed cgi-bin and mail wrapper "group not found" error message to be
more descriptive of the actual problem.
- The list's ban_list now applies to address changes, admin mass
subscribes and invites, and to confirmations/approvals of address
changes, subscriptions and invitations.
- quoted-printable and base64 encoded parts are decoded before passing to
HTML_TO_PLAIN_TEXT_COMMAND (1367783).
- Approve: header is removed from posts, and treated the same as the
Approved: header. (1355707)
- Fixed the removal of the line following Approve[d]: line in body of
post. (1318883)
- The Approve[d]: <password> header is removed from all text/* parts in
addition the initial text/plain part. It must still be the first
non-blank line in the first text/plain part or it won't be found or
removed at all. (1181161)
- Posts are now logged in post log file with the true sender, not
listname-bounces. (1287921)
- Correctly initialize and remember the list's default_member_moderation
attribute in the web list creation page. (1263213)
- PEP263 charset is added to the config_list output. (1343100)
- Fixed header_filter_rules getting lost if accessed directly and
authentication was needed by login page. (1230865)
- Obscure email when the poster doesn't set full name in 'From:' header.
- Preambles and epilogues are taken into account when calculating message
sizes for holding purposes. (Mark Sapiro)
- Logging/Logger.py unicode transform option. (1235567)
- bin/update crashes with bogus files. (949117)
- Bugs and patches: 1212066/1301983 (Date header in create/remove notice)
2.1.6 (30-May-2005)
Security
- Critical security patch for path traversal vulnerability in private
archive script (CAN-2005-0202).
- Added the ability for Mailman generated passwords (both member and list
admin) to be more cryptographically secure. See new configuration
variables USER_FRIENDLY_PASSWORDS, MEMBER_PASSWORD_LENGTH, and
ADMIN_PASSWORD_LENGTH. Also added a new bin/withlist script called
reset_pw.py which can be used to reset all member passwords. Passwords
generated by Mailman are now 8 characters by default for members, and 10
characters for list administrators.
- A potential cross-site scripting hole in the driver script has been
closed. Thanks to Florian Weimer for its discovery. Also, turn
STEALTH_MODE on by default.
Internationalization
- Chinese languages are now supported. They have been moved from 'big5'
and 'gb' to 'zh_TW' and 'zh_CN' respectively for compliance to the IANA
spec. Note, however, that the character sets were changed from 'Big5'
or 'GB2312' to 'UTF-8' to cope with the insufficient codecs support in
Python 2.3 and earlier. You may have to install Chinese capable codecs
(like CJKCodecs) separately to handle the incoming messages which are in
local charsets, or upgrade your Python to 2.4 or newer.
Behavior or defaults changes
- VERP_PROBES is disabled by default.
- bin/withlist can be run without a list name, but only if -i is given.
Also, withlist puts the directory it's found in at the end of sys.path,
making it easier to run withlist scripts that live in $prefix/bin.
- bin/newlist grew two new options: -u/--urlhost and -e/--emailhost which
lets the user provide the web and email hostnames for the new mailing
list. This is a better way to specify the domain for the list, rather
than the old 'mylist@hostname' syntax (which is still supported for
backward compatibility, but deprecated).
Compatibility
- Python 2.4 compatibility issue: time.strftime() became strict about the
'day of year' range. (1078482)
New Features
- New feature: automatic discards of held messages. List owners can now
set how many days to hold the messages in the moderator request queue.
cron/checkdb will automatically discard old messages. See the
max_days_to_hold variable in the General Options and
DEFAULT_MAX_DAYS_TO_HOLD in Defaults.py. This defaults to 0
(i.e. disabled). (790494)
- New feature: subject_prefix can be configured to include a sequence
number which is taken from the post_id variable. Also, the prefix is
always put at the start of the subject, i.e. "[list-name] Re: original
subject", if mm_cfg.OLD_STYLE_PREFIXING is set No. The default style
is "Re: [list-name]" if numbering is not set, for backward compatibility.
If the list owner is using numbering feature by "%d" directive, the new
style, "[list-name 123] Re:", is always used.
- List owners can now cusomize the non-member rejection notice from
admin/<listname>/privacy/sender page. (1107169)
- Allow editing of the welcome message from the admin page (1085501).
- List owners can now use Scrubber to get the attachments scrubbed (held
in the web archive), if the site admin permits it in mm_cfg.py. New
variables introduced are SCRUBBER_DONT_USE_ATTACHMENT_FILENAME and
SCRUBBER_USE_ATTACHMENT_FILENAME_EXTENSION in Defaults.py for scrubber
behavior. (904850)
Documentation
- Most of the installation instructions have been moved to a latex
document. See doc/mailman-install/index.html for details.
Bug fixes and other patches
- Mail-to-news gateway now strips subject prefix off from a response
by a mail user if news_prefix_subject_too is not set.
- Date and Message-Id headers are added for digests. (1116952)
- Improved mail address sanity check. (1030228)
- SpamDetect.py now checks attachment header. (1026977)
- Filter attachments by filename extensions. (1027882)
- Bugs and patches: 955381 (older Python compatibility), 1020102/1013079/
1020013 (fix spam filter removed), 665569 (newer Postfix bounce
detection), 970383 (moderator -1 admin requests pending), 873035
(subject handling in -request mail), 799166/946554 (makefile
compatibility), 872068 (add header/footer via unicode), 1032434
(KNOWN_SPAMMERS check for multi-header), 1025372 (empty Cc:), 789015
(fix pipermail URL), 948152 (Out of date link on Docs), 1099138
(Scrubber.py breaks on None part), 1099840/1099840 (deprecated %
insertion), 880073/933762 (List-ID RFC compliance), 1090439 (passwd
reminder shunted), 1112349 (case insensitivity in acceptable_aliases),
1117618 (Don't Cc for personalized anonymous list), 1190404 (wrong
permission after editing html)
2.1.5 (15-May-2004)
- The admindb page has a checkbox that allows you to discard all held
messages that are marked Defer. On heavy lists with lots of spam holds,
this makes clearing them much faster.
- The qrunner system has changed to use only one file per message.
However the configuration variable METADATA_FORMAT has been removed, and
support for SAVE_MSGS_AS_PICKLES has been changed. The latter no longer
writes messages as plain text. Instead, they are stored as pickles of
plain strings, using the text pickle format. This still makes them
non-binary files readable and editable by humans.
bin/dumpdb also works differently. It will print out the entire pickle
file (with more verbosity) and if used with 'python -i', it binds msg to
a list of all objects found in the pickle file.
Removed from Defaults.py: PENDINGDB_LOCK_TIMEOUT,
PENDINGDB_LOCK_ATTEMPTS, METAFMT_MARSHAL, METAFMT_BSDDB_NATIVE,
METAFMT_ASCII, METADATA_FORMAT
- The bounce processor has been redesigned so that now when an address's
bounce score reaches the threshold, that address will be sent a probe
message. Only if the probe bounces will the address be disabled. The
score is reset to zero when the probe is sent. Also, bounce events are
now kept in an event file instead of in memory. This should help
contain the bloat of the BounceRunner.
New supporting variables in Defaults.py: VERP_PROBE_FORMAT,
VERP_PROBE_REGEXP
REGISTER_BOUNCES_EVERY is promoted to a Defaults.py variable.
- The pending database has been changed from a global pickle file, to a
unique pickle file per mailing list.
- The 'request' database file has changed from a marshal, to the more
secure pickle format.
- Disallow multiple password retrievals.
- SF patch #810675 which adds a "Discard all messages marked Defer" button
for faster admindb maintenance.
- The email package is updated to version 2.5.5.
- New language: Turkish.
- Bugs and patches: 869644, 869647 (NotAMemberError for old cookie data),
878087 (bug in Slovenian catalog), 899263 (ignore duplicate pending
ids), 810675 (discard all defers button)
2.1.4 (31-Dec-2003)
- Close some cross-site scripting vulnerabilities in the admin pages
(CAN-2003-0965).
- New languages: Catalan, Croatian, Romanian, Slovenian.
- New mm_cfg.py/Defaults.py variable PUBLIC_MBOX which allows the site
administrator to disable public access to all the raw list mbox files
(this is not a per-list configuration).
- Expanded header filter rules under Privacy -> Spam Filters. Now you can
specify regular expression matches against any header, with specific
actions tied to those matches.
- Rework the SMTP error handling in SMTPDirect.py to avoid scoring bounces
for all recipients when a permanent error code is returned by the mail
server (e.g. because of content restrictions).
- Promoted SYNC_AFTER_WRITE to a Default.py/mm_cfg.py variable and
make it control syncing on the config.pck file. Also, we always flush
and sync message files.
- Reduce archive bloat by not storing the HTML body of Article objects in
the Pipermail database. A new script bin/rb-archfix was added to clean
up older archives.
- Proper RFC quoting for List-ID descriptions.
- PKGDIR can be passed to the make command in order to specify a different
directory to unpack the distutils packages in misc. (SF bug 784700).
- Improved logging of the origin of subscription requests.
- Bugs and patches: 832748 (unsubscribe_policy ignored for unsub button on
member login page), 846681 (bounce disabled cookie was always out of
date), 835870 (check VIRTUAL_HOST_OVERVIEW on through the web list
creation), 835036 (global address change when the new address is already
a member of one of the lists), 833384 (incorrect admin password on a
hold message confirmation attachment would discard the message), 835012
(fix permission on empty archive index), 816410 (confirmation page
consistency), 834486 (catch empty charsets in the scrubber), 777444 (set
the process's supplemental groups if possible), 860135 (ignore
DiscardMessage exceptions during digest scrubbing), 828811 (reduce
process size for list and admin overviews), 864674/864676 (problems
accessing private archives and rosters with admin password), 865661
(Tokio Kikuchi's i18n patches), 862906 (unicode prefix leak in admindb),
841445 (setting new_member_options via config_list), n/a (fixed email
command 'set delivery')
2.1.3 (28-Sep-2003)
Performance, Reliability, Security
- Closed a cross-site scripting exploit in the create cgi script.
- Improvements in the performance of the bounce processor.
Now, instead of processing each bounce immediately (which
can cause severe lock contention), bounce events are queued.
Every 15 minutes by default, the queued bounce events are
processed en masse, on a list-per-list basis, so that each
list only needs to be locked once.
- When some or all of a message's recipients have temporary
delivery failures, the message is moved to a "retry" queue.
This queue wakes up occasionally and moves the file back to
the outgoing queue for attempted redelivery. This should
fix most observed OutgoingRunner 100% cpu consumption,
especially for bounces to local recipients when using the
Postfix MTA.
- Optional support for fsync()'ing qfile data after writing.
Under some catastrophic system failures (e.g. power lose),
it would be possible to lose messages because the data
wasn't sync'd to disk. By setting SYNC_AFTER_WRITE to True
in Mailman/Queue/Switchboard.py, you can force Mailman to
fsync() queue files after flushing them. The benefits are
debatable for most operating environments, and you must
ensure that your Python has the os.fsync() function defined
before enabling this feature (it isn't, even on all
Unix-like operating systems).
Internationalization
- New languages Ukrainian, Serbian, Danish, Euskara/Basque.
- Fixes to template lookup. Lists with local overriding
templates would find the wrong template.
- .mo files (for internationalization) are now generated at
build time instead of coming as part of the source
distribution.
Documentation
- A first draft of member documentation by Terri Oda. There
is also a Japanese translation of this manual by Ikeda Soji.
Archiver / Pipermail
- In the configuration variables PUBLIC_EXTERNAL_ARCHIVER, and
PRIVATE_EXTERNAL_ARCHIVER, %(hostname)s has been added to
the list of allowable substitution variables.
- The timezone is now taken into account when figuring the
posting date for an article.
Scripts / Cron
- Fixes to cron/disabled for NotAMemberError crashes.
- New script bin/show_qfiles which prints the contents of .pck
message files. New script bin/discard which can be used to
mass discard held messages.
- Fixes to cron/mailpasswds to account for old password-less
subscriptions.
- bin/list_members has grown two new options: --invalid/-i
prints only the addresses in the member database that are
invalid (which could have snuck in via old releases);
--unicode/-u prints addresses which are stored as Unicode
objects instead of as normal strings.
Miscellaneous
- Fixes to problems in some configurations where Python wouldn't
be able to find its standard library.
- Fixes to the digest which could cause MIME-losing missing
newlines when parts are scrubbed via the content filters.
- In the News/Mail gateway admin page, the configuration variable
nntp_host can now be a name:port pair.
- When messages are pulled from NNTP, the member moderation checks
are short-circuited.
- email 2.5.4 is included. This fixes an RFC 2231 bug, among
possibly others.
- Fixed some extra spaces that could appear in the List-ID header.
- Fixes to ensure that invalid email addresses can't be invited.
- WEB_LINK_COLOR in Defaults.py/mm_cfg.py should now work.
- Fixes so that shunted message file names actually match
those logged in log/errors.
- An improved pending action cookie generation algorithm has
been added.
- Fixes to the DSN bounce detector.
- The usual additional u/i, internationalization, unicode, and
other miscellaneous fixes.
2.1.2 (22-Apr-2003)
- New languages Portuguese (Portugal) and Polish.
- Many convenient constants have been added to the Defaults.py
module to (hopefully) make it more readable.
- Email addresses which contain 8-bit characters in them are now
rejected and won't be subscribed. This is not the same as 8-bit
characters in the realname, which is still allowed.
- The X-Originating-Email header is removed for anonymous lists.
Hotmail apparently adds this header.
- When running make to build Mailman, you can specify $DESTDIR to
the install target to specify an alternative location for
installation, without influencing the paths stored in
e.g. Defaults.py. This is useful to package managers.
- New Defaults.py variable DELIVERY_RETRY_WAIT which controls how
long the outgoing qrunner will wait before it retries a
tempfailure delivery.
- The semantics for the extend.py hook to MailList objects has
changed slightly. The hook is now called before attempting to
lock and load the database.
- Mailman now uses the email package version 2.5.1
- bin/transcheck now checks for double-%'s
- bin/genaliases grew a -q / --quiet flag
- cron/checkdbs grew a -h / --help option.
- The -c / --change-msg option has been removed from bin/add_members
- bin/msgfmt.py has been added, taken from Python 2.3's Tools/i18n
directory. The various .mo files are now no longer distributed
with Mailman. They are generated at build time instead.
- A new file misc/sitelist.cfg which can be used with
bin/config_list provides a small number of recommended settings
for your site list. Be sure to read it over before applying!
sitelist.cfg is installed into the data directory.
- Many bug fixes, including these SourceForge bugs closed and
patches applied: 677668, 690448, 700538, 700537, 673294, 683906,
671294, 522080, 521124, 534297, 699900, 697321, 695526, 703941,
658261, 710678, 707608, 671303, 717096, 694912, 707624, 716755,
661138, 716754, 716702, 667167, 725369, 726415
2.1.1 (08-Feb-2003)
Lots of bug fixes and language updates. Also:
- Closed a cross-site scripting vulnerability in the user options page.
- Restore the ability to control which headers show up in messages
included in plaintext and MIME digests. See the variables
PLAIN_DIGEST_KEEP_HEADERS and MIME_DIGEST_KEEP_HEADERS in
Defaults.py.
- Messages included in the plaintext digests are now sent through
the scrubber to remove (and archive) attachments. Otherwise,
attachments would screw up plaintext digests. MIME digests
include the attachments inline.
2.1 final (30-Dec-2002)
Last minute bug fixes and language updates.
2.1 rc 1 (24-Dec-2002)
Bug fixes and language updates. Also,
- Lithuanian support has been added.
- bin/remove_members grew --nouserack and --noadminack switches
- configure now honors --srcdir
2.1 beta 6 (09-Dec-2002)
Lots and lots of bug fixes, and translation updates. Also,
- ARCHIVER_OBSCURES_EMAILADDRS is now set to true by default.
- QRUNNER_SAVE_BAD_MESSAGES is now set to true by default.
- Bounce messages which were recognized, but in which no member
addresses were found are no longer forwarded to the list
administrator.
- bin/arch grew a --wipe option which first removes the entire old
archive before regenerating the new one.
- bin/mailmanctl -u now prints a warning that permission problems
could appear, such as when trying to delete a list through the
web that has some archives in it.
- bin/remove_members grew --nouserack/-n and -noadminack/-N options.
- A new script bin/list_owners has been added for printing out
list owners and moderators.
- Dates in the web version of archived messages are now relative
to the local timezone, and include the timezone names, when
available.
2.1 beta 5 (19-Nov-2002)
As is typical for a late beta release, this one includes the usual
bug fixes, tweaks, and massive new features (just kidding).
IMPORTANT: If you are using Pipermail, and you have any archives
that were created or added to in 2.1b4, you will need to run
bin/b4b5-archfix, followed by bin/check_perms to fix some serious
performance problems. From you install directory, run
"bin/b4b5-archfix --help" for details.
- The personalization options have been tweaked to provide more
control over mail header and decoration personalizations. In
2.1b4, when personalization was enabled, the To and Cc headers
were always overwritten. But that's usually not appropriate for
anything but announce lists, so now these headers aren't changed
unless "Full personalization" is enabled.
- You now need to go to the General category to enable emergency
moderation.
- The order of the hold modules in the GLOBAL_PIPELINE has
changed, again. Now Moderate comes before Hold.
- Estonian language support has been added.
- All posted messages should now get decorated with headers and
footers in a MIME-safe way. Previously, some MIME type messages
didn't get decorated at all.
- bin/arch grew a -q/--quiet option
- bin/list_lists grew a -b/--bare option
2.1 beta 4 (26-Oct-2002)
The usual assortment of bug fixes and language updates, some u/i
tweaks, as well as the following:
- Configuring / building / installing
o Tightened up some configure checks; it will now bark loudly
if you don't have the Python distutils package available
(some Linux distros only include distutils in their "devel"
packages).
o Mailman's username/group security assertions are now done by
symbolic name instead of numeric id. This provides a level
of indirection that makes it much easier to move or package
Mailman. --with-mail-gid and --with-cgi-gid are retained,
but they control the group names used instead.
- Command line scripts
o A new script, bin/transcheck that language teams can use to
check their .po files.
o bin/list_members grew a --fullnames/-f option to print the
full names along with the addresses.
o cron/senddigests grew --help/-h and --listname/-l options.
o bin/fix_url.py grew some command line options to support moving
a list to a specific virtual domain.
- Pipermail / archiving
o Reworked the directory layout for archive attachments to be
less susceptible to inode overload. Attachments are now
placed in
archives/private/<listname>/attachments/<YYYYMMDD>/<msgidhash>
o Internationalization support in the archiver has been improved.
- Internationalization
o New languages: Swedish.
- Mail handling
o Content filtering now has a pass_mime_type variable, which
is a whitelist of MIME types to allow in postings. See the
details of the variable in the Content Filtering category
for more information.
o If a member has enabled their DontReceiveDuplicates option,
we'll also strip their addresses from the Cc headers in the
copy of the message sent to the list. This helps keep the
Cc lines from growing astronomically.
o Bounce messages are now forwarded to the list administrators
both if they are unrecognized, and if no list member's
address could be extracted.
o Content filtering now has a filter_action variable which
controls what happens when a message matches the content
filter rules. The default is still to discard the message.
o When searching for an Approve/Approved header, the first
non-whitespace line of the body of the message is also
checked, if the body has a MIME type of text/plain.
o If a list is personalized, and the list's posting address is
not included in a Reply-To header, the posting address is
copied into a Cc header, otherwise there was no (easy) way a
recipient could reply back to the list.
o Added a MS Exchange bounce recognizer.
o New configuration variable news_moderation which allows the
mail->news gateway to properly post to moderated newsgroups.
o Messages sent to a list's owners now comes from the site
list to prevent mail loops when list owners or moderators
having bouncing addresses.
- Miscellaneous
o mailanctl prevents runaway restarts by imposing a maximum
restart value (defaulting to 10) for restarting the
qrunners. If you hit this limit, do "mailmanctl stop"
followed by "mailmanctl start".
o The Membership Management page's search feature now includes
searching on members real names.
o The start of a manual for list administrators is given in
Python HOWTO format (LaTeX). It's in doc/mailman-admin.tex
but it still needs lots of fleshing out.
o More protections against creating a list with an invalid name.
2.1 beta 3 (09-Aug-2002)
The usual assortment of bug fixes and language updates.
- New languages: Dutch, Portuguese (Brazil)
- New configure script options: --with-mailhost, --with-urlhost,
--without-permcheck. See ./configure --help for details.
- The encoding of Subject: prefixes is controlled by a new list
option encode_ascii_prefixes. This is useful for languages with
character sets other than us-ascii. See the Languages admin
page for details.
- A new list option news_prefix_subject_too controls whether
postings gated from mail to news should have the subject prefix
added to their Subject: header.
- The algorithm for upgrading the moderation controls for a
Mailman 2.0.x list has changed. The change should be
transparent, but you'll want to double check the moderation
controls after upgrading from MM2.0.x. This should have no
effect for upgrades from a previous MM2.1 beta.
See the UPGRADING file for details.
- On the Mass Subscribe admin page, a text box has been added so
that the admin can add a custom message to be prepended to the
welcome/invite notification.
- On the admindb page, a link is included to more easily reload
the page.
- The Sendmail.py delivery module is sabotaged so that it can't be
used naively. You need to read the comments in the file and
edit the code to use this unsafe module.
- When a member sends a `help' command to the request address,
the url to their options page is included in the response.
- Autoresponses, -request command responses, and posting hold
notifications are inhibited for any message that has a
Precedence: {bulk|list|junk} header. This is to avoid mail
loops between email 'bots. If the original message has an
X-Ack: yes header, the response is sent.
Responses are also limited to a maximum number per day, as
defined in the site variable MAX_AUTORESPONSES_PER_DAY. This is
another guard against 'bot loops, and it defaults to 10.
- When a Reply-To: header is munged to include both the original
and the list address, the list address is always added last.
- The cron/mailpasswds script has grown a -l/--listname option.
- The cron/disabled script has grown options to send out
notifications for reasons other than bounce-disabled. It has
also grown a -f/--force option. See cron/disabled --help for
details.
- The bin/dumpdb script has grown a -n/--noprint option.
- An experimental new mechanism for processing incoming messages
has been added. If you can configure your MTA to do qmail-style
Maildir delivery, Mailman now has a MaildirRunner qrunner. This
may turn out to be much more efficient and scalable, but for
MM2.1, it will not be officially supported. See Defaults.py.in
and Mailman/Queue/MaildirRunner.py for details.
2.1 beta 2 (05-May-2002)
Lots of bug fixing, and the following new features and changes:
- A "de-mime" content filter feature has been added. This
oft-requested feature allows you to specify MIME types that
Mailman should strip off of any messages before they're posted
to the list. You can also optionally convert text/html to
text/plain (by default, through lynx if it's available).
- Changes to the way the RFC 2919 and 2369 headers (i.e. the
List-*: headers) are added:
o List-Id: is always added
o List-Post:, List-Help:, List-Subscribe:,
List-Unsubscribe:, and List-Archive: are only added to
posting messages.
o X-List-Administrivia: is only added to messages Mailman
creates and sends out of its own accord.
Also, if the site administrator allows it, list owners can
suppress the addition of all the List-*: headers. List owners
can also separately suppress the List-Post: header for
announce-only lists.
- A new framework for email commands has been added. This allows
you to easily add, delete, or change the email commands that
Mailman understands, on a per-site, per-list, or even per-user
basis.
- Users can now change their digest delivery type from MIME to
plain text globally, for all lists they are subscribed to.
- No language select pulldowns are shown if the list only supports
one language.
- More mylist-admin eradication.
- Several performance improvements in the bounce qrunner, one of
which is to make it run only once per minute instead of once per
second.
- Korean language support as been added.
- Gatewaying from news -> mail uses its connections to the nntpd
more efficiently.
- In bin/add_members, -n/--non-digest-members-file command line
switch is deprecated in favor of -r/--regular-members-file.
- bin/sync_members grew a -g/--goodbye-msg switch.
2.1 beta 1 (16-Mar-2002)
In addition to the usual bug fixes, performance improvements, and
GUI changes, here are the highlights:
- MIME and other message handling
o More robustness against badly MIME encapsulated messages: if
a MessageParseError is raised during the initial parse, the
message can either be discarded or saved in qfiles/bad,
depending on the value of the new configuration variable
QRUNNER_SAVE_BAD_MESSAGES.
o There is a new per-user option that can be used to avoid
receipt of extra copies, when a member of the list is also
explicitly CC'd.
o Always add an RFC 2822 Date: header if missing, since not
all MTAs insert one automatically.
o The Sender: and Errors-To: headers are no longer added to
outgoing messages.
o Headers and footers are always added by concatenation, if
the message is not MIME and if the list's charset is a
superset of us-ascii.
- List administration
o An `invitation' feature has been added. This is selectable
as a radio button on the mass subscribe page. When
selected, users are invited to join instead of immediately
joined, i.e. they get a confirmation message.
o You can now enable and disable list owner notifications for
disabled-due-to-bouncing and removal-due-to-bouncing
actions. The site config variables
DEFAULT_BOUNCE_NOTIFY_OWNER_ON_DISABLE and
DEFAULT_BOUNCE_NOTIFY_OWNER_ON_REMOVAL control the default
behavior.
o List owners can now decide whether they receive unrecognized
bounce messages or not (i.e. messages that the bounce
processor doesn't recognize). Site admins can set the
default value for this flag with the config variable
DEFAULT_BOUNCE_UNRECOGNIZED_GOES_TO_LIST_OWNER.
o The admindb summary page gives the option of clearing the
moderation flag of members who are on quarantined.
o The action to take when a moderated member posts to a list
is now configurable. The message can either be held,
rejected (bounced), or discarded. If the message is
rejected, a rejection notice string can be given.
o In the General admin page, you can now set the default value
for five per-user flags: concealing the user's email
address, acknowledging posts sent by the user, copy
suppression, not-me-too selection, and the default digest
type. Site admins can set the default bit field with the
new DEFAULT_NEW_MEMBER_OPTIONS variable.
o A new "Emergency brake" feature for turning on moderation of
all list postings. This is useful for when flamewars break
out, and the list needs a cooling off period. Messages
containing an Approved: header with the list owner password
are still allowed through, as are messages approved through
the admindb interface.
o When a moderated message is approved for the list, add an
X-Mailman-Approved-At: header which contains the timestamp
of the approval action (changed from X-Moderated: with a
different format).
o Lists can now be converted to using a less error prone
mechanism for variable substitution syntax in headers and
footers. Instead of %(var)s strings, you'd use $var
strings. You must use "bin/withlist -r convert" to enable
this.
o When moderating held messages, the header text box and the
message excerpt text box are now both read-only.
o You can't delete the site list through the web.
o When creating new lists through the web, you have the option
of setting the "default member moderation" flag.
- Security and privacy
o New feature: banned subscription addresses. Privacy
options/subscription rules now have an additional list box
which can contain addresses or regular expressions.
Subscription requests from any matching address are
automatically rejected.
o Membership tests which compare message headers against list
rosters are now more robust. They now check, by default
these header in order: From:, unixfrom, Reply-To:, Sender:.
If any match, then the membership test succeeds.
o ALLOW_SITE_ADMIN_COOKIES is a new configuration variable
which says whether to allow AuthSiteAdmin cookies or not.
Normally, when a list administrator logs into a list with
the site password, they are issued a cookie that only allows
them to do administration for this one list. By setting
ALLOW_SITE_ADMIN_COOKIES to 1, the user only needs to
authenticate to one list with the site password, and they
can administer any mailing list.
I'm not sure this feature is wise, so the default value for
ALLOW_SITE_ADMIN_COOKIES is 0.
o Marc MERLIN's new recipes for secure Linuxes have been
updated.
o DEFAULT_PRIVATE_ROSTER now defaults to 1.
o Passwords are no longer included in the confirmation pages.
- Internationalization
o With the approval of Tamito KAJIYAMA, the Japanese codecs
for Python are now included automatically, so you don't need
to download and install these separate. It is installed in
a Mailman-specific place so it won't affect your larger
Python installation.
o The configure script will produce a warning if the Chinese
codes are not installed. This is not a fatal error.
o Russian templates and catalogs have been added.
o Finnish templates and catalogs have been added.
- Scripts and utilities
o New program bin/unshunt to safely move shunted messages back
into the appropriate processing queue.
o New program bin/inject for sending a plaintext message into
the incoming queue from the command line.
o New cron script cron/disabled for periodically culling the
disabled membership.
o bin/list_members has grown some new command line switches
for filtering on different criteria (digest mode, disable
mode, etc.)
o bin/remove_members has grown the --fromall switch.
o You can now do a bin/rmlist -a to remove an archive even
after the list has been deleted.
o bin/update removes the $prefix/Mailman/pythonlib directory.
o bin/withlist grows a --all/-a flag so the --run/-r option
can be applied to all the mailing lists. Also, interactive
mode is now the default if -r isn't used. You don't need to
run this script as "python -i bin/withlist" anymore.
o There is a new script contrib/majordomo2mailman.pl which
should ease the transition from Majordomo to Mailman.
- MTA integration
o Postfix integration has been made much more robust, but now
you have to set POSTFIX_ALIAS_CMD and POSTFIX_MAP_CMD to
point to the postalias and postmap commands respectively.
o VERP-ish delivery has been made much more efficient by
eliminating extra disk copies of messages for each recipient
of a VERP delivery. It has also been made more robust in
the face of failures during chunk delivery. This required a
rewrite of SMTPDirect.py and one casualty of that rewrite
was the experimental threaded delivery. It is no longer
supported (but /might/ be resurrected if there's enough
demand -- or a contributed patch :).
o A new site config variable SMTP_MAX_SESSIONS_PER_CONNECTION
specifies how many consecutive SMTP sessions will be
conducted down the same socket connection. Some MTAs have a
limit on this.
o Support for VERP-ing confirmation messages. These are less
error prone since the Subject: header doesn't need to be
retained, and they allow a more user friendly (and i18n'd)
Subject: header. VERP_CONFIRM_FORMAT, VERP_CONFIRM_REGEXP,
and VERP_CONFIRMATIONS control this feature (only supported
for invitation confirmations currently, but will be expanded
to the other confirmations).
o Several new list-centric addresses have been added:
-subscribe and -unsubscribe are synonyms for -join and
-leave, respectively. Also -confirm has been added to
support VERP'd confirmations.
- Archiver
o There's now a default page for the Pipermail archive link
for when no messages have yet been posted to the list.
o Just the mere presence of an X-No-Archive: is enough to
inhibit archiving for this message; the value of the header
is now ignored.
- Configuring, building, installing
o Mailman now has a new favicon, donated by Terry Oda. Not
all web pages are linked to the favicon yet though.
o The add-on email package is now distributed and installed
automatically, so you don't need to do this. It is
installed in a Mailman-specific place so it won't affect
your larger Python installation.
o The default value of VERP_REGEXP has changed.
o New site configuration variables BADQUEUE_DIR and
QRUNNER_SAVE_BAD_MESSAGES which describe where to save
messages which are not properly MIME encoded.
o configure should be more POSIX-ly conformant.
o The Mailman/pythonlib directory has been removed, but a new
$prefix/pythonlib directory has been added.
o Regression tests are now installed.
o The second argument to add_virtual() calls in mm_cfg.py are
now optional.
o DEFAULT_FIRST_STRIP_REPLY_TO now defaults to 0.
o Site administrators can edit the Mailman/Site.py file to
customize some filesystem layout policies.
2.1 alpha 4 (31-Dec-2001)
- The administrative requests database page (admindb) has been
redesigned for better usability when there are lots of held
postings. Changes include:
o A summary page which groups held messages by sender email
address. On this page you can dispose of all the sender's
messages in one action. You can also view the details of
all the sender's messages, or the details of a single
message. You can also add the sender to one of the list's
sender filters.
o A details page where you can view all messages, just those
for a particular sender, or just a single held message.
This details page is laid out the same as the old admindb
page.
o The instructions have been shorted on the summary and
details page, with links to more detailed explanations.
- Bounce processing
o Mailman now keeps track of the reason a member's delivery
has been disabled: explicitly by the administrator,
explicitly by the user, by the system due to excessive
bounces, or for (legacy) unknown reasons.
o A new bounce processing algorithm has been implemented (we
might actually understand this one ;). When an address
starts bouncing, the member gets a "bounce score". Hard
(fatal) bounces score 1.0, while soft (transient) bounces
score 0.5.
List administrators can specify a bounce threshold above
which a member gets disabled. They can also specify a time
interval after which, if no bounces are received from the
member, the member's bounce score is considered stale and is
thrown away.
o A new cron script, cron/disabled, periodically sends
notifications to members who are bounce disabled. After a
certain number of warnings the member is deleted from the
list. List administrators can control both the number of
notifications and the amount of time between notifications.
Notifications include a confirmation cookie that the member
can use to re-enable their subscription, via email or web.
o New configuration variables to support the bounce processing
are DEFAULT_BOUNCE_SCORE_THRESHOLD,
DEFAULT_BOUNCE_INFO_STALE_AFTER,
DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS,
DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS_INTERVAL.
- Privacy and security
o Sender filters can now be regular expressions. If a line
starts with ^ it is taken as a (raw string) regular
expression, otherwise it is a literal email address.
o Fixes in 2.0.8 ported forward: prevent cross-site scripting
exploits.
- Mail delivery
o Aliases have all been changed so that there's more
consistency between the alias a message gets delivered to,
and the script & queue runner that handles the message.
I've also renamed the mail wrapper script to `mailman' from
`wrapper' to avoid collisions with other MLM's. You /will/
need to regenerate your alias files with bin/genaliases, and
you may need to update your smrsh (Sendmail) configs.a
Bounces always go to listname-bounces now, since
administration has been separated from bounce processing.
listname-admin is obsolete.
o VERP support! This greatly improves the accuracy of bounce
detection. Configuration variables which control this feature
include VERP_DELIVERY_INTERVAL, VERP_PERSONALIZED_DELIVERIES,
VERP_PASSWORD_REMINDERS, VERP_REGEXP, and VERP_FORMAT. The
latter two must be tuned to your MTA.
o A new alias mailman-loop@dom.ain is added which directs all
output to the file $prefix/data/owner-bounces.mbox. This is
used when sending messages to the site list owners, as the
final fallback for bouncing messages.
o New configuration variable POSTFIX_STYLE_VIRTUAL_DOMAINS
which should be set if you are using the Postfix MTA and
want Mailman to play nice with Postfix-style virtual
domains.
- Miscellaneous
o Better interoperability with Python 2.2.
o MailList objects now record the date (in seconds since
epoch) that they were created. This is in a hidden
attribute `created_at'.
o bin/qrunner grows a -s/--subproc switch which is usually
used only when it's started from mailmanctl.
o bin/newlist grows a -l/--language option so that the list's
preferred language can be set from the command line.
o cron changes: admin reminders go out at 8am local time instead
of 10pm local time.
- Pipermail archiver
o MIME attachments are scrubbed out into separate files which
can be viewed by following a link in the original article.
Article contains an indication of the size of the
attachment, its type, and other useful information.
o New script bin/cleanarch which can be used to `clean' an
.mbox archive file by fixing unescaped embedded Unix From_
lines.
o New configuration variable ARCHIVE_SCRUBBER in
Defaults.py.in which names the module that Pipermail should
use to scrub articles of MIME attachments.
o New configuration variable ARCHIVE_HTML_SANITIZER which
describes how the scrubber should handle text/html
attachments.
o PUBLIC_ARCHIVE_URL has change its semantics. It is now an
absolute url, with the hostname and listname parts
interpolated into it on a per-list basis.
o Pipermail should now provide the proper character set in the
Content-Type: header for archived articles.
- Internationalization
o Czech translations by Dan Ohnesorg.
o The Hungarian charset has be fixed to be iso-8859-2.
o The member options login page now has a language selection
widget.
- Building, configuration
o email-0.96 package is required (see the misc directory).
o New recipes for integrating Mailman and Sendmail,
contributed by David Champion.
2.1 alpha 3 (22-Oct-2001)
- Realname support
o Mailman now tracks a member's Real Name in addition to their
email address.
o List members can now supply their Real Names when
subscribing via the web. Their Real Names are parsed from
any thru-email subscriptions.
o Members can change their Real Names on their options page,
and admins can change members' Real Names on the membership
pages. Mass subscribing accepts "email@dom.ain (Real Name)"
and "Real Name <email@dom.ain>" entries, for both
in-text-box and file-upload mass subscriptions.
- Filtering and Privacy
o Reply-To: munging has been enhanced to allow a wider range
of list policies. You can now pre-strip any Reply-To:
headers before adding list-specific ones (i.e. you can
override or extend existing Reply-To: headers). If
stripping, the old headers are no longer saved on
X-Reply-To:
o New sender moderation rules. The old `posters',
`member_only_posting', `moderated' and `forbidden_posters'
options have been removed in favor of a new moderation
scheme. Each member has a personal moderation bit, and
non-member postings can be automatically accepted, held for
approval, rejected (bounced) or discarded.
o When membership rosters are private, responses to
subscription (and other) requests are made more generic so
that these processes can't be covertly mined for hidden
addresses. If a subscription request comes in for a user
who is already subscribed, the user is notified of potential
membership mining.
o When a held message is approved via the admindb page, an
X-Moderated: header is added to the message.
o List admins can now set an unsubscribe policy which requires
them to approve of member unsubscriptions.
- Web U/I
o All web confirmations now require a two-click procedure,
where the first click gives them a page that allows them to
confirm or cancel their subscription. It is bad form for an
email click (HTTP GET) to have side effects.
o Lots of improvements for clarity.
o The Privacy category has grown three subcategories.
o The General options page as a number of subsection headers.
o The Passwords and Languages categories are now on separate
admin pages.
o The admin subcategories are now formated as two columns in
the top and bottom legends.
o When creating a list through the web, you can now specify
the initial list of supported languages.
o The U/I for unsubscribing a member on the admin's membership
page should be more intuitive now.
o There is now a separate configuration option for whether the
goodbye_msg is sent when a member is unsubscribed.
- Performance
o misc/mailman is a Unix init script, appropriate for
/etc/init.d, and containing chkconfig hooks for systems that
support it.
o bin/mailmanctl has been rewritten; the `restart' command
actually works now. It now also accepts -s, -q, and -u
options.
o bin/qrunner has been rewritten too; it can serve the role of
the old cron/qrunner script for those who want classic
cron-invoked mail delivery.
o Internally, messages are now stored in the qfiles directory
primarily as pickles. List configuration databases are now
stored as pickles too (i.e. config.pck). bin/dumpdb knows
how to display both pickles and marshals.
- Mail delivery
o If a user's message is held for approval, they are sent a
notification message containing a confirmation cookie. They
can use this confirmation cookie to cancel their own
postings (if they haven't already been approved).
o When held messages are forwarded to an explicit address
using the admindb page, it is done so in a message/rfc822
encapsulation.
o When a message is first held for approval, the notification
sent to the list admin is a 3-part multipart/mixed. The
first part holds the notification message, the second part
hold the original message, and the third part hold a cookie
confirmation message, to which the admin can respond to
approve or discard the message via email.
o In the mail->news gateway, you can define mail headers that
must be modified or deleted before the message can be posted
to the nntp server.
o The list admin can send an immediate urgent message to the
entire list membership, bypassing digest delivery. This is
done by adding an Urgent: header with the list password.
Urgent messages with an invalid password are rejected.
o Lists can now optionally personalize email messages, if the
site admin allows it. Personalized messages mean that the
To: header includes the recipient's address instead of the
list's address, and header and footer messages can contain
user-specific information. Note that only regular
deliveries can currently be personalized.
o Message that come from Usenet but that have broken MIME
boundaries are ignored.
o If the site administrator agrees, list owners have the
ability to disable RFC 2369 List-* headers.
o There is now an API for an external process to post a
message to a list. This posting process can also specify an
explicit list of recipients, in effect turning the mailing
list into a "virtual list" with a fluid membership. See
Mailman/Post.py for details.
- Building/testing/configuration
o mimelib is no longer required, but you must install the
email package (see the tarball in the misc directory).
o An (as yet) incomplete test suite has been added. Don't try
running it in a production environment!
o Better virtual host support by adding a mapping from the
host name given in cgi's HTTP_HOST/SERVER_NAME variable to
the email host used in list addresses. (E.g. www.python.org
maps to @python.org).
o Specifying urls to external public archivers is more
flexible.
o The filters/ subdirectory has been removed.
o There is now a `site list' which is a mailing list that must
be created first, and from which all password reminders
appear to come from. It is recommended that this list be
called "mailman@your.site".
o bin/move_list is no longer necessary (see the FAQ for
detailed instructions on renaming a list).
o A new script bin/fix_url.py can be used with bin/withlist to
change a list's web_page_url configuration variable (since
it is no longer modifiable through the web).
- Internationalization
o Support for German, Hungarian, Italian, Japanese, and
Norwegian have been added.
- Miscellaneous
o Lots of new bounce detectors. Bounce detectors can now
discard temporary bounce messages by returning a special
Stop value.
o bin/withlist now sports a -q/--quiet flag.
o bin/add_members has a new -a/--admin-notify flag which can
be used to inhibit list owner notification for each
subscription.
- Membership Adaptors
o Internally, mailing list memberships are accessed through a
MemberAdaptor interface. This would allow for integrating
membership databases with external sources (e.g. Zope or
LDAP), although the only MemberAdaptor currently implemented
is a "classic" adaptor which stores the membership
information on the MailList object.
o There's a new pipeline handler module called FileRecips.py
which could be used to get all regular delivery mailing list
recipients from a Sendmail-style :include: file (see List
Extensibility bullet below).
This work was sponsored by Control.com
- List Extensibility
o A framework has been added which can be used to specialize
and extend specific mailing lists. If there is a file
called lists/<yourlist>/extend.py, it is execfile()'d after
the MailList object is instantiated. The file should
contain a function extend() which will be called with the
MailList instance. This function can do all sorts of deep
things, like modify the handler pipeline just for this list,
or even strip out particular admin GUI elements (see below).
o All the admin page GUI elements are now separate
components. This provides greater flexibility for list
customization. Also, each GUI element will be given an
opportunity to handle admin CGI form data.
This work was sponsored by Control.com
- Topic Filters
o A new feature has been added called "Topic Filters". A list
administrator can create topics, which are essentially
regular expression matches against Subject: and Keyword:
headers (including such pseudo-headers if they appear in the
first few lines of the body of a message).
List members can then `subscribe' to various topics, which
allows them to filter out any messages that don't match a
topic, or to filter out any message that does match a
topic. This can be useful for high volume lists where not
everyone will be interested in every message.
This work was sponsored by Control.com
2.1 alpha 2 (11-Jul-2001)
- Building
o mimelib 0.4 is now required. Get it from
http://mimelib.sf.net. If you've installed an earlier
version of mimelib, you must upgrade.
o /usr/local/mailman is now the default installation
directory. Use configure's --prefix switch to change it
back to the default (/home/mailman) or any other
installation directory of your choice.
- Security
o Better definition of authentication domains. The following
roles have been defined: user, list-admin, list-moderator,
creator, site-admin.
o There is now a separate role of "list moderator", which has
access to the pending requests (admindb) page, but not the
list configuration pages.
o Subscription confirmations can now be performed via email or
via URL. When a subscription is received, a unique (sha)
confirm URL is generated in the confirmation message.
Simply visiting this URL completes the subscription process.
o In a similar manner, removal requests (via web or email
command) no longer require the password. If the correct
password is given, the removal is performed immediately. If
no password is given, then a confirmation message is
generated.
- Internationalization
o More I18N patches. The basic infrastructure should now be
working correctly. Spanish templates and catalogs are
included, and English, French, Hungarian, and Big5 templates
are included.
o Cascading specializations and internationalization of
templates. Templates are now search for in the following
order: list-specific location, domain-specific location,
site-wide location, global defaults. Each search location
is further qualified by the language being displayed. This
means that you only need to change the templates that are
different from the global defaults.
Templates renamed: admlogin.txt => admlogin.html
Templates added: private.html
- Web UI
o Redesigned the user options page. It now sits behind an
authentication so user options cannot be viewed without the
proper password. The other advantage is that the user's
password need not be entered on the options page to
unsubscribe or change option values. The login screen also
provides for password mail-back, and unsubscription w/
confirmation.
Other new features accessible from the user options page
include: ability to change email address (with confirmation)
both per-list and globally for all list on virtual domain;
global membership password changing; global mail delivery
disable/enable; ability to suppress password reminders both
per-list and globally; logout button.
[Note: the handle_opts cgi has gone away]
o Color schemes for non-template based web pages can be defined
via mm_cfg.
o Redesign of the membership management page. The page is now
split into three subcategories (Membership List, Mass
Subscription, and Mass Removal). The Membership List
subcategory now supports searching for member addresses by
regular expression, and if necessary, it groups member
addresses first alphabetically, and then by chunks.
Mass Subscription and Mass Removal now support file upload,
with one address per line.
o Hyperlinks from the logos in the footers have been removed.
The sponsors got too much "unsubscribe me!" spam from
desperate user of Mailman at other sites.
o New buttons on the digest admin page to send a digest
immediately (if it's non-empty), to start a new digest
volume with the next digest, and to select the interval with
which to automatically start a new digest volume (yearly,
monthly, quarterly, weekly, daily).
DEFAULT_DIGEST_VOLUME_FREQUENCY is a new configuration
variable, initially set to give a new digest volume monthly.
o Through-the-web list creation and removal, using a separate
site-wide authentication role called the "list creator and
destroyer" or simply "list creator". If the configuration
variable OWNERS_CAN_DELETE_THEIR_OWN_LISTS is set to 1 (by
default, it's 0), then list admins can delete their own
lists.
This feature requires an adaptor for the particular MTA
you're using. An adaptor for Postfix is included, as is a
dumb adaptor that just emails mailman@yoursite with the
necessary Sendmail style /etc/alias file changes. Some MTAs
like Exim can be configured to automatically recognize new
lists. The adaptor is selected via the MTA option in
mm_cfg.py
- Email UI
o In email commands, "join" is a synonym for
"subscribe". "remove" and "leave" are synonyms for
"unsubscribe". New robot addresses are support to make
subscribing and unsubscribing much easier:
mylist-join@mysite
mylist-leave@mysite
o Confirmation messages have a shortened Subject: header,
containing just the word "confirm" and the confirmation
cookie. This should help for MUAs that like to wrap long
Subject: lines, messing up confirmation.
o Mailman now recognizes an Urgent: header, which, if it
contains the list moderator or list administrator password,
forces the message to be delivered immediately to all
members (i.e. both regular and digest members). The message
is also placed in the digest. If the password is incorrect,
the message will be bounced back to the sender.
- Performance
o Refinements to the new qrunner subsystem which preserves
FIFO order of messages.
o The qrunner is no longer started from cron. It is started
by a Un*x init-style script called bin/mailmanctl (see
below). cron/qrunner has been removed.
- Command line scripts
o bin/mailmanctl script added, which is used to start, stop,
and restart the qrunner daemon.
o bin/qrunner script added which allows a single sub-qrunner
to run once through its processing loop.
o bin/change_pw script added (eases mass changing of list
passwords).
o bin/update grows a -f switch to force an update.
o bin/newlang renamed to bin/addlang; bin/rmlang removed.
o bin/mmsitepass has grown a -c option to set the list
creator's password. The site-wide `create' web page is
linked to from the admin overview page.
o bin/newlist's -o option is removed. This script also grows
a way of spelling the creation of a list in a specific
virtual domain.
o The `auto' script has been removed.
o bin/dumpdb has grown -m/--marshal and -p/--pickle options.
o bin/list_admins can be used to print the owners of a mailing list.
o bin/genaliases regenerates from scratch the aliases and
aliases.db file for the Postfix MTA.
- Archiver
o New archiver date clobbering option, which allows dates to
only be clobber if they are outrageously out-of-date
(default setting is 15 days on either side of received
timestamp). New configuration variables:
ARCHIVER_CLOBBER_DATE_POLICY
ARCHIVER_ALLOWABLE_SANE_DATE_SKEW
The archived copy of messages grows an X-List-Received-Date:
header indicating the time the message was received by
Mailman.
o PRIVATE_ARCHIVE_URL configuration variable is removed (this
can be calculated on the fly, and removing it actually makes
site configuration easier).
- Miscellaneous
o Several new README's have been added.
o Most syslog entries for the qrunner have been redirected to
logs/error.
o On SIGHUP, qrunner will re-open all its log files and
restart all child processes. See "bin/mailmanctl restart".
- Patches and bug fixes
o SF patches and bug fixes applied: 420396, 424389, 227694,
426002, 401372 (partial), 401452.
o Fixes in 2.0.5 ported forward:
Fix a lock stagnation problem that can result when the
user hits the `stop' button on their browser during a
write operation that can take a long time (e.g. hitting
the membership management admin page).
o Fixes in 2.0.4 ported forward:
Python 2.1 compatibility release. There were a few
questionable constructs and uses of deprecated modules
that caused annoying warnings when used with Python 2.1.
This release quiets those warnings.
o Fixes in 2.0.3 ported forward:
Bug fix release. There was a small typo in 2.0.2 in
ListAdmin.py for approving an already subscribed member
(thanks Thomas!). Also, an update to the OpenWall
security workaround (contrib/securelinux_fix.py) was
included. Thanks to Marc Merlin.
2.1 alpha 1 (04-Mar-2001)
- Python 2.0 or newer required. Also required is `mimelib' a new
library for handling MIME documents. This will be bundled in
future releases, but for now, you must download and install it
(using Python's distutils) from
http://barry.wooz.org/software/Code/mimelib-0.2.tar.gz
You need mimelib 0.2 or better.
- Redesigned qrunner subsystem. Now there are multiple message
queues, and considerable flexibility in file formats for
integration with external systems. The current crop of queues
include:
archive -- for posting messages to an archiver
commands -- for incoming email commands and bounces
in -- for list-destined incoming email
news -- for messages outgoing to a nntp server
out -- for messages outgoing to a smtp server
shunt -- for messages that trigger unexpected exceptions in Mailman
virgin -- for messages that are generated by Mailman
cron/qrunner is now a long running script that forks off
sub-runners for each of the above queues. qrunner still plays
nice with cron, but it is expected to be started by init at some
point in the future. Some support exists for parallel
processing of messages in the queues.
- Support for internationalization support merged in. Original
work done by Juan Carlos Rey Anaya and Victoriano Giralt. I've
tested about 90% of the web side, 50% of the email, and 50% of
the command line / cron scripts.
New scripts: bin/newlang, bin/rmlang
- New delivery script `auto' for automatic integration with the
Postfix MTA.
- A bunch of new bounce detectors.
Changes ported from Mailman 2.0.2 and 2.0.1:
- A fix for a potential privacy exploit where a clever list
administrator could gain access to user passwords. This doesn't
allow them to do much more harm to the user then they normally
could, but they still shouldn't have access to the passwords.
- In the admindb page, don't complain when approving a
subscription of someone who's already on the list (SF bug
#222409 - Thomas Wouters).
Also, quote for HTML the Subject: text printed for held
messages, otherwise messages with e.g. "Subject: </table>" could
royally screw page formatting.
- Docstring fix bin/newlist to remove mention of "immediate"
argument (Thomas Wouters).
- Fix for bin/update when PREFIX != VAR_PREFIX (SF bug #229794 --
Thomas Wouters).
- Bug fix release, namely fixes a buglet in bin/withlist affecting
the -l and -r flags; also a problem that can cause qrunner to
stop processing mail after disk-full events (SourceForge bug
127199).
2.0 final (21-Nov-2000)
No changes from rc3.
2.0 release candidate 3 (16-Nov-2000)
- By popular demand, Reply-To: munging policy is now to always
override any Reply-To: header in the original message, if
reply_goes_to_list is set to "This list" or "Explicit Address"
- bin/newlist given -q/--quiet flag instead of the <immediate>
positional argument
- Hopefully last fix to DEFAULT_URL not ending in a slash
sensitivity
- 2.0rc2 buglets fixed:
o newlist argument parsing
o updating with unlocked lists
o HyperArch.py traceback when there's no
Content-Transfer-Encoding: header
- SourceForge bugs fixed:
122358 (qmail-to-mailman.py listname case folding)
- SourceForge patches applied:
102373 (qmail-to-mailman.py listname case folding)
2.0 release candidate 2 (10-Nov-2000)
- Documentation updates: start in the doc/ directory.
- bin/withlist accepts additional command line arguments when used
with the --run flag; bin/mmsitepass and bin/newlist accept
-h/--help flags
- bin/newlist has a -o/--output flag to append /etc/aliases
suggestions to a specified file
- SourceForge bugs fixed:
116615 (README.BSD update), 117015 (duplicate messages on
moderated posts), 117548 (exception in HyperArch.py), 117682
(typos), 121185 (vsnprintf signature), 121591 and 122017
(bogus link after web unsubscribe), 121811 (`subscribe' in
Subject: doesn't get archived)
- SourceForge patches applied:
101812 (securelinux_fix.py contrib), 102097 (fix for bug
117548), 102211 (additional args for withlist), 102268 (case
insensitive Content-Transfer-Encoding:)
2.0 release candidate 1 (23-Oct-2000)
- Bug fixes and security patches.
- Better html rendition of articles in non us-ascii charsets
(Jeremy Hylton). See VERBATIM_ENCODING variable in
Defaults.py.in for customization.
2.0 beta 6 (22-Sep-2000)
- Building
o Tested with Python 1.5.2, Python 1.6, and Python 2.0 beta 1.
Conducted on RH Linux 6.1 only, but should work
cross-platform.
o Configure now accepts --with-username, --with-groupname,
--with-var-prefix flags. See `configure --help' or the
INSTALL file for details.
o Setting the CFLAGS environment variable before invoking
configure now works.
o The icons are now copied into $prefix/icons at install time.
Patch by David Champion.
- Standards
o Compliance with RFC 2369 (List-*: headers). Patch by
Darrell Fuhriman. List-ID: header is kept for historical
reasons.
o Fixes by Jeremy Hylton to Pipermail in support of non-ASCII
charsets, based on the Content-Type: and encoded-words in
the original message. Mail headers are now decoded as per
RFC 2047.
o Many more bounce formats are detected: Microsoft's SMTPSVC,
Compuserve, GroupWise, SMTP32, and the more generic
SimpleMatch (which catches lots of similar but slightly
different formats).
- Defaults
o Email addresses can now be obscured in Pipermail archives by
setting mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS to 1 (obscuring
is turned off by default). Patch provided by Chris Snell.
o The default NNTP host can now be set by editing
mm_cfg.DEFAULT_NNTP_HOST. Patch by David Champion.
o The default archiving mode (public/private) can now be set
by editing mm_cfg.DEFAULT_ARCHIVE. Patch by Ted Cabeen.
- Web UI
o The variable details pages in the administrators interface
is now `live', i.e. there's a submit button on the details
page.
o A link to the administrative interface is placed in the
footer of the general user pages (authentication still
required, of course!)
o The user options change results page has a link back to the
user's main page.
o In the admindb page (for dealing with held postings), the
default forward address is now listname-owner instead of
listname-admin. This avoids bounce detection on the
forwarded message.
- Miscellaneous
o Fixed config.db corruption problem when disk-full errors are
encountered.
o Command line scripts accept list names case-insensitively.
o bin/remove_members takes a -a flag to remove all members of
a list in one fell swoop.
o List admin passwords must be non-empty.
o Mailman generated passwords are slightly more mnemonic, and
shouldn't have confusing character selections (i.e. `i'
only, but no `1' or `l').
o Crossposting to two gated mailing lists should be fixed.
o Many other bug fixes and minor web UI improvements.
2.0 beta 5 (01-Aug-2000)
- Bug fix release. This includes a fix for a small security hole
which could be exploited to gain mailman group access by a local
user (not a mail or web user).
- As part of the fix for the "cookie reauthorization" bug, only
session cookies are used now. This means that administrative
and private archive cookies expire only when the browser session
is quit, however an explicit "Logout" button has been added.
2.0 beta 4 (06-Jul-2000)
- Bug fix release.
2.0 beta 3 (29-Jun-2000)
- Delivery mechanism (qrunner) refined to support immediate
queuing, queuing directly from MTA, and queuing on any error
along the delivery pipeline. This means 1) that huge lists
can't time out the MTA's program delivery channel; 2) it is much
harder to completely lose messages; 3) eventually, qrunner will
be elaborated to meter delivery to the MTA so as not to swamp
it. The tradeoff is in more disk I/O since every message coming
into the system (and most that are generated by the system) live
on disk for some part of their journey through Mailman.
For now, see the Default.py variables QRUNNER_PROCESS_LIFETIME
and QRUNNER_MAX_MESSAGES for primitive resource management.
The API to the pipeline handler modules has changed. See
Mailman/Handlers/HandlerAPI.py for details.
- Revamped admindb web page: held messages are split into headers
and bodies so they are easier to vette; admins can now also
preserve a held message (for spam evidence gathering) or forward
the message to a specified email address; disposition of held
messages can be deferred; held messages have a more context
meaningful default rejection message.
- Change to the semantics for `acceptable_aliases' list
configuration variable, based on suggestions by Harald Meland.
- New mm_cfg.py variables NNTP_USERNAME and NNTP_PASSWORD can be
set on a site-wide basis if connection to your nntpd requires
authentication.
- The list attribute `num_spawns' has been removed. The mm_cfg.py
variables MAX_SPAWNS, and DEFAULT_NUM_SPAWNS removed too.
- LIST_LOCK_LIFETIME cranked to 5 hours and LIST_LOCK_TIMEOUT
shortened to 10 seconds. QRUNNER_LOCK_LIFETIME cranked up to 10
hours. This should decrease the changes for bogus and harmful
lock breaking.
- Resent-to: is now one of the headers checked for explicit
destinations.
- Tons more bounce formats are recognized. The API to the bounce
modules has changed.
- A rewritten LockFile module which should fix most (hopefully all)
bugs in the locking machinery. Many improvements suggested by
Thomas Wouters and Harald Meland.
- Experimental support (disabled by default) for delivering SMTP
chunks to the MTA via multiple threads. Your Python executable
must have been compiled with thread support enabled, and you
must set MAX_DELIVERY_THREADS in mm_cfg.py. Note that this may
not improve your overall system performance.
- Some changes and additions to scripts: bin/find_member now
supports a -w/--owner flag to match regexps against mailing list
owners; bin/find_member now supports multiple regexps;
cron/gate_news command line option changes; new script
bin/dumbdb for debugging purposes; bin/clone_member can now also
remove the old address and change change the list owner
addresses.
- The News/Mail gateway admin page has a button that lets you do
an explicit catchup of the newsgroup.
- The CVS repository has been moved out to SourceForge. For more
information, see the project summary at
http://sourceforge.net/project/?group_id=103
- Lots 'o bug fixes and some performance improvements.
2.0 beta 2 (07-Apr-2000)
- Rewritten gate_news cron script which should be more efficient
and avoid race and locking problems. Each list now maintains
its own watermark, and when you use the admin CGI script to turn
on gating from Usenet->mail, an automatic mass catch up is done
to avoid flooding the mailing list. cron/gate_news's command
line interface has also changed. See its docstring for
details.
- A new cron script called qrunner has been added to retry message
deliveries that fail because of temporary smtpd problems.
- New command line script called bin/list_lists which does exactly
that: lists all the mailing lists on the system (much like the
listinfo CGI does).
- bin/withlist is now directly executable, however if you want to
use python -i, you must still explicitly invoke it.
bin/withlist also now cleans up after itself by unlocking any
locked lists. It does NOT save any dirty lists though - you
must do this explicitly.
- $prefix permissions (and all subdirs) must now be 02775.
bin/check_perms has been updated to fix all the subdir
permissions.
- "make update" (a.k.a. bin/update) is run automatically when you
do a "make install"
- The CGI driver script now puts information about the Python
environment into the logs/error file (but not the diagnostic web
page).
- Bug fixes and some performance improvements
2.0 beta 1 (19-Mar-2000)
- Python 1.5.2 (or newer) is now required.
- A new bundled auto-responder has been added. You can now
configure an autoresponse text for each list's primary
addresses:
listname@yourhost.com -- the general posting address
listname-request@... -- the automated "request bot" address
listname-admin@... -- the human administrator address
- The standard UI now includes three logos at the bottom of the
page: Dragon's Mailman logo, the Python Powered logo, and the
GNU logo. All point to their respective home pages.
- It is now possible to set the Reply-To: field on lists to an
arbitrary address. NOTE: Reply-To: munging is generally
considered harmful! However for some read-only lists, it is
useful to direct replies to a parallel discussion list.
- There is a new message delivery architecture which uses a
pipeline processor for incoming and internally generated
messages. Mailman no longer contains a bundled bulk-mailer;
instead message delivery is handled completely by the MTA. Most
MTAs give a high enough priority to connections from the
localhost that mail will not be lost because of system load, but
this is not guaranteed (or handled) by Mailman currently. Be
careful also if your smtpd is on a different host than the
Mailman host. In practice, mail lossage has not be observed.
For this reason cron/run_queue is no longer needed (see the
UPGRADING file for details).
Also, you can choose whether you want direct smtp delivery, or
delivery via the command line to a sendmail-compatible daemon.
You can also easily add your own delivery module. See
Mailman/Defaults.py for details.
- A similar pipeline architecture for the parsing of bounce
messages has been added. Most common bounce formats are now
handled, including Qmail, Postfix, and DSN. It is now much
easier to add new bounce detectors.
- The approval pending architecture has also been revamped.
Subscription requests and message posts waiting for admin
approval are no longer kept in the config.db file, but in a
separate requests.db file instead.
- Finally made consistent the use of Sender:/From:/From_ in the
matching of headers for such things as member-post-only. Now,
if USE_ENVELOPE_SENDER is true, Sender: will always be chosen
over From:, however the default has been changed to
USE_ENVELOPE_SENDER false so that From: is always chosen over
Sender:. In both cases, if no header is found, From_ (i.e. the
envelope sender is used). Note that the variable is now
misnamed! Most people want From: matching anyway and any are
easily spoofable.
- New scripts bin/move_list, bin/config_list
- cron/upvolumes_yearly, cron/upvolumes_monthly, cron/archive,
cron/run_queue all removed. Edit your crontab if you used these
scripts. Other scripts removed: contact_transport, deliver,
dumb_deliver.
- Several web UI improvements, especially in the admin page.
- Remove X-pmrqc: headers to prevent return reciepts for Pegasus
mail users.
- Security patch when using external archivers.
- Honor "X-Archive: No" header by not putting this message in the
archive.
- Changes to the log file format.
- The usual bug fixes.
1.1 (05-Nov-1999)
- All GIFs removed. See http://www.gnu.org/philosophy/gif.html
for the reason why.
- Improvements to the Pipermail archiver which make things faster.
Primary change is that the .txt files are not gzipped on every
posted message. Instead, use the new cron script `nightly_gzip'
to gzip the .txt file in batches (this means that the .txt file
will lag behind the on-line archives a little).
- From the C drivers programs, Python is invoked with the -S
option. This tells Python to avoid importing the site module,
which can improve start up time of the Python process
considerably. Note that the command line script invocation has
not been changed.
- New configuration variables PUBLIC_EXTERNAL_ARCHIVER and
PRIVATE_EXTERNAL_ARCHIVER which can contain a shell command
string for os.popen(). This can be used to invoke an external
archiver instead of the bundled Pipermail archiver. See
Defaults.py for details.
- new script `bin/find_member' which can be used to search for a
member by regular expression.
- More child processes are reaped, which should eliminate most
occurrences of zombie processes.
- A few small miscellaneous bug fixes (including PR#99, PR#107)
and improvements to the file locking algorithms.
1.0 (30-Jul-1999)
- Configure script now allows $PREFIX (by default /home/mailman)
to be permissions 02755. Also, configure now tests for
vsnprintf()
- Workaround, taken from GNU screen, for systems missing
vsnprintf()
- Return-Receipt-To: and Disposition-Notification-To: headers are
always removed from posted messages (they can be used to troll
for list membership).
- Workaround for MSIE4.01 (and possibly other versions) bug in the
handling of cookies.
- A small collection of other bug fixes.
1.0rc3 (10-Jul-1999)
- new script bin/check_perms which checks (and optionally fixes)
the permissions and group ownerships of the files in your
Mailman installation.
- Removed a bottleneck in the archiving code that was causing
performance problems on highly loaded servers.
- The code that saves a list's state and configuration database
has been made more robust.
- Additional exception handlers have been added in several places
to alleviate problems with Mailman bombing out when it really
would be better to print/log a helpful message.
- The "password" mail command will now mail back the sender's
subscription password when given with no arguments.
- The embarrassing subject-prefixing bug present in rc2 has been
fixed.
- A small (but nice :) collection of other squashed bugs.
1.0rc2 (14-Jun-1999)
- A security flaw in the CGI cookie mechanisms was discovered --
the Mailman-issued cookies were easily spoofable, implying that
e.g. admin access to all Mailman lists via the web interface
could be compromised. This flaw has now been fixed.
- Handling of SMTP errors has been improved.
- Both "Mass Subscription" via web admin interface and
bin/add_members have been greatly sped up.
- autoconf check for syslog has been revamped, and is now verified
to work on SCO OpenServer 5. If syslog can't be found, the C
wrappers will compile, but without any syslog calls.
- Various other bug fixes.
1.0rc1 (04-May-1999)
- There is a new Mailman logo, contributed by The Dragon De
Monsyne. Please read the INSTALL file for information about
installing the logo in a place your Web server can find it.
- USE_ENVELOPE_SENDER is now set to 0 by default. Turning this on
caused problems for too many users; lists restricted to
member-only posts were not matching the addresses correctly.
- A revamped bin/withlist to be a little more useful.
- A revamped cron/mailpasswds which groups users by virtual hosts.
- The usual assortment of bug fixes.
1.0b11 (03-Apr-1999)
- Bug fixes and improvements for case preservation of subscribed
addresses. The DATA_FILE_VERSION has been bumped to 14.
- New script bin/withlist, useful for interactive debugging.
1.0b10 (26-Mar-1999)
- New script bin/sync_members which can be used to synchronize a
list's membership against a flat (e.g. sendmail :include: style)
file.
- bin/add_members and bin/remove_members now accept addresses on
the command line with `-' as the value for the -d and -n
options.
- Added variable USE_ENVELOPE_SENDER to Defaults.py for site-wide
configuration of address matching scheme. With this variable
set to true, the envelope sender (e.g. Unix "From_" header) is
used to match addresses, otherwise the From: header is used.
Envelope sender matching seems not to work on many systems.
This variable is currently defaulted to 1, but may change to 0
for the final release.
- Reorganization of the membership management admin page. Also
member addresses are linked to their options page. Only the
`General' category has the admin password change form.
- Major reorganization of email command handling and responses.
`notmetoo' is the preferred email command instead of `norcv',
although the latter is still accepted as an argument. If more
than 5 errors are found in the message, command processing is
halted.
- User options page now shows the user their case-preserved
subscribed address as well.
- The usual assortment of bug fixes.
1.0b9 (01-Mar-1999)
- New bin scripts: clone_member, list_members, add_members (a
consolidation of convertlist and populate_new_list which have
been removed).
- Two new readmes have been added: README.LINUX and README.QMAIL
- New configure option --with-cgi-ext which can be used if your
Web server requires extensions on CGI scripts. The extension
must include a dot (e.g. --with-cgi-ext=".cgi").
- Many bug fixes, including the setgid problem that was causing
mail to be lost on some versions of Linux.
1.0b8 (14-Jan-1999)
- Bug fixes and workarounds for certain Linuxes.
- Illegal addresses are no longer allowed to be subscribed, from
any interface.
1.0b7 (31-Dec-1998)
- Many, many bug fixes. Some performance improvements for large
lists. Some improvements in the Web interfaces. Some security
improvements. Improved compatibility with Python 1.5.
- bin/convert_list and bin/populate_new_list have been replaced
by bin/add_members.
- Admins can now get notification on subscriptions and
unsubscriptions. Posts are now logged.
- The username portion of email addresses are now case-preserved
for delivery purposes. All other address comparisions are
case-insensitive.
- New default SMTP_MAX_RCPTS that limits the number of "RCPT TO"
SMTP commands that can be given for a single message. Most
MTAs have some hard limit.
- "Precedence: bulk" header and "List-id:" header are now added
to all outgoing messages. The latter is not added if the
message already has a "List-id:" header. See RFC 2046 and
draft-chandhok-listid-02 for details.
- The standard (as of Python 1.5.2) smtplib.py is now used.
- The install process now compiles all the .py files in the
installation.
- Versions of the Mailman papers given at IPC7 and LISA-98 are
now included.
1.0b6 (07-Nov-1998)
- Archiving is (finally) back in.
- Administrivia filter added.
- Mail queue mechanism revamped with better concurrency control.
- For recipients that have estmp MTAs, set delivery notification
status so that only delivery failure notices are sent out,
inhibiting 4 hour and N day warning notices.
- Now expire old unconfirmed subscription requests, rather than
keeping them forever.
- Added proposed standard List-Id: header, and our own
X-MailmanVersion header.
- Prevent havoc from attempts to subscribe a list to itself. (!)
- Refine mail command processing to prevent loops.
- Pending subscription DB redone with better locking and cleaner
interface.
- posters functionality expanded.
- Subscription policy more flexible, sensible, and
site-configurable.
- Various and sundry bug fixes.
1.0b5 (27-Jul-1998)
- New file locking that should be portable and work w/ NFS.
- Better use of packages.
- Better error logging and reporting.
- Less startup overhead.
- Various and sundry bug fixes.
1.0b4 (03-Jun-1998)
- A configure script for easy installation (Barry Warsaw)
- The ability to install Mailman to locations other than
/home/mailman (Barry Warsaw)
- Use cookies on the admin pages (also hides admin pages from
others) (Scott Cotton)
- Subscription requests send a request for confirmation, which may
be done by simply replying to the message (Scott Cotton)
- Facilities for gating mail to a newsgroup, and for gating a
newsgroup to a mailing list (John Viega)
- Contact the SMTP port instead of calling sendmail (primarily for
portability) (John Viega)
- Changed all links on web pages to relative links where appropriate.
(John Viega)
- Use MD5 if crypt is not available (John Viega)
- Lots of fixing up of bounce handling (Ken Manheimer)
- General UI polishing (Ken Manheimer)
- mm_html: Make it prominent when the user's delivery is disabled
on his option page. (Ken Manheimer)
- mallist:DeleteMember() Delete the option setings if any. (Ken
Manheimer)
1.0b3 (03-May-1998)
- mm_message:Deliverer.DeliverToList() added missing newline
between the headers and message body. Without it, any sequence
of initial body lines that _looked_ like headers ("Sir: Please
excuse my impertinence, but") got treated like headers.
- Fixed typo which broke subscription acknowledgement message
(thanks to janne sinkonen for pointing this out promptly after
release). (Anyone who applied my intermediate patch will
probably see this one trigger patch'es reversed-patch
detector...)
- Fixed cgi-wrapper.c so it doesn't segfault when invoked with
improper uid or gid, and generally wrappers are cleaned up a
bit.
- Prevented delivery-failure notices for misdirected subscribe-
confirmation requests from bouncing back to the -request addr,
and then being treated as failing requests.
Implemented two measures. Set the reply-to for the
confirmation- request to the -request addr, and the sender to be
the list admin. This way, bounces go to list admin instead of
to -request addr. (Using the errors-to header wasn't
sufficient. Thanks, barry, for pointing out the use of sender
here.) Second, ignore any mailcommands coming from postmaster
or non-login system type accounts (mailer-daemon, daemon,
postoffice, etc.)
- Reenabled admin setting of web_page_url - crucial for having
lists use alternate names of a host that occupies multiple
addresses.
- Fixed and refined admin-options help mechanism. Top-level visit
to general-category (where the "general" isn't in the URL) was
broken. New help presentation shows the same row that shows on
the actual options page.
- cron/crontab.in crontab template had wrong name for senddigests.
- Default digest format setting, as distributed, is now non-MIME,
on urging of reasoned voices asserting that there are still
enough bad MIME implementations in the world to be a nuisance to
too many users if MIME is the default. Sigh.
- MIME digests now preserve the structure of MIME postings,
keeping attachments as attachments, etc. They also are more
structured in general.
- Added README instructions explaining how to determine the right
UID and GID settings for the wrapper executables, and improved
some of the explanations about exploratory interaction
w/mailman.
- Removed the constraint that subscribers have their domain
included in a static list in the code. We might want to
eventually reincorporate the check for the sake of a warning
message, to give a heads up to the subscriber, but try delivery
anyway...
- Added missing titles to error docs.
- Improved several help details, including particularly explaining
better how real_name setting is used.
- Strengthened admonition against setting reply_goes_to_list.
- Added X-BeenThere header to postings for the sake of prevention
of external mail loops.
- Improved handling of bounced messages to better recognize
members address, and prevent duplicate attempts to react (which
could cause superfluous notices to administrator).
- Added __delitem__ method to mm_message.OutgoingMessage, to fix
the intermediate patch posted just before this one.
- Using keyword substitution format for more message text (ie,
"substituting %(such)s into text" % {'such': "something"}) to
make the substitutions less fragile and, presumably, easier to
debug.
- Removed hardwired (and failure-prone) /tmp file logging from
answer.majordomo_mail, and generally spiffed up following janne
sinkkonen's lead.
1.0b2 (13-Apr-1998)
1.0b1 (09-Apr-1998)
Web pages much more polished
- Better organized, text more finely crafted
- Easier, more refined layout
- List info and admin interface overviews, enumerate all public lists
(via, e.g., http://www.python.org/mailman/listinfo - sans the
specific list)
- Admin interface broken into sections, with help elaboration for
complicated configuration options
Mailing List Archives
- Integrated with a newer, *much* improved, external pipermail - to be
found at http://starship.skyport.net/crew/amk/maintained/pipermail.html
- Private archives protected with mailing list members passwords,
cookie-fied.
Spam prevention
- New spam prevention measures catch most if not all spam without
operator intervention or general constraints on who can post to
list:
require_explicit_destination option imposes hold of any postings
that do not have the list name in any of the to or cc header
destination addresses. This catches the vast majority of random
spam.
Other options (forbidden_posters, bounce_matching_headers) provide
for filtering of known transgressors.
- Option obscure_addresses (default on) causes mailing list subscriber
lists on the web to be slightly mangled so they're not directly
recognizable as email address by web spiders, which might be
seeking targets for spammers.
Site configuration arrangement organized - in mailman/mailman/modules:
- When installing, create a mailman/modules/mm_cfg.py (if there's not
one already there), using mm_cfg.py.dist as a template.
mm_default.py contains the distributed defaults, including
descriptions of the values. mm_cfg.py does a 'from mm_defaults.py
import *' to get the distributed defaults. Include settings in
mm_cfg.py for any values in mm_defaults.py that need to be
customized for your site, after the 'from .. import *'.
See mm_cfg.py.dist for more details.
Logging
- Major operations (subscription, admin approval, bounce,
digestification, cgi script failure tracebacks) logged in files
using a reliable mechanism
- Wrapper executables log authentication complaints via syslog
Wrappers
- All cgi-script wrapper executables combined in a single source,
easier to configure. (Mail and aliases wrappers separate.)
List structure version migration
- Provision for automatic update of list structures when moving to a
new version of the system. See modules/versions.py.
Code cleaning
- Many more module docstrings, __version__ settings, more function
docstrings.
- Most unqualified exception catches have been replaced with more
finely targeted catches, to avoid concealing bugs.
- Lotsa long lines wrapped (pet peeve:).
Random details (not complete, sorry):
- make archival frequency a list option
- Option for daily digest dispatch, in addition to size threshhold
- make sure users only get one periodic password notifcation message for
all the lists they're on (repaired 1.0b1.1 varying-case mistake)
- Fix rmlist sans-argument bug causing deletion of all lists!
- doubled generated random passwords to four letters
- Cleaned lots and lots of notices
- Lots and lots of html page cleanup, including table-of-contents, etc
- Admin options sections - don't do the "if so" if the ensuing list
is empty
- Prevent list subject-prefix cascade
- Sources under CVS
- Various spam filters - implicit-destination, header-field
- Adjusted permissions for group access
- Prevent redundant subscription from redundant vetted requests
- Instituted centralize, robustish logging
- Wrapper sources use syslog for logging (john viega)
- Sorting of users done on presentation, not in list.
- Edit options - give an error for non-existent users, not an options page.
- Bounce handling - offer 'disable' option, instead of remove, and
never remove without notifying admin
- Moved subscribers off of listinfo (and made private lists visible
modulo authentication)
- Parameterize default digest headers and footers and create some
- Put titles on cgi result pages that do not get titles (all?)
- Option for immediate admin notifcation via email of pending
requests, as well as periodic
- Admin options web-page help
- Enabled grouped and cascading lists despite implicit-name constraint
- Changed subscribers list so it has its own script (roster)
- Welcome pages: http://www.python.org/mailman/{admin,listinfo}/
0.95 (25-Jan-1997)
- Fixed a bug in sending out digests added when adding disable mime option.
- Added an option to not notify about bounced posts.
- Added hook for pre-posting filters. These could be used to
auto-strip signatures. I'm using the feature to auto-strip footers
that are auto-generated by mail received from another mailing list.
0.94 (22-Jan-1997)
- Made admin password work ubiquitously in place of a user password.
- Added an interface for getting / setting user options.
- Added user option to disable mime digests (digested people only)
- Added user option to not receive your own posts (nondigested people only)
- Added user option to ack posts
- Added user option to disable list delivery to their box.
- Added web interface to user options
- Config number of sendmail spawns on a per-list basis
- Fixed extra space at beginning of each message in digests...
- Handled comma separated emails in bounce messages...
- Added a FindUser() function to MailList. Used it where appropriate.
- Added mail interface to setting list options.
- Added name links to the templates options page
- Added an option so people can hide their names from the subscription list.
- Added an answer_majordomo_mail script for people switching...
0.93 (18/20-Jan-1997)
- When delivering to list, don't call sendmail directly. Write to a file,
and then run the new deliver script, which forks and exits in the parent
immediately to avoid hanging when delivering mail for large lists, so that
large lists don't spend a lot of time locked.
- GetSender() no longer assumes that you don't have an owner-xxx address.
- Fixed unsubscribing via mail.
- Made subscribe via mail generate a password if you don't supply one.
- Added an option to clobber the date in the archives to the date the list
resent the post, so that the archive doesn't get mail from people sending
bad dates clumped up at the beginning or end.
- Added automatic error message processing as an option. Currently
logging to /tmp/bounce.log
- Changed archive to take a list as an argument, (the old way was broken)
- Remove (ignore) spaces in email addresses
- Allow user passwords to be case insensitive.
- Removed the cleanup script since it was now redundant.
- Fixed archives if there were no archives.
- Added a Lock() call to Load() and Create(). This fixes the
problem of loading then locking.
- Removed all occurances of Lock() except for the ones in mailing
list since creating a list
now implicitly locks it.
- Quote single periods in message text.
- Made bounce system handle digest users fairly.
0.92 (13/16-Jan-1997)
- Added Lock and Unlock methods to list to ensure each operation is atomic
- Added a cmd that rms all files of a mailing list (but not the aliases)
- Fixed subscribing an unknown user@localhost (confirm this)
- Changed the sender to list-admin@... to ensure we avoid mail loops.
- check to make sure there are msgs to archive before calling pipermail.
- started using this w/ real mailing lists.
- Added a cron script that scours the maillog for User/Host unknown errs
- Sort membership lists
- Always display digest_is_default option
- Don't slam the TO list unless you're sending a digest.
- When making digest summaries, if missing sender name, use their email.
- Hacked in some protection against crappy dates in pipermail.py
- Made it so archive/digest volumes can go up monthly for large large lists.
- Number digest messages
- Add headers/footers to each message in digest for braindead mailers
- I removed some forgotten debug statements that caused server errors
when a CGI script sent mail.
- Removed loose_matches flag, since everything used it.
- Fixed a problem in pipermail if there was no From line.
- In upvolume_ scripts, remove INDEX files as we leave a volume.
- Threw a couple of scripts in bin for generating archives from majordomo's
digest-archives. I wouldn't recommend them for the layman, though, they
were meant to do a job quickly, not to be usable.
0.91 (23-Dec-1996)
- broke code into mixins for managability
- tag parsing instead of lots of gsubs
- tweaked pipermail (see comments on pipermail header)
- templates are now on a per-list basis as intended.
- request over web that your password be emailed to you.
- option so that web subscriptions require email confirmation.
- wrote a first pass at an admin interface to configurable variables.
- made digests mime-compliant.
- added a FakeFile class that simulates enough of a file object on a
string of text to fool rfc822.Message in non-seek mode.
- changed OutgoingMessage not to require its args in constructor.
- added an admin request DB interface.
- clearly separated the internal name from the real name.
- replaced lots of ugly, redundant code w/ nice code.
(added Get...Email() interfaces, GetScriptURL, etc...)
- Wrote a lot of pretty html formatting functions / classes.
- Fleshed out the newlist command a lot. It now mails the new list
admin, and auto-updates the aliases file.
- Made multiple owners acceptable.
- Non-advertised lists, closed lists, max header length, max msg length
- Allowed editing templates from list admin pages.
- You can get to your info page from the web even if the list is closed.
Local Variables:
mode: indented-text
indent-tabs-mode: nil
End: