From 1b407050dd53e56686fdd3e168f8cac4f9be8306 Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Fri, 27 May 2016 14:54:26 -0300 Subject: [PATCH] Fixed #26644 -- Allowed wrapping NamedTemporaryFile with File. 914c72be2abb1c6dd860cb9279beaa66409ae1b2 introduced a regression that causes saving a NamedTemporaryFile in a FileField to raise a SuspiciousFileOperation. To remedy this, if a File has an absolute path as a filename, use only the basename as the filename. --- django/core/files/base.py | 4 ++++ tests/file_storage/tests.py | 8 ++++++++ tests/files/tests.py | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/django/core/files/base.py b/django/core/files/base.py index 11049a45de5..8e974fee57f 100644 --- a/django/core/files/base.py +++ b/django/core/files/base.py @@ -18,6 +18,10 @@ class File(FileProxyMixin): self.file = file if name is None: name = getattr(file, 'name', None) + # Use only the basename from a file's name if it's an absolute path, + # e.g. from NamedTemporaryFile. + if isinstance(name, six.string_types) and os.path.isabs(name): + name = os.path.basename(name) self.name = name if hasattr(file, 'mode'): self.mode = file.mode diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py index 19e8151dc83..c3c4c9cc38b 100644 --- a/tests/file_storage/tests.py +++ b/tests/file_storage/tests.py @@ -10,6 +10,7 @@ import threading import time import unittest from datetime import datetime, timedelta +from tempfile import NamedTemporaryFile from django.core.cache import cache from django.core.exceptions import SuspiciousFileOperation, SuspiciousOperation @@ -869,6 +870,13 @@ class FileFieldStorageTests(TestCase): with temp_storage.open('tests/stringio') as f: self.assertEqual(f.read(), b'content') + def test_save_temporary_file(self): + storage = Storage() + with NamedTemporaryFile() as f: + f.write(b'content') + storage.normal = File(f) + storage.save() # no crash + # Tests for a race condition on file saving (#4948). # This is written in such a way that it'll always pass on platforms diff --git a/tests/files/tests.py b/tests/files/tests.py index d22020cb8cf..12207fee99d 100644 --- a/tests/files/tests.py +++ b/tests/files/tests.py @@ -26,6 +26,12 @@ else: class FileTests(unittest.TestCase): + + def test_file_truncates_namedtemporaryfile_name(self): + named_file = NamedTemporaryFile() + f = File(named_file) + self.assertEqual(f.name, os.path.basename(named_file.name)) + def test_unicode_uploadedfile_name(self): uf = UploadedFile(name='¿Cómo?', content_type='text') self.assertIs(type(repr(uf)), str)