From 3a5f9cd1ae8a2c7101f141d9730878abb74ec92f Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Mon, 12 Mar 2012 20:28:09 +0000 Subject: [PATCH] Fixed #17861 -- Took care of special characters when creating the staticfiles storage cache keys. Many thanks to Preston Holmes. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17688 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/staticfiles/storage.py | 2 +- tests/regressiontests/staticfiles_tests/tests.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py index fe35a3163ea0a..97e7e9c494218 100644 --- a/django/contrib/staticfiles/storage.py +++ b/django/contrib/staticfiles/storage.py @@ -95,7 +95,7 @@ def hashed_name(self, name, content=None): return urlunsplit(unparsed_name) def cache_key(self, name): - return u'staticfiles:cache:%s' % name + return u'staticfiles:%s' % hashlib.md5(smart_str(name)).hexdigest() def url(self, name, force=False): """ diff --git a/tests/regressiontests/staticfiles_tests/tests.py b/tests/regressiontests/staticfiles_tests/tests.py index fc489b33c34eb..7850b44b77f60 100644 --- a/tests/regressiontests/staticfiles_tests/tests.py +++ b/tests/regressiontests/staticfiles_tests/tests.py @@ -7,10 +7,12 @@ import shutil import sys import tempfile +import warnings from StringIO import StringIO from django.template import loader, Context from django.conf import settings +from django.core.cache.backends.base import BaseCache, CacheKeyWarning from django.core.exceptions import ImproperlyConfigured from django.core.files.storage import default_storage from django.core.management import call_command @@ -498,6 +500,20 @@ def test_post_processing(self): self.assertTrue(os.path.join('cached', 'css', 'window.css') in stats['post_processed']) self.assertTrue(os.path.join('cached', 'css', 'img', 'window.png') in stats['unmodified']) + def test_cache_key_memcache_validation(self): + """ + Handle cache key creation correctly, see #17861. + """ + name = "/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/" + chr(22) + chr(180) + cache_key = storage.staticfiles_storage.cache_key(name) + self.save_warnings_state() + cache_validator = BaseCache({}) + warnings.filterwarnings('error', category=CacheKeyWarning) + cache_validator.validate_key(cache_key) + self.restore_warnings_state() + self.assertEqual(cache_key, 'staticfiles:e95bbc36387084582df2a70750d7b351') + + # we set DEBUG to False here since the template tag wouldn't work otherwise TestCollectionCachedStorage = override_settings(**dict(TEST_SETTINGS, STATICFILES_STORAGE='django.contrib.staticfiles.storage.CachedStaticFilesStorage',