summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-10-15 09:06:49 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-10-15 09:06:49 +0200
commite323e816dd5b45bd27d50aaf89c1a3aedcaa7453 (patch)
treee1e034807d6f951d41faf2a325ffd776a7db65c0
parent2a02024aa2d762314f1f4ead24b350fb0575b7e8 (diff)
downloadkittystore-e323e816dd5b45bd27d50aaf89c1a3aedcaa7453.tar.gz
kittystore-e323e816dd5b45bd27d50aaf89c1a3aedcaa7453.tar.xz
kittystore-e323e816dd5b45bd27d50aaf89c1a3aedcaa7453.zip
Protect against badly encoded attachment names
-rw-r--r--kittystore/scrub.py2
-rw-r--r--kittystore/test/test_scrub.py16
2 files changed, 17 insertions, 1 deletions
diff --git a/kittystore/scrub.py b/kittystore/scrub.py
index 1481713..40b8c10 100644
--- a/kittystore/scrub.py
+++ b/kittystore/scrub.py
@@ -238,7 +238,7 @@ class Scrubber(object):
# i18n file name is encoded
try:
filename = oneline(part.get_filename(''), in_unicode=True)
- except TypeError:
+ except (TypeError, UnicodeDecodeError):
# Workaround for https://bugs.launchpad.net/mailman/+bug/1060951
# (accented filenames)
filename = "attachment.bin"
diff --git a/kittystore/test/test_scrub.py b/kittystore/test/test_scrub.py
index 3e9c746..76b13d4 100644
--- a/kittystore/test/test_scrub.py
+++ b/kittystore/test/test_scrub.py
@@ -5,6 +5,7 @@
import unittest
import email
+from traceback import format_exc
from mock import Mock
from mailman.email.message import Message
@@ -152,6 +153,21 @@ class TestScrubber(unittest.TestCase):
u'accented letters : \xe9 \xe8 \xe7 \xe0.\r\nAnd an '
u'attachment with an accented filename\r\n\r\n\r\n\r\n')
+ def test_attachment_name_badly_encoded(self):
+ msg = email.message.Message()
+ msg["From"] = "dummy@example.com"
+ msg["Message-ID"] = "<dummy>"
+ msg.set_payload("Dummy content")
+ msg.add_header('Content-Disposition', 'attachment', filename='non-ascii-\xb8\xb1\xb1\xbe.jpg')
+ scrubber = Scrubber("testlist@example.com", msg)
+ try:
+ contents, attachments = scrubber.scrub()
+ except UnicodeDecodeError:
+ print format_exc()
+ self.fail("Could not decode the filename")
+ self.assertEqual(attachments,
+ [(0, 'attachment.bin', 'text/plain', None, 'Dummy content')])
+
def test_remove_next_part_from_content(self):
with open(get_test_file("pipermail_nextpart.txt")) as email_file:
msg = email.message_from_file(email_file, _class=Message)