diff options
-rw-r--r-- | .bzrignore | 23 | ||||
-rw-r--r-- | Mailman/Archiver/HyperArch.py | 6 | ||||
-rw-r--r-- | Mailman/Cgi/options.py | 4 | ||||
-rw-r--r-- | Mailman/Defaults.py.in | 12 | ||||
-rw-r--r-- | Mailman/Handlers/CalcRecips.py | 9 | ||||
-rw-r--r-- | Mailman/Handlers/CleanseDKIM.py | 8 | ||||
-rw-r--r-- | Mailman/Handlers/Hold.py | 4 | ||||
-rw-r--r-- | Mailman/Handlers/MimeDel.py | 4 | ||||
-rw-r--r-- | Mailman/Handlers/Scrubber.py | 11 | ||||
-rw-r--r-- | Mailman/MailList.py | 1 | ||||
-rw-r--r-- | Mailman/Queue/CommandRunner.py | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | Mailman/Queue/MaildirRunner.py | 20 | ||||
-rw-r--r-- | Mailman/versions.py | 5 | ||||
-rwxr-xr-x | configure | 24 | ||||
-rw-r--r-- | configure.in | 14 | ||||
-rw-r--r-- | misc/paths.py.in | 8 |
16 files changed, 115 insertions, 42 deletions
diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 00000000..f602e80c --- /dev/null +++ b/.bzrignore @@ -0,0 +1,23 @@ +Mailman/Defaults.py +Mailman/mm_cfg.py.dist +build +config.log +config.status +cron/crontab.in +misc/JapaneseCodecs-1.4.11 +misc/KoreanCodecs-2.0.5 +misc/email-2.5.8 +misc/mailman +misc/paths.py +src/admin +src/admindb +src/confirm +src/create +src/edithtml +src/listinfo +src/mailman +src/options +src/private +src/rmlist +src/roster +src/subscribe diff --git a/Mailman/Archiver/HyperArch.py b/Mailman/Archiver/HyperArch.py index e5ed59a9..5a177309 100644 --- a/Mailman/Archiver/HyperArch.py +++ b/Mailman/Archiver/HyperArch.py @@ -460,8 +460,10 @@ class Article(pipermail.Article): d["email_html"] = self.quote(self.email) d["title"] = self.quote(self.subject) d["subject_html"] = self.quote(self.subject) - d["subject_url"] = url_quote(self.subject) - d["in_reply_to_url"] = url_quote(self.in_reply_to) + # TK: _url variables are used to compose a response from the + # archive web page. So, ... + d["subject_url"] = 'Re: ' + url_quote(self.subject) + d["in_reply_to_url"] = url_quote(self._message_id) if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS: # Point the mailto url back to the list author = re.sub('@', _(' at '), self.author) diff --git a/Mailman/Cgi/options.py b/Mailman/Cgi/options.py index d423f262..ab19e4e2 100644 --- a/Mailman/Cgi/options.py +++ b/Mailman/Cgi/options.py @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2006 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -797,6 +797,8 @@ def options_page(mlist, doc, user, cpuser, userlang, message=''): if mlist.topics: table = Table(border="0") for name, pattern, description, emptyflag in mlist.topics: + if emptyflag: + continue quotedname = urllib.quote_plus(name) details = Link(mlist.GetScriptURL('options') + '/%s/?VARHELP=%s' % (user, quotedname), diff --git a/Mailman/Defaults.py.in b/Mailman/Defaults.py.in index a18f3a93..8be182ac 100644 --- a/Mailman/Defaults.py.in +++ b/Mailman/Defaults.py.in @@ -217,11 +217,13 @@ DEFAULT_ARCHIVE_PRIVATE = 0 # ARCHIVE_TO_MBOX #-1 - do not do any archiving # 0 - do not archive to mbox, use builtin mailman html archiving only -# 1 - archive to mbox to use an external archiving mechanism only -# 2 - archive to both mbox and builtin mailman html archiving - -# use this to make both external archiving mechanism work and -# mailman's builtin html archiving. the flat mail file can be -# useful for searching, external archivers, etc. +# 1 - do not use builtin mailman html archiving, archive to mbox only +# 2 - archive to both mbox and builtin mailman html archiving. +# See the settings below for PUBLIC_EXTERNAL_ARCHIVER and +# PRIVATE_EXTERNAL_ARCHIVER which can be used to replace mailman's +# builtin html archiving with an external archiver. The flat mail +# mbox file can be useful for searching, and is another way to +# interface external archivers, etc. ARCHIVE_TO_MBOX = 2 # 0 - yearly diff --git a/Mailman/Handlers/CalcRecips.py b/Mailman/Handlers/CalcRecips.py index e065ad68..75a8a457 100644 --- a/Mailman/Handlers/CalcRecips.py +++ b/Mailman/Handlers/CalcRecips.py @@ -1,4 +1,4 @@ -# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -12,7 +12,8 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. """Calculate the regular (i.e. non-digest) recipients of the message. @@ -91,6 +92,10 @@ delivery. The original message as received by Mailman is attached. def do_topic_filters(mlist, msg, msgdata, recips): + if not mlist.topics_enabled: + # MAS: if topics are currently disabled for the list, send to all + # regardless of ReceiveNonmatchingTopics + return hits = msgdata.get('topichits') zaprecips = [] if hits: diff --git a/Mailman/Handlers/CleanseDKIM.py b/Mailman/Handlers/CleanseDKIM.py index 0c548a9a..c4b06613 100644 --- a/Mailman/Handlers/CleanseDKIM.py +++ b/Mailman/Handlers/CleanseDKIM.py @@ -29,8 +29,8 @@ from Mailman import mm_cfg def process(mlist, msg, msgdata): - if not mm_cfg.REMOVE_DKIM_HEADERS: - return - del msg['domainkey-signature'] - del msg['dkim-signature'] + if mm_cfg.REMOVE_DKIM_HEADERS: + del msg['domainkey-signature'] + del msg['dkim-signature'] + del msg['authentication-results'] diff --git a/Mailman/Handlers/Hold.py b/Mailman/Handlers/Hold.py index f6008d45..d4af8f9a 100644 --- a/Mailman/Handlers/Hold.py +++ b/Mailman/Handlers/Hold.py @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2006 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -283,6 +283,8 @@ also appear in the first line of the body of the reply.""")), dmsg['Subject'] = 'confirm ' + cookie dmsg['Sender'] = requestaddr dmsg['From'] = requestaddr + dmsg['Date'] = email.Utils.formatdate(localtime=True) + dmsg['Message-ID'] = Utils.unique_message_id(mlist) nmsg.attach(text) nmsg.attach(MIMEMessage(msg)) nmsg.attach(MIMEMessage(dmsg)) diff --git a/Mailman/Handlers/MimeDel.py b/Mailman/Handlers/MimeDel.py index 906b12c3..523b3dfc 100644 --- a/Mailman/Handlers/MimeDel.py +++ b/Mailman/Handlers/MimeDel.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2005 by the Free Software Foundation, Inc. +# Copyright (C) 2002-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -256,4 +256,4 @@ def get_file_ext(m): fext = fext[1:] else: fext = '' - return fext + return fext.lower() diff --git a/Mailman/Handlers/Scrubber.py b/Mailman/Handlers/Scrubber.py index 48660038..588dd9ac 100644 --- a/Mailman/Handlers/Scrubber.py +++ b/Mailman/Handlers/Scrubber.py @@ -45,7 +45,7 @@ from Mailman.Logging.Syslog import syslog # Path characters for common platforms pre = re.compile(r'[/\\:]') # All other characters to strip out of Content-Disposition: filenames -# (essentially anything that isn't an alphanum, dot, slash, or underscore. +# (essentially anything that isn't an alphanum, dot, dash, or underscore). sre = re.compile(r'[^-\w.]') # Regexp to strip out leading dots dre = re.compile(r'^\.*') @@ -298,7 +298,7 @@ URL: %(url)s # If the message isn't a multipart, then we'll strip it out as an # attachment that would have to be separately downloaded. Pipermail # will transform the url into a hyperlink. - elif part and not part.is_multipart(): + elif part._payload and not part.is_multipart(): payload = part.get_payload(decode=True) ctype = part.get_type() # XXX Under email 2.5, it is possible that payload will be None. @@ -349,7 +349,8 @@ URL: %(url)s text = [] for part in msg.walk(): # TK: bug-id 1099138 and multipart - if not part or part.is_multipart(): + # MAS test payload - if part may fail if there are no headers. + if not part._payload or part.is_multipart(): continue # All parts should be scrubbed to text/plain by now. partctype = part.get_content_type() @@ -447,8 +448,6 @@ def save_attachment(mlist, msg, dir, filter_html=True): ext = fnext or guess_extension(ctype, fnext) else: ext = guess_extension(ctype, fnext) - # Allow only alphanumerics, dash, underscore, and dot - ext = sre.sub('', ext) if not ext: # We don't know what it is, so assume it's just a shapeless # application/octet-stream, unless the Content-Type: is @@ -458,6 +457,8 @@ def save_attachment(mlist, msg, dir, filter_html=True): ext = '.txt' else: ext = '.bin' + # Allow only alphanumerics, dash, underscore, and dot + ext = sre.sub('', ext) path = None # We need a lock to calculate the next attachment number lockfile = os.path.join(fsdir, 'attachments.lock') diff --git a/Mailman/MailList.py b/Mailman/MailList.py index e07e23aa..b08b5973 100644 --- a/Mailman/MailList.py +++ b/Mailman/MailList.py @@ -470,6 +470,7 @@ class MailList(HTMLFormatter, Deliverer, ListAdmin, # def Create(self, name, admin, crypted_password, langs=None, emailhost=None): + assert name == name.lower(), 'List name must be all lower case.' if Utils.list_exists(name): raise Errors.MMListAlreadyExistsError, name # Validate what will be the list's posting address. If that's diff --git a/Mailman/Queue/CommandRunner.py b/Mailman/Queue/CommandRunner.py index e08d02eb..5920b89f 100644 --- a/Mailman/Queue/CommandRunner.py +++ b/Mailman/Queue/CommandRunner.py @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2004 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -93,7 +93,7 @@ class Results: if part is None: # E.g the outer Content-Type: was text/html return - body = part.get_payload() + body = part.get_payload(decode=True) # text/plain parts better have string payloads assert isinstance(body, StringType) or isinstance(body, UnicodeType) lines = body.splitlines() diff --git a/Mailman/Queue/MaildirRunner.py b/Mailman/Queue/MaildirRunner.py index 39971ae2..d9fe02cb 100644..100755 --- a/Mailman/Queue/MaildirRunner.py +++ b/Mailman/Queue/MaildirRunner.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002 by the Free Software Foundation, Inc. +# Copyright (C) 2002-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -12,7 +12,8 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. """Maildir pre-queue runner. @@ -66,11 +67,22 @@ from Mailman.Logging.Syslog import syslog # listname-request@ lre = re.compile(r""" ^ # start of string - (?P<listname>[^-@]+) # listname@ or listname-subq@ + (?P<listname>[^+@]+?) # listname@ or listname-subq@ (non-greedy) (?: # non-grouping - # dash separator - (?P<subq>[^-+@]+) # everything up to + or - or @ + (?P<subq> # any known suffix + admin| + bounces| + confirm| + join| + leave| + owner| + request| + subscribe| + unsubscribe + ) )? # if it exists + [+@] # followed by + or @ """, re.VERBOSE | re.IGNORECASE) diff --git a/Mailman/versions.py b/Mailman/versions.py index eff8ffdb..cffe5c6a 100644 --- a/Mailman/versions.py +++ b/Mailman/versions.py @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2005 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -483,10 +483,11 @@ def NewRequestsDatabase(l): # blow away the original timestamp and request id. This means the # request will live a little longer than it possibly should have, # but that's no big deal. + import email for p in v: author, text = p[2] reason = p[3] - msg = Message.OutgoingMessage(text) + msg = email.message_from_string(text, Message.Message) l.HoldMessage(msg, reason) del r[k] elif k == 'add_member': @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 7462 . +# From configure.in Revision: 8122 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # @@ -1446,7 +1446,14 @@ else: except distutils.errors.DistutilsPlatformError: res = "no" else: - res = "yes" + # some RedHat packages put distutils in python, but the C headers + # are in python-devel so check for headers too. + import os.path + pdothpath = distutils.sysconfig.get_config_var('CONFINCLUDEPY') + if os.path.isfile(os.path.join(pdothpath, "Python.h")): + res = "yes" + else: + res = "no" fp = open("conftest.out", "w") fp.write("%s\n" % res) fp.close() @@ -1462,13 +1469,15 @@ then ***** Distutils is not available or is incomplete for $PYTHON ***** If you installed Python from RPM (or other package manager) ***** be sure to install the -devel package, or install Python -***** from source. See README.LINUX for details" >&5 +***** from source. See sec. 15.1 of the Installation Manual for +***** details" >&5 echo "$as_me: error: ***** Distutils is not available or is incomplete for $PYTHON ***** If you installed Python from RPM (or other package manager) ***** be sure to install the -devel package, or install Python -***** from source. See README.LINUX for details" >&2;} +***** from source. See sec. 15.1 of the Installation Manual for +***** details" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $havedistutils" >&5 @@ -4369,9 +4378,10 @@ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs diff --git a/configure.in b/configure.in index 55454148..b97df6d2 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2006 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -101,7 +101,14 @@ else: except distutils.errors.DistutilsPlatformError: res = "no" else: - res = "yes" + # some RedHat packages put distutils in python, but the C headers + # are in python-devel so check for headers too. + import os.path + pdothpath = distutils.sysconfig.get_config_var('CONFINCLUDEPY') + if os.path.isfile(os.path.join(pdothpath, "Python.h")): + res = "yes" + else: + res = "no" fp = open("conftest.out", "w") fp.write("%s\n" % res) fp.close() @@ -117,7 +124,8 @@ then ***** Distutils is not available or is incomplete for $PYTHON ***** If you installed Python from RPM (or other package manager) ***** be sure to install the -devel package, or install Python -***** from source. See README.LINUX for details]) +***** from source. See sec. 15.1 of the Installation Manual for +***** details]) fi AC_MSG_RESULT($havedistutils) diff --git a/misc/paths.py.in b/misc/paths.py.in index 3566a12c..bbf18fc7 100644 --- a/misc/paths.py.in +++ b/misc/paths.py.in @@ -1,6 +1,6 @@ # -*- python -*- -# Copyright (C) 1998-2005 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,8 +24,9 @@ # attributes that other modules may use to get the absolute path to the # installed Mailman distribution. -import sys import os +import sys +from warnings import filterwarnings # some scripts expect this attribute to be in this module prefix = '@prefix@' @@ -35,6 +36,9 @@ exec_prefix = '@exec_prefix@' if exec_prefix == '${prefix}': exec_prefix = prefix +# Supress Python 2.5 warning about string exceptions. +filterwarnings('ignore', '.* string exception', DeprecationWarning) + # Check if ja/ko codecs are available before changing path. try: s = unicode('OK', 'iso-2022-jp') |