summaryrefslogtreecommitdiff
path: root/tests/file_storage
diff options
context:
space:
mode:
authorSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-07-16 10:41:20 +0200
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-07-24 14:55:10 +0200
commit8d6a20b656ff3fa18e36954668a44a831c2f6ddd (patch)
tree2bf07c00cf3ee131048dd9d414fcc5dac1fd1f03 /tests/file_storage
parent5559011c2bfd44a93b0929802be26bfeffbc4e95 (diff)
Fixed #35604, Refs #35326 -- Made FileSystemStorage.exists() behaviour independent from allow_overwrite.
Partially reverts 0b33a3abc2ca7d68a24f6d0772bc2b9fa603744e. Storage.exists(name) was documented to "return False if the name is available for a new file." but return True if the file exists. This is ambiguous in the overwrite file case. It will now always return whether the file exists. Thank you to Natalia Bidart and Josh Schneier for the review.
Diffstat (limited to 'tests/file_storage')
-rw-r--r--tests/file_storage/test_generate_filename.py6
-rw-r--r--tests/file_storage/tests.py30
2 files changed, 29 insertions, 7 deletions
diff --git a/tests/file_storage/test_generate_filename.py b/tests/file_storage/test_generate_filename.py
index 9631705fc8..483115e09c 100644
--- a/tests/file_storage/test_generate_filename.py
+++ b/tests/file_storage/test_generate_filename.py
@@ -80,12 +80,15 @@ class GenerateFilenameStorageTests(SimpleTestCase):
("", ""),
]
s = FileSystemStorage()
+ s_overwrite = FileSystemStorage(allow_overwrite=True)
msg = "Could not derive file name from '%s'"
for file_name, base_name in candidates:
with self.subTest(file_name=file_name):
with self.assertRaisesMessage(SuspiciousFileOperation, msg % base_name):
s.get_available_name(file_name)
with self.assertRaisesMessage(SuspiciousFileOperation, msg % base_name):
+ s_overwrite.get_available_name(file_name)
+ with self.assertRaisesMessage(SuspiciousFileOperation, msg % base_name):
s.generate_filename(file_name)
def test_storage_dangerous_paths_dir_name(self):
@@ -98,12 +101,15 @@ class GenerateFilenameStorageTests(SimpleTestCase):
("\\tmp\\..\\path", "/tmp/.."),
]
s = FileSystemStorage()
+ s_overwrite = FileSystemStorage(allow_overwrite=True)
for file_name, path in candidates:
msg = "Detected path traversal attempt in '%s'" % path
with self.subTest(file_name=file_name):
with self.assertRaisesMessage(SuspiciousFileOperation, msg):
s.get_available_name(file_name)
with self.assertRaisesMessage(SuspiciousFileOperation, msg):
+ s_overwrite.get_available_name(file_name)
+ with self.assertRaisesMessage(SuspiciousFileOperation, msg):
s.generate_filename(file_name)
def test_filefield_dangerous_filename(self):
diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py
index 38d87dc7f2..868b18dd2c 100644
--- a/tests/file_storage/tests.py
+++ b/tests/file_storage/tests.py
@@ -95,18 +95,18 @@ class FileStorageTests(SimpleTestCase):
"""
Standard file access options are available, and work as expected.
"""
- self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "storage_test")))
+ self.assertFalse(self.storage.exists("storage_test"))
f = self.storage.open("storage_test", "w")
f.write("storage contents")
f.close()
- self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "storage_test")))
+ self.assertTrue(self.storage.exists("storage_test"))
f = self.storage.open("storage_test", "r")
self.assertEqual(f.read(), "storage contents")
f.close()
self.storage.delete("storage_test")
- self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "storage_test")))
+ self.assertFalse(self.storage.exists("storage_test"))
def _test_file_time_getter(self, getter):
# Check for correct behavior under both USE_TZ=True and USE_TZ=False.
@@ -275,10 +275,10 @@ class FileStorageTests(SimpleTestCase):
"""
Saving a pathname should create intermediate directories as necessary.
"""
- self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "path/to")))
+ self.assertFalse(self.storage.exists("path/to"))
self.storage.save("path/to/test.file", ContentFile("file saved with path"))
- self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "path/to")))
+ self.assertTrue(self.storage.exists("path/to"))
with self.storage.open("path/to/test.file") as f:
self.assertEqual(f.read(), b"file saved with path")
@@ -692,12 +692,12 @@ class OverwritingStorageTests(FileStorageTests):
stored_name_1 = self.storage.save(name, f_1)
try:
self.assertEqual(stored_name_1, name)
- self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name)))
+ self.assertTrue(self.storage.exists(name))
with self.storage.open(name) as fp:
self.assertEqual(fp.read(), content_1)
stored_name_2 = self.storage.save(name, f_2)
self.assertEqual(stored_name_2, name)
- self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name)))
+ self.assertTrue(self.storage.exists(name))
with self.storage.open(name) as fp:
self.assertEqual(fp.read(), content_2)
finally:
@@ -729,6 +729,22 @@ class OverwritingStorageTests(FileStorageTests):
finally:
self.storage.delete(name)
+ def test_file_name_truncation(self):
+ name = "test_long_file_name.txt"
+ file = ContentFile(b"content")
+ stored_name = self.storage.save(name, file, max_length=10)
+ self.addCleanup(self.storage.delete, stored_name)
+ self.assertEqual(stored_name, "test_l.txt")
+ self.assertEqual(len(stored_name), 10)
+
+ def test_file_name_truncation_extension_too_long(self):
+ name = "file_name.longext"
+ file = ContentFile(b"content")
+ with self.assertRaisesMessage(
+ SuspiciousFileOperation, "Storage can not find an available filename"
+ ):
+ self.storage.save(name, file, max_length=5)
+
class DiscardingFalseContentStorage(FileSystemStorage):
def _save(self, name, content):