Skip to content

Commit 1792c38

Browse files
committed
fix bbangert#226 restore session serialize format without base64
1 parent c089668 commit 1792c38

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

beaker/session.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ def __init__(self, request, id=None, invalidate_corrupt=False,
180180
self.cookie_expires = cookie_expires
181181

182182
self._set_serializer(data_serializer)
183+
self.encode_base64 = False
183184

184185
# Default cookie domain/path
185186
self.was_invalidated = False
@@ -340,7 +341,7 @@ def _get_path(self):
340341

341342
path = property(_get_path, _set_path)
342343

343-
def _encrypt_data(self, session_data=None):
344+
def _serialize_data(self, session_data=None):
344345
"""Serialize, encipher, and base64 the session dict"""
345346
session_data = session_data or self.copy()
346347
if self.encrypt_key:
@@ -352,11 +353,13 @@ def _encrypt_data(self, session_data=None):
352353
self.crypto_module.getKeyLength())
353354
data = self.serializer.dumps(session_data)
354355
return nonce + b64encode(self.crypto_module.aesEncrypt(data, encrypt_key))
355-
else:
356+
elif self.encode_base64:
356357
data = self.serializer.dumps(session_data)
357358
return b64encode(data)
359+
else:
360+
return session_data
358361

359-
def _decrypt_data(self, session_data):
362+
def _deserialize_data(self, session_data):
360363
"""Base64, decipher, then un-serialize the data for the session
361364
dict"""
362365
if self.encrypt_key:
@@ -368,10 +371,12 @@ def _decrypt_data(self, session_data):
368371
self.crypto_module.getKeyLength())
369372
payload = b64decode(session_data[nonce_b64len:])
370373
data = self.crypto_module.aesDecrypt(payload, encrypt_key)
371-
else:
374+
return self.serializer.loads(data)
375+
elif self.encode_base64:
372376
data = b64decode(session_data)
373-
374-
return self.serializer.loads(data)
377+
return self.serializer.loads(data)
378+
else:
379+
return session_data
375380

376381
def _delete_cookie(self):
377382
self.request['set_cookie'] = True
@@ -412,7 +417,7 @@ def load(self):
412417
session_data = self.namespace['session']
413418

414419
if session_data is not None:
415-
session_data = self._decrypt_data(session_data)
420+
session_data = self._deserialize_data(session_data)
416421

417422
# Memcached always returns a key, its None when its not
418423
# present
@@ -487,7 +492,7 @@ def save(self, accessed_only=False):
487492
else:
488493
data = dict(self.items())
489494

490-
data = self._encrypt_data(data)
495+
data = self._serialize_data(data)
491496

492497
# Save the data
493498
if not data and 'session' in self.namespace:
@@ -611,6 +616,7 @@ def __init__(self, request, key='beaker.session.id', timeout=None,
611616
self.samesite = samesite
612617
self.invalidate_corrupt = invalidate_corrupt
613618
self._set_serializer(data_serializer)
619+
self.encode_base64 = True
614620

615621
try:
616622
cookieheader = request['cookie']
@@ -644,7 +650,7 @@ def __init__(self, request, key='beaker.session.id', timeout=None,
644650
cookie_data = self.cookie[self.key].value
645651
if cookie_data is InvalidSignature:
646652
raise BeakerException("Invalid signature")
647-
self.update(self._decrypt_data(cookie_data))
653+
self.update(self._deserialize_data(cookie_data))
648654
except Exception as e:
649655
if self.invalidate_corrupt:
650656
util.warn(
@@ -709,7 +715,7 @@ def _create_cookie(self):
709715
self['_id'] = _session_id()
710716
self['_accessed_time'] = time.time()
711717

712-
val = self._encrypt_data()
718+
val = self._serialize_data()
713719
if len(val) > 4064:
714720
raise BeakerException("Cookie value is too long to store")
715721

0 commit comments

Comments
 (0)