Create mail_utils test with latin1 encoded mail
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 15 Jul 2019 11:02:19 +0000 (13:02 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 8 Aug 2019 09:54:43 +0000 (11:54 +0200)
test/test_mail_utils.py

index 33cb198..eb65ece 100644 (file)
@@ -97,6 +97,64 @@ ENVELOPE_END = '.\n'
 
 ATTACHMENT_FILENAME = '2018年度公开课计划表.xlsx'
 
+LATIN1_MAIL = b'\n'.join((
+    b'Return-Path: <postmaster@vm1.net.lan>',
+    b'Received: from vm1.net.lan ([unix socket])',
+    b'\t by vm1.net.lan with LMTPA;',
+    b'\t Mon, 15 Jul 2019 09:08:56 +0200',
+    b'X-Sieve: CMU Sieve 2.4',
+    b'Received: from localhost (vm1.net.lan [127.0.0.1])',
+    b'\tby localhost (Postfix) with ESMTP id E7BBE1F460',
+    b'\tfor <postmaster@vm1.net.lan>; Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+    b'X-Virus-Scanned: by Intra2net Mail Security (AVE=8.3.54.20,VDF=8.15.29.48)',
+    b'X-Spam-Status: No, score=-208 required=5 tests=[ALL_INTERNAL=-200,',
+    b'\tALL_TRUSTED=-2, BAYES_00=-6] autolearn=Intra2net',
+    b'X-Spam-Level: 0',
+    b'Received: from vm1.net.lan ([127.0.0.1]) by vm1.net.lan (Postfix, from userid 0)',
+    b'\tid 97AD81F45E; Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+    b'Content-Type: text/plain; charset="iso-8859-1"',
+    b'To: postmaster@vm1.net.lan',
+    b'From: postmaster@vm1.net.lan',
+    b'Subject: Intra2net Business Server Update: Version 6.6.0 installiert',
+    b'Message-Id: <20190715070856.97AD81F45E@vm1.net.lan>',
+    b'Date: Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+    b'',
+    b'Eine neue Intra2net Business Server Version wurde vom Update-System installiert.',
+    b'Diese Version bringt folgende Neuerungen:',
+    b'',
+    b'Version: 6.6.0',
+    b'',
+    b'- Neuer Linux Kernel 4.19 steigert die Systemleistung',
+    b'  - Bis zu 30% h\xf6herer Durchsatz in der E-Mailverarbeitung',
+    b'  - Aktualisierte Treiber f\xfcr neue und bestehende Hardware',
+    b'  - Beschleunigter TCP-Verbindungsaufbau und mehr Durchsatz',
+    b'  - Viele neue Schutzfunktionen um Angriffe zu erschweren',
+    b'  - Performance bei Systemen mit 8GB und mehr Arbeitsspeicher gesteigert',
+    b'  - Neueste Version der VMware- und Hyper-V-Tools',
+    b'',
+    b'- Weitere Verbesserungen',
+    b'  - Der Anhangfilter kann jetzt schreibgesch\xfctzte',
+    b'    Excel-Dateien auf gef\xe4hrliche Makros untersuchen',
+    b'  - Schutz vor Durchprobieren von Passw\xf6rtern aus dem Internet versch\xe4rft',
+    b'  - Aktualisierte Spamfilter-Regeln',
+    b'',
+    b'- Kumulatives Sicherheitsupdate behebt 14 Schwachstellen',
+    b'  (ImageMagick-7.0.8-50, curl-7.65.1: CVE-2019-5435, libxml2-2.9.9:',
+    b'  CVE-2018-9251, CVE-2018-14567 und CVE-2018-14404, libxslt-1.1.33:',
+    b'  CVE-2019-11068, poppler-0.78.0, python-3.7.3: CVE-2019-9636, CVE-2019-9740',
+    b'  und CVE-2019-9947, python37-urllib3-1.24.3: CVE-2019-9740, sqlite-3.26.0:',
+    b'  CVE-2019-5827, CVE-2019-9936 und CVE-2019-9937)',
+    b'',
+    b'- Aktualisierung von Linux-Basisdiensten',
+    b'  (file-5.37, glib2-2.58.3, hyperv-daemons-20190303, iproute2-5.0,',
+    b'  iptables-1.8.3, kernel-4.19.57, linux-firmware-2019-06-18, mdadm-4.1,',
+    b'  open-vm-tools-10.3.10, openssl-1.0.2s, python37-oletools-0.54.2,',
+    b'  savapi-4.11.1)',
+    b'',
+    b'',
+    b'Hinweis: Dieses Update enth\xe4lt weiterhin einen 32-Bit Kernel.',
+    b'Der 64-Bit Kernel wird erst mit Update 6.7.0 im Herbst kommen.',
+))
 
 
 class MailUtilsFunctionTest(unittest.TestCase):
@@ -166,3 +224,31 @@ class MailUtilsFunctionTest(unittest.TestCase):
             msg.set_unixfrom('Autotest-Sender@localhost')
 
             self.assertEqual(mail_utils.parse_mail_date(msg), result)
+
+    def test_latin1_mail(self):
+        """Check reading mail with non-ascii chars not encoded with utf8"""
+        mail_file = join(self.temp_dir, 'update-mail')
+        with open(mail_file, 'xb') as writer:
+            writer.write(LATIN1_MAIL)
+
+        # check this does not raise a UnicodeDecodeError
+        msg1 = mail_utils.parse_mail_file(mail_file, headers_only=False)
+        msg2, fnames = mail_utils.parse_mail_file(mail_file, headers_only=True,
+                                                  attachment_filenames=True)
+        self.assertTupleEqual(fnames, tuple())
+
+        # check basic parsing worked
+        for msg in (msg1, msg2):
+            self.assertEqual(mail_utils.parse_mail_date(msg)
+                             .replace(tzinfo=None), dt(2019, 7, 15, 9, 8, 56))
+            self.assertEqual(msg['Subject'],
+                             'Intra2net Business Server Update: '
+                             'Version 6.6.0 installiert')
+            self.assertEqual(msg['Content-Type'],
+                             'text/plain; charset="iso-8859-1"')
+
+        # also test text finder
+        text = mail_utils.get_message_text(mail_file)
+        self.assertIn('Neuer Linux Kernel 4.19', text)
+        self.assertIn('30% höherer Durchsatz in der E-Mailverarbeitung', text)
+        self.assertIn('gefährliche Makros', text)