Make sure the attachment filename is text type.

If attachment filename is bytes type and contains non-ascii coded bytes,
then the following ASCII encoding process will trigger
UnicodeDecodeError exception.

Fix issue #2933.
This commit is contained in:
garenchan 2018-10-04 20:42:24 +08:00 committed by David Lord
parent 232e5c81bc
commit 40118e785f
No known key found for this signature in database
GPG Key ID: 7A1C87E3F5BC42A8
3 changed files with 10 additions and 1 deletions

View File

@ -13,13 +13,17 @@ Unreleased
(ISO-8859-1). This fixes compatibility with Gunicorn, which is
stricter about header encodings than PEP 3333. (`#2766`_)
- Allow custom CLIs using ``FlaskGroup`` to set the debug flag without
it always being overwritten based on environment variables. (`#2765`_)
it always being overwritten based on environment variables.
(`#2765`_)
- ``flask --version`` outputs Werkzeug's version and simplifies the
Python version. (`#2825`_)
- :func:`send_file` handles an ``attachment_filename`` that is a
native Python 2 string (bytes) with UTF-8 coded bytes. (`#2933`_)
.. _#2766: https://github.com/pallets/flask/issues/2766
.. _#2765: https://github.com/pallets/flask/pull/2765
.. _#2825: https://github.com/pallets/flask/pull/2825
.. _#2933: https://github.com/pallets/flask/issues/2933
Version 1.0.2

View File

@ -567,6 +567,9 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
raise TypeError('filename unavailable, required for '
'sending as attachment')
if not isinstance(attachment_filename, text_type):
attachment_filename = attachment_filename.decode('utf-8')
try:
attachment_filename = attachment_filename.encode('ascii')
except UnicodeEncodeError:

View File

@ -644,6 +644,8 @@ class TestSendfile(object):
(u'Ñandúpingüino.txt', '"Nandu/pinguino.txt"',
'%C3%91and%C3%BA%EF%BC%8Fping%C3%BCino.txt'),
(u'Vögel.txt', 'Vogel.txt', 'V%C3%B6gel.txt'),
# Native string not marked as Unicode on Python 2
('tést.txt', 'test.txt', 't%C3%A9st.txt'),
))
def test_attachment_filename_encoding(self, filename, ascii, utf8):
rv = flask.send_file('static/index.html', as_attachment=True, attachment_filename=filename)