1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +00:00

[1.10.x] 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.

Backport of 1b407050dd53e56686fdd3e168f8cac4f9be8306 from master
This commit is contained in:
Hugo Osvaldo Barrera 2016-05-27 14:54:26 -03:00 committed by Tim Graham
parent 84737135f6
commit c37f9253a6
3 changed files with 18 additions and 0 deletions

View File

@ -18,6 +18,10 @@ class File(FileProxyMixin):
self.file = file self.file = file
if name is None: if name is None:
name = getattr(file, 'name', 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 self.name = name
if hasattr(file, 'mode'): if hasattr(file, 'mode'):
self.mode = file.mode self.mode = file.mode

View File

@ -10,6 +10,7 @@ import threading
import time import time
import unittest import unittest
from datetime import datetime, timedelta from datetime import datetime, timedelta
from tempfile import NamedTemporaryFile
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import SuspiciousFileOperation, SuspiciousOperation from django.core.exceptions import SuspiciousFileOperation, SuspiciousOperation
@ -871,6 +872,13 @@ class FileFieldStorageTests(TestCase):
with temp_storage.open('tests/stringio') as f: with temp_storage.open('tests/stringio') as f:
self.assertEqual(f.read(), b'content') 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). # Tests for a race condition on file saving (#4948).
# This is written in such a way that it'll always pass on platforms # This is written in such a way that it'll always pass on platforms

View File

@ -26,6 +26,12 @@ else:
class FileTests(unittest.TestCase): 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): def test_unicode_uploadedfile_name(self):
uf = UploadedFile(name='¿Cómo?', content_type='text') uf = UploadedFile(name='¿Cómo?', content_type='text')
self.assertIs(type(repr(uf)), str) self.assertIs(type(repr(uf)), str)