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<addr>[^']*)'")),
+    # Prodigy.net full mailbox
+    (_c("User's mailbox is full:"),
+     _c('Unable to deliver mail.'),
+     _c("User's mailbox is full:\s*<(?P<addr>.*)>.*$")),
     # 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>, <mailto:%s?subject=%ssubscribe>'
     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)
