Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core


Commits:
5270bc38 by Tommy M. McGuire at 2021-05-20T21:47:03-05:00
Join header lines when getting senders

RFC2047-decode From header then join multi-line values of From, etc.,
headers before parsing out email addresses.

This should fix #903.

- - - - -
7775c730 by Mark Sapiro at 2021-05-21T03:17:36+00:00
Merge branch 'senders_long_header_issue_903' into 'master'

Decode and unfold header lines when getting senders.

Closes #903

See merge request mailman/mailman!865
- - - - -


3 changed files:

- src/mailman/docs/NEWS.rst
- src/mailman/email/message.py
- src/mailman/email/tests/test_message.py


Changes:

=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -65,6 +65,8 @@ Bugs
   accept emojis and other 4-byte unicode characters by using the utf8mb4
   character set instead of 3-byte. (Closes #891)
 * LMTP runner now sets unixfrom in incoming messages.  (Closes #904)
+* Message RFC2047-decodes and unfolds headers before looking for
+  senders. (Closes #903)
 
 Command line
 ------------


=====================================
src/mailman/email/message.py
=====================================
@@ -23,11 +23,12 @@ safe pickle deserialization, even if the email package adds 
additional Message
 attributes.
 """
 
+import re
 import email
 import email.message
 import email.utils
 
-from email.header import Header
+from email.header import Header, decode_header, make_header
 from email.mime.multipart import MIMEMultipart
 from mailman.config import config
 from mailman.interfaces.address import IEmailValidator
@@ -107,7 +108,12 @@ class Message(email.message.Message):
             else:
                 for field_value in self.get_all(header, []):
                     # Convert the header to str in case it's a Header instance.
-                    name, address = email.utils.parseaddr(str(field_value))
+                    header_value = re.sub(
+                        '[\r\n]',
+                        '',
+                        str(make_header(decode_header(field_value)))
+                        )
+                    name, address = email.utils.parseaddr(header_value)
                     senders.append(address.lower())
         # Filter out invalid addresses, None and the empty string, and convert
         # to unicode.


=====================================
src/mailman/email/tests/test_message.py
=====================================
@@ -99,6 +99,14 @@ Test content
         # Make sure the senders property does not fail
         self.assertEqual(msg.senders, ['t...@example.com'])
 
+    def test_senders_long_header(self):
+        msg = Message()
+        msg['From'] = (
+            '"User, A. Very Long Name W. (CNTR-DEPT)[An Employer,\r\n'
+            ' Inc.]" <a.use...@example.org>'
+            )
+        self.assertEqual(msg.senders, ['a.use...@example.org'])
+
     def test_user_notification_bad_charset(self):
         msg = UserNotification(
             'aper...@example.com',



View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/71c2e368708bd9bfab4adeb4f569cb75e58852c3...7775c730b6a3225ebdcb60a8e6d8b14bc7975d06

-- 
View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/71c2e368708bd9bfab4adeb4f569cb75e58852c3...7775c730b6a3225ebdcb60a8e6d8b14bc7975d06
You're receiving this email because of your account on gitlab.com.


_______________________________________________
Mailman-checkins mailing list -- mailman-checkins@python.org
To unsubscribe send an email to mailman-checkins-le...@python.org
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: arch...@jab.org

Reply via email to