diff options
| author | tschilling <schillingt@better-simple.com> | 2021-12-13 21:47:03 -0600 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-02-01 11:12:24 +0100 |
| commit | 0dcd549bbe36c060f536ec270d34d9e7d4b8e6c7 (patch) | |
| tree | 8b350cec1ab50d21cf6e3afd03f3db5f02fb1679 /tests/check_framework | |
| parent | ba4a6880d1783190de4081bd456d934beb45cb19 (diff) | |
| download | django-0dcd549bbe36c060f536ec270d34d9e7d4b8e6c7.tar.gz | |
Fixed #30360 -- Added support for secret key rotation.
Thanks Florian Apolloner for the implementation idea.
Co-authored-by: Andreas Pelme <andreas@pelme.se>
Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es>
Co-authored-by: Vuyisile Ndlovu <terrameijar@gmail.com>
Diffstat (limited to 'tests/check_framework')
| -rw-r--r-- | tests/check_framework/test_security.py | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/tests/check_framework/test_security.py b/tests/check_framework/test_security.py index 774ba068f9..9002deefc5 100644 --- a/tests/check_framework/test_security.py +++ b/tests/check_framework/test_security.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.core.checks.messages import Error +from django.core.checks.messages import Error, Warning from django.core.checks.security import base, csrf, sessions from django.core.management.utils import get_random_secret_key from django.test import SimpleTestCase @@ -414,6 +414,79 @@ class CheckSecretKeyTest(SimpleTestCase): self.assertEqual(base.check_secret_key(None), [base.W009]) +class CheckSecretKeyFallbacksTest(SimpleTestCase): + @override_settings(SECRET_KEY_FALLBACKS=[('abcdefghijklmnopqrstuvwx' * 2) + 'ab']) + def test_okay_secret_key_fallbacks(self): + self.assertEqual( + len(settings.SECRET_KEY_FALLBACKS[0]), + base.SECRET_KEY_MIN_LENGTH, + ) + self.assertGreater( + len(set(settings.SECRET_KEY_FALLBACKS[0])), + base.SECRET_KEY_MIN_UNIQUE_CHARACTERS, + ) + self.assertEqual(base.check_secret_key_fallbacks(None), []) + + def test_no_secret_key_fallbacks(self): + with self.settings(SECRET_KEY_FALLBACKS=None): + del settings.SECRET_KEY_FALLBACKS + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS', id=base.W025.id), + ]) + + @override_settings(SECRET_KEY_FALLBACKS=[ + base.SECRET_KEY_INSECURE_PREFIX + get_random_secret_key() + ]) + def test_insecure_secret_key_fallbacks(self): + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[0]', id=base.W025.id), + ]) + + @override_settings(SECRET_KEY_FALLBACKS=[('abcdefghijklmnopqrstuvwx' * 2) + 'a']) + def test_low_length_secret_key_fallbacks(self): + self.assertEqual( + len(settings.SECRET_KEY_FALLBACKS[0]), + base.SECRET_KEY_MIN_LENGTH - 1, + ) + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[0]', id=base.W025.id), + ]) + + @override_settings(SECRET_KEY_FALLBACKS=['abcd' * 20]) + def test_low_entropy_secret_key_fallbacks(self): + self.assertGreater( + len(settings.SECRET_KEY_FALLBACKS[0]), + base.SECRET_KEY_MIN_LENGTH, + ) + self.assertLess( + len(set(settings.SECRET_KEY_FALLBACKS[0])), + base.SECRET_KEY_MIN_UNIQUE_CHARACTERS, + ) + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[0]', id=base.W025.id), + ]) + + @override_settings(SECRET_KEY_FALLBACKS=[ + ('abcdefghijklmnopqrstuvwx' * 2) + 'ab', + 'badkey', + ]) + def test_multiple_keys(self): + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[1]', id=base.W025.id), + ]) + + @override_settings(SECRET_KEY_FALLBACKS=[ + ('abcdefghijklmnopqrstuvwx' * 2) + 'ab', + 'badkey1', + 'badkey2', + ]) + def test_multiple_bad_keys(self): + self.assertEqual(base.check_secret_key_fallbacks(None), [ + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[1]', id=base.W025.id), + Warning(base.W025.msg % 'SECRET_KEY_FALLBACKS[2]', id=base.W025.id), + ]) + + class CheckDebugTest(SimpleTestCase): @override_settings(DEBUG=True) def test_debug_true(self): |
