Skip to content

Commit e7ddec1

Browse files
committed
2.7 support
1 parent 5f0cb13 commit e7ddec1

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

pusher/crypto.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
from pusher.util import (
1515
ensure_text,
1616
ensure_binary,
17-
data_to_string)
17+
data_to_string,
18+
is_base64)
1819

1920
import nacl.secret
2021
import nacl.utils
@@ -47,14 +48,14 @@ def parse_master_key(encryption_master_key, encryption_master_key_base64):
4748
raise ValueError("encryption_master_key must be 32 bytes long. It is also deprecated, please use encryption_master_key_base64")
4849

4950
if encryption_master_key_base64 is not None:
50-
try:
51-
decoded = base64.b64decode(encryption_master_key_base64, validate=True)
51+
if is_base64(encryption_master_key_base64):
52+
decoded = base64.b64decode(encryption_master_key_base64)
5253

5354
if len(decoded) == 32:
5455
return decoded
5556
else:
5657
raise ValueError("encryption_master_key_base64 must be a base64 string which decodes to 32 bytes")
57-
except binascii.Error:
58+
else:
5859
raise ValueError("encryption_master_key_base64 must be valid base64")
5960

6061
return None

pusher/util.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ def ensure_binary(obj, name):
5656
raise TypeError("%s should be %s instead it is a %s" % (name, byte_type, type(obj)))
5757

5858

59+
def is_base64(s):
60+
"""
61+
is_base64 tests whether a string is valid base64 by testing that it round-trips accurately.
62+
This is required because python 2.7 does not have a Validate option to the decoder.
63+
"""
64+
try:
65+
s = six.ensure_binary(s, "utf-8")
66+
return base64.b64encode(base64.b64decode(s)) == s
67+
except Exception as e:
68+
return False
69+
5970
def validate_channel(channel):
6071
channel = ensure_text(channel, "channel")
6172

pusher_tests/test_crypto.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from __future__ import print_function, absolute_import
33

44
import json
5+
import six
56
import unittest
67

78
from pusher import crypto
@@ -57,8 +58,7 @@ def test_parse_master_key_rejections(self):
5758
]
5859

5960
for t in testcases:
60-
with self.assertRaisesRegex(ValueError, t["expected"]):
61-
crypto.parse_master_key(t["deprecated"], t["base64"])
61+
six.assertRaisesRegex(self, ValueError, t["expected"], lambda: crypto.parse_master_key(t["deprecated"], t["base64"]))
6262

6363
def test_generate_shared_secret(self):
6464
testcases = [

0 commit comments

Comments
 (0)