Fixed #32180 -- Added system check for file system caches absolute location.

This commit is contained in:
Carles Pina i Estany 2020-11-08 14:57:51 +00:00 committed by Mariusz Felisiak
parent c0fc5ba380
commit 721c95ba0b
3 changed files with 45 additions and 0 deletions

View File

@ -53,3 +53,19 @@ def check_cache_location_not_exposed(app_configs, **kwargs):
id='caches.W002', id='caches.W002',
)) ))
return errors return errors
@register(Tags.caches)
def check_file_based_cache_is_absolute(app_configs, **kwargs):
errors = []
for alias, config in settings.CACHES.items():
cache = caches[alias]
if not isinstance(cache, FileBasedCache):
continue
if not pathlib.Path(config['LOCATION']).is_absolute():
errors.append(Warning(
f"Your '{alias}' cache LOCATION path is relative. Use an "
f"absolute path instead.",
id='caches.W003',
))
return errors

View File

@ -142,6 +142,8 @@ configured:
lead to corruption of your data because its lead to corruption of your data because its
:setting:`LOCATION <CACHES-LOCATION>` matches/is inside/contains :setting:`LOCATION <CACHES-LOCATION>` matches/is inside/contains
:setting:`MEDIA_ROOT`/:setting:`STATIC_ROOT`/:setting:`STATICFILES_DIRS`. :setting:`MEDIA_ROOT`/:setting:`STATIC_ROOT`/:setting:`STATICFILES_DIRS`.
* **caches.W003**: Your ``<cache>`` cache :setting:`LOCATION <CACHES-LOCATION>`
is relative. Use an absolute path instead.
Database Database
-------- --------

View File

@ -3,6 +3,7 @@ import pathlib
from django.core.checks import Warning from django.core.checks import Warning
from django.core.checks.caches import ( from django.core.checks.caches import (
E001, check_cache_location_not_exposed, check_default_cache_is_configured, E001, check_cache_location_not_exposed, check_default_cache_is_configured,
check_file_based_cache_is_absolute,
) )
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.test.utils import override_settings from django.test.utils import override_settings
@ -89,3 +90,29 @@ class CheckCacheLocationTest(SimpleTestCase):
settings = self.get_settings(setting, root / 'cache', root / 'other') settings = self.get_settings(setting, root / 'cache', root / 'other')
with self.subTest(setting=setting), self.settings(**settings): with self.subTest(setting=setting), self.settings(**settings):
self.assertEqual(check_cache_location_not_exposed(None), []) self.assertEqual(check_cache_location_not_exposed(None), [])
class CheckCacheAbsolutePath(SimpleTestCase):
def test_absolute_path(self):
with self.settings(CACHES={
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': pathlib.Path.cwd() / 'cache',
},
}):
self.assertEqual(check_file_based_cache_is_absolute(None), [])
def test_relative_path(self):
with self.settings(CACHES={
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': 'cache',
},
}):
self.assertEqual(check_file_based_cache_is_absolute(None), [
Warning(
"Your 'default' cache LOCATION path is relative. Use an "
"absolute path instead.",
id='caches.W003',
),
])