diff options
| author | Mark Sapiro | 2015-10-08 13:15:53 -0700 |
|---|---|---|
| committer | Barry Warsaw | 2015-10-29 22:23:30 -0400 |
| commit | aed50db488213b0fec32d82100cf9367fc2f7d9c (patch) | |
| tree | 1c7782ef26480f59f61c0d6d041bea2686f8bb05 | |
| parent | 7fe776a29281dc42e3274f7cf9cc5300dca61783 (diff) | |
| download | mailman-aed50db488213b0fec32d82100cf9367fc2f7d9c.tar.gz mailman-aed50db488213b0fec32d82100cf9367fc2f7d9c.tar.zst mailman-aed50db488213b0fec32d82100cf9367fc2f7d9c.zip | |
| -rw-r--r-- | src/mailman/handlers/docs/subject-munging.rst | 24 | ||||
| -rw-r--r-- | src/mailman/handlers/subject_prefix.py | 26 |
2 files changed, 31 insertions, 19 deletions
diff --git a/src/mailman/handlers/docs/subject-munging.rst b/src/mailman/handlers/docs/subject-munging.rst index de22a928c..02d56514a 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,8 @@ And again, with an RFC 2047 encoded header. ... ... """) >>> process(mlist, msg, {}) + >>> print(msg['subject'].encode()) + [XTest] =?iso-2022-jp?b?GyRCJWEhPCVrJV4lcxsoQg==?= + >>> print(msg['subject']) + [XTest] メールマン -.. - # 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=?= 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: |
