1
0
mirror of https://github.com/django/django.git synced 2025-01-03 06:55:47 +00:00

Fixed #20486 -- Ensure that file_move_safe raises an error if the destination already exists.

Thanks to kux for the report, and Russ Webber for the patch.
This commit is contained in:
Russell Keith-Magee 2013-06-20 18:55:27 +08:00
parent 3671e7e3e0
commit 18e79f1425
3 changed files with 19 additions and 0 deletions

View File

@ -608,6 +608,7 @@ answer newbie questions, and generally made Django that much better:
Filip Wasilewski <filip.wasilewski@gmail.com> Filip Wasilewski <filip.wasilewski@gmail.com>
Dan Watson <http://danwatson.net/> Dan Watson <http://danwatson.net/>
Joel Watts <joel@joelwatts.com> Joel Watts <joel@joelwatts.com>
Russ Webber
Lakin Wecker <lakin@structuredabstraction.com> Lakin Wecker <lakin@structuredabstraction.com>
Chris Wesseling <Chris.Wesseling@cwi.nl> Chris Wesseling <Chris.Wesseling@cwi.nl>
Benjamin Wohlwend <piquadrat@gmail.com> Benjamin Wohlwend <piquadrat@gmail.com>

View File

@ -51,6 +51,10 @@ def file_move_safe(old_file_name, new_file_name, chunk_size = 1024*64, allow_ove
return return
try: try:
# If the destination file exists and allow_overwrite is False then raise an IOError
if not allow_overwrite and os.access(new_file_name, os.F_OK):
raise IOError("Destination file %s exists and allow_overwrite is False" % new_file_name)
os.rename(old_file_name, new_file_name) os.rename(old_file_name, new_file_name)
return return
except OSError: except OSError:

View File

@ -1,11 +1,13 @@
from __future__ import absolute_import from __future__ import absolute_import
import os
import gzip import gzip
import shutil import shutil
import tempfile import tempfile
from django.core.cache import cache from django.core.cache import cache
from django.core.files import File from django.core.files import File
from django.core.files.move import file_move_safe
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase from django.test import TestCase
@ -146,3 +148,15 @@ class FileTests(unittest.TestCase):
file = SimpleUploadedFile("mode_test.txt", b"content") file = SimpleUploadedFile("mode_test.txt", b"content")
self.assertFalse(hasattr(file, 'mode')) self.assertFalse(hasattr(file, 'mode'))
g = gzip.GzipFile(fileobj=file) g = gzip.GzipFile(fileobj=file)
class FileMoveSafeTests(unittest.TestCase):
def test_file_move_overwrite(self):
handle_a, self.file_a = tempfile.mkstemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
handle_b, self.file_b = tempfile.mkstemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
# file_move_safe should raise an IOError exception if destination file exists and allow_overwrite is False
self.assertRaises(IOError, lambda: file_move_safe(self.file_a, self.file_b, allow_overwrite=False))
# should allow it and continue on if allow_overwrite is True
self.assertIsNone(file_move_safe(self.file_a, self.file_b, allow_overwrite=True))