Skip to content

Commit

Permalink
Fixed #32643 -- Fixed decoding of messages in the pre-Django 3.2 format.
Browse files Browse the repository at this point in the history
Thanks Jan Pieter Waagmeester for the report.

Regression in 2d6179c.
  • Loading branch information
apollo13 authored and felixxm committed Apr 14, 2021
1 parent ca98729 commit 4511d14
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 3 deletions.
3 changes: 2 additions & 1 deletion django/contrib/messages/storage/cookie.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import binascii
import json

from django.conf import settings
Expand Down Expand Up @@ -166,7 +167,7 @@ def _decode(self, data):
# pass
except signing.BadSignature:
decoded = None
except json.JSONDecodeError:
except (binascii.Error, json.JSONDecodeError):
decoded = self.signer.unsign(data)

if decoded:
Expand Down
4 changes: 4 additions & 0 deletions docs/releases/3.2.1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,7 @@ Bugfixes
* Fixed a regression in Django 3.2 that caused a crash of ``QuerySet.update()``
on a queryset ordered by inherited or joined fields on MySQL and MariaDB
(:ticket:`32645`).

* Fixed a regression in Django 3.2 that caused a crash when decoding a cookie
value, used by ``django.contrib.messages.storage.cookie.CookieStorage``, in
the pre-Django 3.2 format (:ticket:`32643`).
7 changes: 5 additions & 2 deletions tests/messages_tests/test_cookie.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import binascii
import json
import random

Expand All @@ -7,7 +8,7 @@
from django.contrib.messages.storage.cookie import (
CookieStorage, MessageDecoder, MessageEncoder,
)
from django.core.signing import get_cookie_signer
from django.core.signing import b64_decode, get_cookie_signer
from django.test import SimpleTestCase, override_settings
from django.utils.crypto import get_random_string
from django.utils.safestring import SafeData, mark_safe
Expand Down Expand Up @@ -183,10 +184,12 @@ def test_legacy_encode_decode(self):
# RemovedInDjango41Warning: pre-Django 3.2 encoded messages will be
# invalid.
storage = self.storage_class(self.get_request())
messages = ['this', 'that']
messages = ['this', Message(0, 'Successfully signed in as admin@example.org')]
# Encode/decode a message using the pre-Django 3.2 format.
encoder = MessageEncoder()
value = encoder.encode(messages)
with self.assertRaises(binascii.Error):
b64_decode(value.encode())
signer = get_cookie_signer(salt=storage.key_salt)
encoded_messages = signer.sign(value)
decoded_messages = storage._decode(encoded_messages)
Expand Down

0 comments on commit 4511d14

Please sign in to comment.