diff options
Diffstat (limited to 'django/contrib/sessions/backends/base.py')
-rw-r--r-- | django/contrib/sessions/backends/base.py | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/django/contrib/sessions/backends/base.py b/django/contrib/sessions/backends/base.py index 453f533e90..b5453160a5 100644 --- a/django/contrib/sessions/backends/base.py +++ b/django/contrib/sessions/backends/base.py @@ -6,6 +6,7 @@ from datetime import datetime, timedelta from django.conf import settings from django.contrib.sessions.exceptions import SuspiciousSession +from django.core import signing from django.core.exceptions import SuspiciousOperation from django.utils import timezone from django.utils.crypto import ( @@ -71,6 +72,10 @@ class SessionBase: del self._session[key] self.modified = True + @property + def key_salt(self): + return 'django.contrib.sessions.' + self.__class__.__qualname__ + def get(self, key, default=None): return self._session.get(key, default) @@ -97,16 +102,27 @@ class SessionBase: del self[self.TEST_COOKIE_NAME] def _hash(self, value): + # RemovedInDjango40Warning: pre-Django 3.1 format will be invalid. key_salt = "django.contrib.sessions" + self.__class__.__name__ return salted_hmac(key_salt, value).hexdigest() def encode(self, session_dict): "Return the given session dictionary serialized and encoded as a string." - serialized = self.serializer().dumps(session_dict) - hash = self._hash(serialized) - return base64.b64encode(hash.encode() + b":" + serialized).decode('ascii') + return signing.dumps( + session_dict, salt=self.key_salt, serializer=self.serializer, + compress=True, + ) def decode(self, session_data): + try: + return signing.loads(session_data, salt=self.key_salt, serializer=self.serializer) + # RemovedInDjango40Warning: when the deprecation ends, handle here + # exceptions similar to what _legacy_decode() does now. + except Exception: + return self._legacy_decode(session_data) + + def _legacy_decode(self, session_data): + # RemovedInDjango40Warning: pre-Django 3.1 format will be invalid. encoded_data = base64.b64decode(session_data.encode('ascii')) try: # could produce ValueError if there is no ':' |