summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw2015-10-29 22:47:29 -0400
committerBarry Warsaw2015-10-29 22:47:29 -0400
commit8b9a6f2d534f8d39f1a6f1dc6ac818a004455069 (patch)
tree4b6520c332bcab9c0f10164e0c7d512d354c66ee
parent7fe776a29281dc42e3274f7cf9cc5300dca61783 (diff)
parenta4ef7fec146da4ddceffb8d80020d668e232b807 (diff)
downloadmailman-8b9a6f2d534f8d39f1a6f1dc6ac818a004455069.tar.gz
mailman-8b9a6f2d534f8d39f1a6f1dc6ac818a004455069.tar.zst
mailman-8b9a6f2d534f8d39f1a6f1dc6ac818a004455069.zip
-rw-r--r--src/mailman/docs/NEWS.rst2
-rw-r--r--src/mailman/handlers/docs/subject-munging.rst25
-rw-r--r--src/mailman/handlers/subject_prefix.py26
3 files changed, 33 insertions, 20 deletions
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst
index 424c42916..054cf5ffd 100644
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -40,6 +40,8 @@ Bugs
* Core no longer depends on the standalone `mock` module. (Closes: #146)
* The logging of moderation reasons has been fixed. Given by Aurélien
Bompard.
+ * Collapse multiple ``Re:`` in Subject headers. Given by Mark Sapiro.
+ (Closes: #147)
Configuration
-------------
diff --git a/src/mailman/handlers/docs/subject-munging.rst b/src/mailman/handlers/docs/subject-munging.rst
index de22a928c..c60d6a271 100644
--- a/src/mailman/handlers/docs/subject-munging.rst
+++ b/src/mailman/handlers/docs/subject-munging.rst
@@ -83,6 +83,20 @@ where it will stay.
>>> print(msg['subject'])
[XTest] Re: Something important
+Sometimes the incoming ``Subject`` header has a pathological sequence of
+``Re:`` like markers. These should all be collapsed up to the first non-``Re:``
+marker.
+
+ >>> msg = message_from_string("""\
+ ... From: aperson@example.com
+ ... Subject: [XTest] Re: RE : Re: Re: Re: Re: Re: Something important
+ ...
+ ... A message of great import.
+ ... """)
+ >>> process(mlist, msg, {})
+ >>> print(msg['subject'])
+ [XTest] Re: Something important
+
Internationalized headers
=========================
@@ -207,10 +221,7 @@ And again, with an RFC 2047 encoded header.
...
... """)
>>> process(mlist, msg, {})
-
-..
- # XXX This one does not appear to work the same way as
- # test_subject_munging_prefix_crooked() in the old Python-based tests. I need
- # to get Tokio to look at this.
- # >>> print(msg['subject'])
- # [XTest] =?iso-2022-jp?b?IBskQiVhITwlayVeJXMbKEI=?=
+ >>> print(msg['subject'].encode())
+ [XTest] =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?=
+ >>> print(msg['subject'])
+ [XTest] メールマン
diff --git a/src/mailman/handlers/subject_prefix.py b/src/mailman/handlers/subject_prefix.py
index 1f360e7ce..72409dbd3 100644
--- a/src/mailman/handlers/subject_prefix.py
+++ b/src/mailman/handlers/subject_prefix.py
@@ -30,7 +30,7 @@ from mailman.interfaces.handler import IHandler
from zope.interface import implementer
-RE_PATTERN = '((RE|AW|SV|VS)(\[\d+\])?:\s*)+'
+RE_PATTERN = '\s*((RE|AW|SV|VS)(\[\d+\])?\s*:\s*)+'
ASCII_CHARSETS = (None, 'ascii', 'us-ascii')
EMPTYSTRING = ''
@@ -43,12 +43,6 @@ def ascii_header(mlist, msgdata, subject, prefix, prefix_pattern, ws):
if charset not in ASCII_CHARSETS:
return None
subject_text = EMPTYSTRING.join(str(subject).splitlines())
- rematch = re.match(RE_PATTERN, subject_text, re.I)
- if rematch:
- subject_text = subject_text[rematch.end():]
- recolon = 'Re: '
- else:
- recolon = ''
# At this point, the subject may become null if someone posted mail
# with "Subject: [subject prefix]".
if subject_text.strip() == '':
@@ -57,6 +51,12 @@ def ascii_header(mlist, msgdata, subject, prefix, prefix_pattern, ws):
else:
subject_text = re.sub(prefix_pattern, '', subject_text)
msgdata['stripped_subject'] = subject_text
+ rematch = re.match(RE_PATTERN, subject_text, re.I)
+ if rematch:
+ subject_text = subject_text[rematch.end():]
+ recolon = 'Re: '
+ else:
+ recolon = ''
lines = subject_text.splitlines()
first_line = [lines[0]]
if recolon:
@@ -77,12 +77,6 @@ def all_same_charset(mlist, msgdata, subject, prefix, prefix_pattern, ws):
if charset != list_charset:
return None
subject_text = EMPTYSTRING.join(chunks)
- rematch = re.match(RE_PATTERN, subject_text, re.I)
- if rematch:
- subject_text = subject_text[rematch.end():]
- recolon = 'Re: '
- else:
- recolon = ''
# At this point, the subject may become null if someone posted mail
# with "Subject: [subject prefix]".
if subject_text.strip() == '':
@@ -91,6 +85,12 @@ def all_same_charset(mlist, msgdata, subject, prefix, prefix_pattern, ws):
else:
subject_text = re.sub(prefix_pattern, '', subject_text)
msgdata['stripped_subject'] = subject_text
+ rematch = re.match(RE_PATTERN, subject_text, re.I)
+ if rematch:
+ subject_text = subject_text[rematch.end():]
+ recolon = 'Re: '
+ else:
+ recolon = ''
lines = subject_text.splitlines()
first_line = [lines[0]]
if recolon: