summaryrefslogtreecommitdiff
path: root/tests/check_framework
diff options
context:
space:
mode:
authortschilling <schillingt@better-simple.com>2021-12-13 21:47:03 -0600
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-01 11:12:24 +0100
commit0dcd549bbe36c060f536ec270d34d9e7d4b8e6c7 (patch)
tree8b350cec1ab50d21cf6e3afd03f3db5f02fb1679 /tests/check_framework
parentba4a6880d1783190de4081bd456d934beb45cb19 (diff)
downloaddjango-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.py75
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):