From 58ad83f37c8f643d6b573ebbedf03a1fc3677c51 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 14 Jun 2013 00:24:17 +0100 Subject: [PATCH] Added support for bytes in sessions back --- CHANGES | 3 +++ flask/sessions.py | 5 +++++ flask/testsuite/basic.py | 3 +++ 3 files changed, 11 insertions(+) diff --git a/CHANGES b/CHANGES index 86b006b8..7f7e6091 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,9 @@ Pending bugfix release. made the filter not work properly in HTML attributes. Now it's possible to use that filter in single quoted attributes. This should make using that filter with angular.js easier. +- Added support for byte strings back to the session system. This broke + compatibility with the common case of people putting binary data for + token verification into the session. Version 0.10 ------------ diff --git a/flask/sessions.py b/flask/sessions.py index 0b35b1c2..3246eb83 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -11,6 +11,7 @@ import uuid import hashlib +from base64 import b64encode, b64decode from datetime import datetime from werkzeug.http import http_date, parse_date from werkzeug.datastructures import CallbackDict @@ -62,6 +63,8 @@ class TaggedJSONSerializer(object): return {' t': [_tag(x) for x in value]} elif isinstance(value, uuid.UUID): return {' u': value.hex} + elif isinstance(value, bytes): + return {' b': b64encode(value).decode('ascii')} elif callable(getattr(value, '__html__', None)): return {' m': text_type(value.__html__())} elif isinstance(value, list): @@ -90,6 +93,8 @@ class TaggedJSONSerializer(object): return tuple(the_value) elif the_key == ' u': return uuid.UUID(the_value) + elif the_key == ' b': + return b64decode(the_value) elif the_key == ' m': return Markup(the_value) elif the_key == ' d': diff --git a/flask/testsuite/basic.py b/flask/testsuite/basic.py index a170f5b0..9372fdd1 100644 --- a/flask/testsuite/basic.py +++ b/flask/testsuite/basic.py @@ -326,6 +326,7 @@ class BasicFunctionalityTestCase(FlaskTestCase): flask.session['m'] = flask.Markup('Hello!') flask.session['u'] = the_uuid flask.session['dt'] = now + flask.session['b'] = b'\xff' flask.session['t'] = (1, 2, 3) return response @@ -340,6 +341,8 @@ class BasicFunctionalityTestCase(FlaskTestCase): self.assert_equal(type(rv['m']), flask.Markup) self.assert_equal(rv['dt'], now) self.assert_equal(rv['u'], the_uuid) + self.assert_equal(rv['b'], b'\xff') + self.assert_equal(type(rv['b']), bytes) self.assert_equal(rv['t'], (1, 2, 3)) def test_flashes(self):