From 7e8581909e03ead3721bf12f7ab2a1d38356d0cd Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 19 Jul 2016 15:19:22 +0200 Subject: [PATCH] Fixed "PG::NotNullViolation: ERROR: null value in column "content_type" violates not-null constraint" for mails with non text/* alternative content. --- app/models/channel/email_parser.rb | 1 + test/fixtures/mail38.box | 53 ++++ test/fixtures/mail39.box | 456 +++++++++++++++++++++++++++++ test/fixtures/mail40.box | 94 ++++++ test/fixtures/mail41.box | 127 ++++++++ test/fixtures/mail42.box | 75 +++++ test/unit/email_parser_test.rb | 111 ++++++- test/unit/email_process_test.rb | 28 ++ 8 files changed, 941 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/mail38.box create mode 100644 test/fixtures/mail39.box create mode 100644 test/fixtures/mail40.box create mode 100644 test/fixtures/mail41.box create mode 100644 test/fixtures/mail42.box diff --git a/app/models/channel/email_parser.rb b/app/models/channel/email_parser.rb index d307d6dec..afd7871ba 100644 --- a/app/models/channel/email_parser.rb +++ b/app/models/channel/email_parser.rb @@ -236,6 +236,7 @@ class Channel::EmailParser else filename = '-no name-' data[:body] = 'no visible content' + data[:content_type] = 'text/plain' # add body as attachment headers_store = { diff --git a/test/fixtures/mail38.box b/test/fixtures/mail38.box new file mode 100644 index 000000000..64aef6399 --- /dev/null +++ b/test/fixtures/mail38.box @@ -0,0 +1,53 @@ +Return-Path: +X-Original-To: me@example.net +Delivered-To: martin@arber.example.com +Received: from [10.8.0.6] (kanzel.example.com [5.9.62.170]) + by arber.example.com (Postfix) with ESMTPSA id B277D601E0 + for ; Tue, 19 Jul 2016 13:55:37 +0200 (CEST) +From: Martin Edenhofer +X-Pgp-Agent: GPGMail +Content-Type: multipart/signed; boundary="Apple-Mail=_145CC1F4-7271-407C-B5D2-D9E0653251C7"; protocol="application/pgp-signature"; micalg=pgp-sha512 +Subject: =?utf-8?Q?test_1234_=C3=A4=C3=B6=C3=BC_sig_test_without_attachme?= + =?utf-8?Q?nt_?= +Date: Tue, 19 Jul 2016 13:57:07 +0200 +Message-Id: <5CDFC2DC-B880-4329-B98C-200B6ED3476B@example.com> +To: Martin Edenhofer +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +X-Mailer: Apple Mail (2.3124) + + +--Apple-Mail=_145CC1F4-7271-407C-B5D2-D9E0653251C7 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=utf-8 + +test 1234 =C3=A4=C3=B6=C3=BC sig test without attachment + + +--Apple-Mail=_145CC1F4-7271-407C-B5D2-D9E0653251C7 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; + filename=signature.asc +Content-Type: application/pgp-signature; + name=signature.asc +Content-Description: Message signed with OpenPGP using GPGMail + +-----BEGIN PGP SIGNATURE----- +Comment: GPGTools - https://gpgtools.org + +iQIcBAEBCgAGBQJXjhWXAAoJEDZIwfYs2Fy5FvYQAKkG0qRe6iEBusrNuu7FNGMw +bXhefZ6D4SDUgMGHywYmm3ssPY+a3SYiRRaN0m4FavVVtQ7JTcKm7I2e60czWUX7 +jcgQEVmQZCyH2rQ4sWiMDyS8CMSzj1uDOiHIHGXD6CmHLzrSog2H275BGzd00V3F +FNmr1esSiMuf69t+WQthsi5FJEeeLvuJqDqGAHXJvsxCMRZJMxFLWJI+Ovqts1q5 +fKO91RKXtIuXoEQJVmqOkiGdD7idsvC9Ul5Iv7PFHuk+0Jg/UjcuZRhnieGgcs1d +aK/DFmwIAd4IT4acYoljovvqG9rvDDG9q0j83MzmazjmIn7U3hwjR5v5u/fXRcgD +CR5jgvkL1gT2AJF0J8vul0RebySNKcCRSSVSLSBdM0t4FIqWGQ/Iyzq2fpVeOLnw +LIJZ9c7cywMqZ0jK6DZ+F7UxrDIvckkPVe6YnND3/pC1X8Fehj0tWWb/hkIKRvHg +JReLLldwxDYzYLzhdwsE/w8wRKCnqUWDWuA1zlG1uWcHqo2RXn/YCKPcAMiMImoK +ZvxKpVA0QB+wuUx6TVr2I5La1rgyqkwo2TokfWuUVB7Kn/ugwSxloudQCtxTaTKZ +JrBf2SCw3+UDFFvURcnLzNmyNmnQI/5OIVliJERrw5I7b/auR7Royk9k7+DPEl+c +Teozs8ZFAE985ycipXRQ +=HLIq +-----END PGP SIGNATURE----- + +--Apple-Mail=_145CC1F4-7271-407C-B5D2-D9E0653251C7-- diff --git a/test/fixtures/mail39.box b/test/fixtures/mail39.box new file mode 100644 index 000000000..4973899a0 --- /dev/null +++ b/test/fixtures/mail39.box @@ -0,0 +1,456 @@ +Return-Path: +X-Original-To: me@example.net +Delivered-To: martin@arber.example.com +Received: from [10.8.0.6] (kanzel.example.com [5.9.62.170]) + by arber.example.com (Postfix) with ESMTPSA id 8B76B601E0 + for ; Tue, 19 Jul 2016 13:57:55 +0200 (CEST) +From: Martin Edenhofer +X-Pgp-Agent: GPGMail +Content-Type: multipart/signed; boundary="Apple-Mail=_B216F37C-FE24-4FDD-8959-B57CF74916A7"; protocol="application/pgp-signature"; micalg=pgp-sha512 +Subject: =?utf-8?Q?test_1234_=C3=A4=C3=B6=C3=BC_sig_test_with_attachment_?= +Date: Tue, 19 Jul 2016 13:59:29 +0200 +Message-Id: +To: Martin Edenhofer +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +X-Mailer: Apple Mail (2.3124) + + +--Apple-Mail=_B216F37C-FE24-4FDD-8959-B57CF74916A7 +Content-Type: multipart/alternative; + boundary="Apple-Mail=_655BA1FC-8E44-44BD-ADF9-739CC259E9B1" + + +--Apple-Mail=_655BA1FC-8E44-44BD-ADF9-739CC259E9B1 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=utf-8 + +test 1234 =C3=A4=C3=B6=C3=BC sig test with attachment + +--Apple-Mail=_655BA1FC-8E44-44BD-ADF9-739CC259E9B1 +Content-Type: multipart/related; + type="text/html"; + boundary="Apple-Mail=_DFC5FA49-2AFD-407E-AD0A-031D624D49CA" + + +--Apple-Mail=_DFC5FA49-2AFD-407E-AD0A-031D624D49CA +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; + charset=utf-8 + +test 1234 =C3=A4=C3=B6=C3=BC sig test with attachment
= + +--Apple-Mail=_DFC5FA49-2AFD-407E-AD0A-031D624D49CA +Content-Transfer-Encoding: base64 +Content-Disposition: inline; + filename=HKT_Super_Seven_GTS.jpeg +Content-Type: image/jpeg; + name="HKT_Super_Seven_GTS.jpeg" +Content-Id: <2ECB31C9-0E1D-4EBF-BD02-8D8B24208A3E@openvpn> + +/9j/4AAQSkZJRgABAQAASABIAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUA +AAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgA1QFAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAA +AAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQy +gZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm +Z2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS +09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYH +CAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1Lw +FWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5 +eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj +5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgK +CgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQ +EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAFP/aAAwDAQACEQMR +AD8A/QtclQX6nmkUgMG29KVnA2KQcn2qVxGduBjaK+jnq2eWiMhmIx0zjAqzpXlmS8kxjMjjnrnN +VGl2rwNu3HbsDVnQrlbn7X5akgyuwyMZ56880qFubUVTY0bmXftABO3qeg6VVDFSARxjOasTpNIo +jUFeevtUf2SVSW38njk13JnO4k0dxG8RCgbhgY71LCyktxg/1qgFlDvvwegyKsQ7lBD/ADc1cJO5 +EkjUVN0bYIHI/KlWGPayuePWqibjGTGSfm5x0pQsuD5vAHI9K6eZdjOxcjhUBCOB0qVVyHQYwKoJ +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 +--Apple-Mail=_DFC5FA49-2AFD-407E-AD0A-031D624D49CA-- + +--Apple-Mail=_655BA1FC-8E44-44BD-ADF9-739CC259E9B1-- + +--Apple-Mail=_B216F37C-FE24-4FDD-8959-B57CF74916A7 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; + filename=signature.asc +Content-Type: application/pgp-signature; + name=signature.asc +Content-Description: Message signed with OpenPGP using GPGMail + +-----BEGIN PGP SIGNATURE----- +Comment: GPGTools - https://gpgtools.org + +iQIcBAEBCgAGBQJXjhYhAAoJEDZIwfYs2Fy5FDQQAJV1DONaDgL8jET4N9qB9LaM +zDi0ScL0j2yY10zzKBJO7jys1IIesmXtdL/9LF8ZcJW55YRzlC39erbcPTN3efXV +8uSzmnNxtoCw6xwrlvD6RIfCb34lL002taNEHxFRT+a9LeHxgOKjISmI7Ng55A1q +fPqRQlUG9IkXa1wq2cq6C/LGsF5BRqTMtLPWhxLBCxpvn9iMsy58d+0qJ+axRQcj +YB9dpNO7DIj2wGte/voxx80xXSAbFqrGvpu5lJ3HSgJL6IS3NaaCsXy0p69oJv0h +KNrlam0s2Z7C/QlROp09NrojBOaBtB9nKNphL9ltUmDIJWWcAnNZMSTpaMvbFCjV +hMKvvKQXmO9Ch3m3ZZSyZMY4C3wDMJr6mFG9HGERKdsSO0AP26dNgeP0gd3AQn2H +p0dgJD6sXWH9IbzJezY2Iob7tkoY205reZA8sr4KOyzWwTWZ+ZjZAxf4UO1hicgE +ghmE3o9jmnIBkjYBvMPRqJZc2vguPEMCRYsogHHYwC1EAhPtzKUdwufy/cl7dLKs +weZuhwya1pkZWegyFLfKmKhOziHC0igZfC4hP6OfMOcAZVVbazAaZy1dtBLmsBk4 +MzN3V+YG9jy9ro1YzekeutXcIOg1kxEGr1YANfCfys3xo36W2Lgamr0+On+NJmTK +Vtg85M7FpRe+oDZtNwad +=KdLE +-----END PGP SIGNATURE----- + +--Apple-Mail=_B216F37C-FE24-4FDD-8959-B57CF74916A7-- diff --git a/test/fixtures/mail40.box b/test/fixtures/mail40.box new file mode 100644 index 000000000..075a7d2c7 --- /dev/null +++ b/test/fixtures/mail40.box @@ -0,0 +1,94 @@ +Return-Path: +X-Original-To: me@example.net +Delivered-To: martin@arber.example.com +Received: from [10.8.0.6] (kanzel.example.com [5.9.62.170]) + by arber.example.com (Postfix) with ESMTPSA id 01775601E0 + for ; Tue, 19 Jul 2016 14:19:41 +0200 (CEST) +From: Martin Edenhofer +Content-Type: multipart/signed; boundary="Apple-Mail=_E916CC44-C2DB-45AB-81ED-E15C11E13FC7"; protocol="application/pkcs7-signature"; micalg=sha1 +Subject: =?utf-8?Q?smime_signed_123_=C3=B6=C3=A4=C3=BC=C3=9F?= +Message-Id: <6CBC5EF1-1D45-4964-8C4A-652CC1C5736A@example.com> +Date: Tue, 19 Jul 2016 14:21:09 +0200 +To: Martin Edenhofer +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +X-Mailer: Apple Mail (2.3124) + + +--Apple-Mail=_E916CC44-C2DB-45AB-81ED-E15C11E13FC7 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=utf-8 + +smime signed 123 =C3=B6=C3=A4=C3=BC=C3=9F= + +--Apple-Mail=_E916CC44-C2DB-45AB-81ED-E15C11E13FC7 +Content-Disposition: attachment; + filename=smime.p7s +Content-Type: application/pkcs7-signature; + name=smime.p7s +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIJ5jCCBK8w +ggOXoAMCAQICEQDgI8sVEoNTia1hbnpUZ2shMA0GCSqGSIb3DQEBCwUAMG8xCzAJBgNVBAYTAlNF +MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5l +dHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QwHhcNMTQxMjIyMDAwMDAw +WhcNMjAwNTMwMTA0ODM4WjCBmzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxQTA/BgNV +BAMTOENPTU9ETyBTSEEtMjU2IENsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgU2VjdXJlIEVtYWls +IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAibEN2npTGU5wUh28VqYGJre4SeCW +51Gr8fBaE0kVo7SMG2C8elFCp3mMpCLfF2FOkdV2IwoU00oCf7YdCYBupQQ92bq7Fv6hh6kuQ1JD +FnyvMlDIpk9a6QjYz5MlnHuI6DBk5qT4VoD9KiQUMxeZrETlaYujRgZLwjPU6UCfBrCxrJNAubUI +kzqcKlOjENs9IGE8VQOO2U52JQIhKfqjfHF2T+7hX4Hp+1SA28N7NVK3hN4iPSwwLTF/Wb1SN7Az +aS1D6/rWpfGXd2dRjNnuJ+u8pQc4doykqTj/34z1A6xJvsr3c5k6DzKrnJU6Ez0ORjpXdGFQvsZA +P8vk4p+iIQIDAQABo4IBFzCCARMwHwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTLVBowHQYD +VR0OBBYEFJJha4LhoqCqT+xn8cKj97SAAMHsMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAG +AQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDARBgNVHSAECjAIMAYGBFUdIAAw +RAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC51c2VydHJ1c3QuY29tL0FkZFRydXN0RXh0ZXJu +YWxDQVJvb3QuY3JsMDUGCCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNl +cnRydXN0LmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAGypurFXBOquIxdjtzVXzqmthK8AJECOZD8Vm +am+x9bS1d14PAmEA330F/hKzpICAAPz7HVtqcgIKQbwFusFY1SbC6tVNhPv+gpjPWBvjImOcUvi7 +BTarfVil3qs7Y+Xa1XPv7OD7e+Kj//BCI5zKto1NPuRLGAOyqC3U2LtCS5BphRDbpjc06HvgARCl +nMo6x59PiDRuimXQGoq7qdzKyjbR9PzCZCk1r9axp3ER0gNDsY8+muyeMlP0dpLKhjQHuSzK5hxK +2JkNwYbikJL7WkJqIyEQ6WXH9dW7fuqMhSACYurROgcsWcWZM/I4ieW26RZ6H3kU9koQGib6fIr7 +mzCCBS8wggQXoAMCAQICEBeEnMB4lGs32wINyLRDpskwDQYJKoZIhvcNAQELBQAwgZsxCzAJBgNV +BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAY +BgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMUEwPwYDVQQDEzhDT01PRE8gU0hBLTI1NiBDbGllbnQg +QXV0aGVudGljYXRpb24gYW5kIFNlY3VyZSBFbWFpbCBDQTAeFw0xNjA3MTkwMDAwMDBaFw0xNzA3 +MTkyMzU5NTlaMB0xGzAZBgkqhkiG9w0BCQEWDG1lQHpudW55LmNvbTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBALHfJOoV34vwoc847F98yWiUOb99Bk2PKXk6WAJZelkR/f7Jc9nk5tyw +C5UGh+timSNavEE8DsWTY2k/uPCoGMCceGGqv15Ez3iETufh7IWkdteuWLAZVASISwqEE+Zj3vyY +Nlp6VaAUBSfR987nJA2ZTDdIxT/nLdw69OEyaK83cGM6+GbzxjfMn2x3CVvBfiqSe063lKZIInf5 +CvJX2xRb8vD8RtPMlZxfE578XkgrdHOzgc3tpkQsRceLUpGztXMiJ62oUdFpqrlSIh2c1iCe+tjV +YOFPaQpFRORXXA4WDfrJ36VOyAL12vxSGCjhO5U9jXKUG3IZZvrJYw00KicCAwEAAaOCAeowggHm +MB8GA1UdIwQYMBaAFJJha4LhoqCqT+xn8cKj97SAAMHsMB0GA1UdDgQWBBRk906PS8j0Dlc0EMYh +qByWxwE+ETAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAgBgNVHSUEGTAXBggrBgEFBQcD +BAYLKwYBBAGyMQEDBQIwEQYJYIZIAYb4QgEBBAQDAgUgMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQEC +AQEBMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMF0GA1UdHwRW +MFQwUqBQoE6GTGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1NIQTI1NkNsaWVudEF1dGhl +bnRpY2F0aW9uYW5kU2VjdXJlRW1haWxDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMFgGCCsGAQUF +BzAChkxodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9TSEEyNTZDbGllbnRBdXRoZW50aWNh +dGlvbmFuZFNlY3VyZUVtYWlsQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9j +YS5jb20wFwYDVR0RBBAwDoEMbWVAem51bnkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQBtqcD5NhMG +HAqCM0lk2nH9+Ytiz5JmnWP+gdAXnxRlBeOO+lFULVwUcROWHQpWLer+pVw/DHMxoa1DFO4i7cEu +TTebqYrdFua2pEiQ0JyYheqU9YH18D+2FpZD9rZV/PgcMWvnQbQyRqQtv051kphO3frX1yipYk4t +06GH+BJUw++q39b3nkwLFLCUhAytNgFMB55Q+KLOck/7oFslc57uDnnLxzfwq1eP1PHod5wuVB4l +x+JrkYku+MnPRpg/niKvI/IIJc71VyLuyagxamu7I7JhpLhbWQRLml0XUNK5fmmuGDs+4e4EKc73 +XKHCs1W7KFJNuBZM2hdh7DGTfyUtMYIDwzCCA78CAQEwgbAwgZsxCzAJBgNVBAYTAkdCMRswGQYD +VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9E +TyBDQSBMaW1pdGVkMUEwPwYDVQQDEzhDT01PRE8gU0hBLTI1NiBDbGllbnQgQXV0aGVudGljYXRp +b24gYW5kIFNlY3VyZSBFbWFpbCBDQQIQF4ScwHiUazfbAg3ItEOmyTAJBgUrDgMCGgUAoIIB5zAY +BgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNjA3MTkxMjIxMTBaMCMG +CSqGSIb3DQEJBDEWBBQ3ddz65DCR3Iq6nEVntKjQ8/n2fzCBwQYJKwYBBAGCNxAEMYGzMIGwMIGb +MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm +b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDFBMD8GA1UEAxM4Q09NT0RPIFNIQS0yNTYg +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBTZWN1cmUgRW1haWwgQ0ECEBeEnMB4lGs32wINyLRD +pskwgcMGCyqGSIb3DQEJEAILMYGzoIGwMIGbMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl +ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRl +ZDFBMD8GA1UEAxM4Q09NT0RPIFNIQS0yNTYgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBTZWN1 +cmUgRW1haWwgQ0ECEBeEnMB4lGs32wINyLRDpskwDQYJKoZIhvcNAQEBBQAEggEApreMz2926AMS +2Bor9kTUa9klTUBfRY0JFL/2NCB70VbX9Ta/+eFd/iZCuqimPNK4udntw9QbdQEAL925czUknze5 +qKBDuJuH1PPGPF7yeFN2PKhs2hXFT96znVQjBQFbL8MgwNxm2SJkoqiCG1IkldGxTYiZUCjoGSg+ +OQ5UWiFDntcEc8gnOey3V3qHwUowKOflMfblQLnb9DFypixYQEXWvnoa56wdT4pIy3BVVUlzUPSB +xDd6VIX1f9/2aVV56Hnaqhu4KJ1iRy9o+QVlOBrX/eUKaxxkTvaMBaXF8cI8o+us+laeo5odoJf4 +drE+TCetPOuHGM531CA+vIDcqAAAAAAAAA== +--Apple-Mail=_E916CC44-C2DB-45AB-81ED-E15C11E13FC7-- diff --git a/test/fixtures/mail41.box b/test/fixtures/mail41.box new file mode 100644 index 000000000..cfd756f3b --- /dev/null +++ b/test/fixtures/mail41.box @@ -0,0 +1,127 @@ +Return-Path: +X-Original-To: me@example.com +Delivered-To: martin@arber.example.com +Received: from [10.8.0.6] (kanzel.example.com [5.9.62.170]) + by arber.example.com (Postfix) with ESMTPSA id BCE0B601E0 + for ; Tue, 19 Jul 2016 14:30:13 +0200 (CEST) +From: Martin Edenhofer +Content-Type: application/pkcs7-mime; name=smime.p7m; smime-type=enveloped-data +Content-Transfer-Encoding: base64 +Subject: smime sign & crypt +Message-Id: <46E5CCBD-A82E-4B69-AF7B-6D31BF5310A3@example.com> +Date: Tue, 19 Jul 2016 14:31:34 +0200 +To: Martin Edenhofer +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +Content-Disposition: attachment; filename=smime.p7m +X-Mailer: Apple Mail (2.3124) + +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 +L53CZRwAAAAAAAAAAAAA diff --git a/test/fixtures/mail42.box b/test/fixtures/mail42.box new file mode 100644 index 000000000..5d4228567 --- /dev/null +++ b/test/fixtures/mail42.box @@ -0,0 +1,75 @@ +Return-Path: +X-Original-To: me@example.com +Delivered-To: martin@arber.example.com +Received: from [10.8.0.6] (kanzel.example.com [5.9.62.170]) + by arber.example.com (Postfix) with ESMTPSA id 9EF8E60224 + for ; Tue, 19 Jul 2016 15:02:37 +0200 (CEST) +Content-Type: multipart/encrypted; boundary="Apple-Mail=_DE081B18-44B3-4A09-BD5E-DF49265A26F4"; protocol="application/pgp-encrypted"; +Subject: pgp sign & crypt +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +X-Pgp-Agent: GPGMail +From: Martin Edenhofer +Date: Tue, 19 Jul 2016 15:04:12 +0200 +Content-Transfer-Encoding: 7bit +Message-Id: <7EF82667-B041-4188-9456-F9459CE65F4F@example.com> +Content-Description: OpenPGP encrypted message +To: Martin Edenhofer +X-Mailer: Apple Mail (2.3124) + +This is an OpenPGP/MIME encrypted message (RFC 2440 and 3156) +--Apple-Mail=_DE081B18-44B3-4A09-BD5E-DF49265A26F4 +Content-Transfer-Encoding: 7bit +Content-Type: application/pgp-encrypted +Content-Description: PGP/MIME Versions Identification + +Version: 1 + +--Apple-Mail=_DE081B18-44B3-4A09-BD5E-DF49265A26F4 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; + filename=encrypted.asc +Content-Type: application/octet-stream; + name=encrypted.asc +Content-Description: OpenPGP encrypted message + +-----BEGIN PGP MESSAGE----- +Comment: GPGTools - https://gpgtools.org + +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 +UwLmmw== +=natA +-----END PGP MESSAGE----- + +--Apple-Mail=_DE081B18-44B3-4A09-BD5E-DF49265A26F4-- diff --git a/test/unit/email_parser_test.rb b/test/unit/email_parser_test.rb index 7cd26b563..ab9549c77 100644 --- a/test/unit/email_parser_test.rb +++ b/test/unit/email_parser_test.rb @@ -559,6 +559,109 @@ end body: "Tag Max / Ingo!\n", }, }, + { + data: IO.binread('test/fixtures/mail38.box'), + body_md5: 'dcd25707eed638ea568644b206a8596e', + params: { + from: 'Martin Edenhofer ', + from_email: 'me@example.com', + from_display_name: 'Martin Edenhofer', + subject: 'test 1234 äöü sig test without attachment ', + to: 'Martin Edenhofer ', + cc: nil, + body: "test 1234 äöü sig test without attachment\n\n", + }, + attachments: [ + { + md5: '85223228046c010ce4298947018fa33f', + filename: 'signature.asc', + }, + ], + }, + { + data: IO.binread('test/fixtures/mail39.box'), + body_md5: 'b583c4705270fa73a28796b978e1e9ab', + params: { + from: 'Martin Edenhofer ', + from_email: 'me@example.com', + from_display_name: 'Martin Edenhofer', + subject: 'test 1234 äöü sig test with attachment ', + to: 'Martin Edenhofer ', + cc: nil, + body: 'test 1234 äöü sig test with attachment', + }, + attachments: [ + { + md5: 'c0b9a38d7c02516db9f016dc8063d1e8', + filename: 'signature.asc', + }, + { + md5: 'de909e05b3dd8b8ea50e8db422d0971e', + filename: 'HKT_Super_Seven_GTS.jpeg', + }, + { + md5: '72c2f9aecd24606b6490ff06ea9361ec', + filename: 'message.html', + }, + ], + }, + { + data: IO.binread('test/fixtures/mail40.box'), + body_md5: '5db91cb79f889f80bbf8b47ad98efac9', + params: { + from: 'Martin Edenhofer ', + from_email: 'me@example.com', + from_display_name: 'Martin Edenhofer', + subject: 'smime signed 123 öäüß', + to: 'Martin Edenhofer ', + cc: nil, + body: 'smime signed 123 öäüß', + }, + attachments: [ + { + md5: '6a0434efa5a2eebf4efe46b04f7b3a9c', + filename: 'smime.p7s', + }, + ], + }, + { + data: IO.binread('test/fixtures/mail41.box'), + body_md5: '5872ddcdfdf6bfe40f36cd0408fca667', + params: { + from: 'Martin Edenhofer ', + from_email: 'me@example.com', + from_display_name: 'Martin Edenhofer', + subject: 'smime sign & crypt', + to: 'Martin Edenhofer ', + cc: nil, + body: 'no visible content', + }, + attachments: [ + { + md5: 'fc68cdcbf343c72e456fbf9477501a72', + filename: 'smime.p7m', + }, + ], + }, + { + data: IO.binread('test/fixtures/mail42.box'), + body_md5: '5872ddcdfdf6bfe40f36cd0408fca667', + params: { + from: 'Martin Edenhofer ', + from_email: 'me@example.com', + from_display_name: 'Martin Edenhofer', + subject: 'pgp sign & crypt', + to: 'Martin Edenhofer ', + cc: nil, + body: 'no visible content', + }, + attachments: [ + { + md5: '8d23752cf0211ab3eba43bc3a530e8ab', + filename: 'encrypted.asc', + }, + ], + }, ] count = 0 @@ -580,9 +683,9 @@ end #puts 'md5' #puts '++' + data[:body].to_s + '++' #puts '++' + file[:params][key.to_sym].to_s + '++' - assert_equal( Digest::MD5.hexdigest( file[:params][key.to_sym].to_s ), Digest::MD5.hexdigest( data[:body].to_s ) ) + assert_equal(Digest::MD5.hexdigest(file[:params][key.to_sym].to_s), Digest::MD5.hexdigest(data[:body].to_s)) else - assert_equal( file[:params][key.to_sym], data[key.to_sym], "check #{key}" ) + assert_equal(file[:params][key.to_sym], data[key.to_sym], "check #{key}") end } @@ -599,11 +702,11 @@ end #puts 'Attachment:' + attachment_parser.inspect + '-' + file_md5 if attachment[:md5] == file_md5 found = true - assert_equal( attachment[:filename], attachment_parser[:filename] ) + assert_equal(attachment[:filename], attachment_parser[:filename]) end } if !found - assert( false, "Attachment not found! MD5: #{attachment[:md5]} - #{attachment[:filename].to_s}" ) + assert(false, "Attachment not found! MD5: #{attachment[:md5]} - #{attachment[:filename]}") end } assert_equal( attachment_count_config, attachment_count_email ) diff --git a/test/unit/email_process_test.rb b/test/unit/email_process_test.rb index 7a7c98ccf..ebc3a59a9 100644 --- a/test/unit/email_process_test.rb +++ b/test/unit/email_process_test.rb @@ -1969,6 +1969,34 @@ Some Text', ], } }, + { + data: IO.binread('test/fixtures/mail41.box'), + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'smime sign & crypt', + }, + 1 => { + sender: 'Customer', + type: 'email', + }, + }, + }, + { + data: IO.binread('test/fixtures/mail42.box'), + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'pgp sign & crypt', + }, + 1 => { + sender: 'Customer', + type: 'email', + }, + }, + }, ] process(files) end