Index: Mailman/Archiver/HyperArch.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Archiver/HyperArch.py,v retrieving revision 2.37.2.19 retrieving revision 2.37.2.20 diff -u -r2.37.2.19 -r2.37.2.20 --- Mailman/Archiver/HyperArch.py 30 Dec 2005 18:50:07 -0000 2.37.2.19 +++ Mailman/Archiver/HyperArch.py 9 Jan 2006 07:33:36 -0000 2.37.2.20 @@ -569,16 +569,21 @@ if d['_message_id']: headers.append('Message-ID: %(_message_id)s') body = EMPTYSTRING.join(self.body) - if isinstance(body, types.UnicodeType): - body = body.encode(Utils.GetCharSet(self._lang), 'replace') + cset = Utils.GetCharSet(self._lang) + # Coerce the body to Unicode and replace any invalid characters. + if not isinstance(body, types.UnicodeType): + body = unicode(body, cset, 'replace') if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS: otrans = i18n.get_translation() try: + atmark = unicode(_(' at '), cset) i18n.set_language(self._lang) body = re.sub(r'([-+,.\w]+)@([-+.\w]+)', - '\g<1>' + _(' at ') + '\g<2>', body) + '\g<1>' + atmark + '\g<2>', body) finally: i18n.set_translation(otrans) + # Return body to character set of article. + body = body.encode(cset, 'replace') return NL.join(headers) % d + '\n\n' + body + '\n' def _set_date(self, message): Index: Mailman/Bouncers/SimpleMatch.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Bouncers/SimpleMatch.py,v retrieving revision 2.10.2.2 retrieving revision 2.10.2.3 diff -u -r2.10.2.2 -r2.10.2.3 --- Mailman/Bouncers/SimpleMatch.py 27 Aug 2005 01:40:15 -0000 2.10.2.2 +++ Mailman/Bouncers/SimpleMatch.py 9 Jan 2006 17:53:56 -0000 2.10.2.3 @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2003 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2006 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. """Recognizes simple heuristically delimited bounces.""" @@ -74,6 +75,10 @@ (_c('This message was created automatically by mail delivery'), _c('^---- START OF RETURNED MESSAGE ----'), _c("addressed to '(?P[^']*)'")), + # Prodigy.net full mailbox + (_c("User's mailbox is full:"), + _c('Unable to deliver mail.'), + _c("User's mailbox is full:\s*<(?P.*)>.*$")), # Next one goes here... ] Index: Mailman/Cgi/edithtml.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Cgi/edithtml.py,v retrieving revision 2.16.2.6 retrieving revision 2.16.2.7 diff -u -r2.16.2.6 -r2.16.2.7 --- Mailman/Cgi/edithtml.py 30 Dec 2005 18:50:07 -0000 2.16.2.6 +++ Mailman/Cgi/edithtml.py 9 Jan 2006 07:06:52 -0000 2.16.2.7 @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2005 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2006 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 @@ -20,6 +20,7 @@ import os import cgi import errno +import re from Mailman import Utils from Mailman import MailList Index: Mailman/Gui/Topics.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Gui/Topics.py,v retrieving revision 2.6.2.3 retrieving revision 2.6.2.4 diff -u -r2.6.2.3 -r2.6.2.4 --- Mailman/Gui/Topics.py 27 Aug 2005 01:40:15 -0000 2.6.2.3 +++ Mailman/Gui/Topics.py 14 Jan 2006 10:21:49 -0000 2.6.2.4 @@ -91,6 +91,9 @@ ] def handleForm(self, mlist, category, subcat, cgidata, doc): + # MAS: Did we come from the authentication page? + if not cgidata.has_key('topic_box_01'): + return topics = [] # We start i at 1 and keep going until we no longer find items keyed # with the marked tags. Index: Mailman/Handlers/CookHeaders.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/CookHeaders.py,v retrieving revision 2.33.2.18 retrieving revision 2.33.2.19 diff -u -r2.33.2.18 -r2.33.2.19 --- Mailman/Handlers/CookHeaders.py 30 Dec 2005 18:50:08 -0000 2.33.2.18 +++ Mailman/Handlers/CookHeaders.py 1 Jan 2006 20:43:23 -0000 2.33.2.19 @@ -193,10 +193,9 @@ # We always add a List-ID: header. del msg['list-id'] msg['List-Id'] = listid_h - # For internally crafted messages, we - # also add a (nonstandard), "X-List-Administrivia: yes" header. For all - # others (i.e. those coming from list posts), we adda a bunch of other RFC - # 2369 headers. + # For internally crafted messages, we also add a (nonstandard), + # "X-List-Administrivia: yes" header. For all others (i.e. those coming + # from list posts), we add a bunch of other RFC 2369 headers. requestaddr = mlist.GetRequestEmail() subfieldfmt = '<%s>, ' listinfo = mlist.GetScriptURL('listinfo', absolute=1) Index: Mailman/Handlers/SpamDetect.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/SpamDetect.py,v retrieving revision 2.3.2.10 retrieving revision 2.3.2.11 diff -u -r2.3.2.10 -r2.3.2.11 --- Mailman/Handlers/SpamDetect.py 31 Dec 2005 06:15:33 -0000 2.3.2.10 +++ Mailman/Handlers/SpamDetect.py 14 Jan 2006 10:11:19 -0000 2.3.2.11 @@ -1,4 +1,4 @@ -# Copyright (C) 1998-2005 by the Free Software Foundation, Inc. +# Copyright (C) 1998-2006 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 @@ -92,8 +92,7 @@ def process(mlist, msg, msgdata): - if msgdata.get('approved') or msgdata.get('reduced_list_headers'): - # TK: 'reduced_list_headers' is intenally crafted message (virgin). + if msgdata.get('approved'): return # First do site hard coded header spam checks for header, regex in mm_cfg.KNOWN_SPAMMERS: @@ -103,20 +102,23 @@ if mo: # we've detected spam, so throw the message away raise SpamDetected + # Before we go to header_filter_rules, we exclude internally generated + # owner notification from checking, because 1) we collect headers from + # all the attachments but this will cause matching the filter rule again, + # and 2) list owners may want to check header name / value pair like + # 'Precedence: bulk' which is also generated by mailman. Both will + # cause loop of holding owner notification messages if the action is + # set to 'hold'. + if msgdata.get('toowner') and msg.get('x-list-administrivia') == 'yes': + return # Now do header_filter_rules # TK: Collect headers in sub-parts because attachment filename # extension may be a clue to possible virus/spam. - if msg.is_multipart(): - headers = '' - for p in msg.walk(): - g = HeaderGenerator(StringIO()) - g.flatten(p) - headers += g.header_text() - else: - # Only the top level header should be checked. + headers = '' + for p in msg.walk(): g = HeaderGenerator(StringIO()) - g.flatten(msg) - headers = g.header_text() + g.flatten(p) + headers += g.header_text() # Now reshape headers (remove extra CR and connect multiline). headers = re.sub('\n+', '\n', headers) headers = re.sub('\n\s', ' ', headers)