mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #32180 -- Added system check for file system caches absolute location.
This commit is contained in:
		
				
					committed by
					
						
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							c0fc5ba380
						
					
				
				
					commit
					721c95ba0b
				
			@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
--------
 | 
					--------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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',
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            ])
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user