diff --git a/federation/protocols/diaspora/encrypted.py b/federation/protocols/diaspora/encrypted.py index 32fc9c5..ccf23a4 100644 --- a/federation/protocols/diaspora/encrypted.py +++ b/federation/protocols/diaspora/encrypted.py @@ -20,9 +20,8 @@ class EncryptedPayload: def decrypt(payload, private_key): """Decrypt an encrypted JSON payload and return the Magic Envelope document inside.""" cipher = PKCS1_v1_5.new(private_key) - aes_key = json.loads( - cipher.decrypt(b64decode(payload.get("aes_key")), sentinel=None) - ) + aes_key_str = cipher.decrypt(b64decode(payload.get("aes_key")), sentinel=None) + aes_key = json.loads(aes_key_str.decode("utf-8")) key = b64decode(aes_key.get("key")) iv = b64decode(aes_key.get("iv")) encrypted_magic_envelope = b64decode(payload.get("encrypted_magic_envelope")) diff --git a/federation/protocols/diaspora/protocol.py b/federation/protocols/diaspora/protocol.py index abc11e5..73c417e 100644 --- a/federation/protocols/diaspora/protocol.py +++ b/federation/protocols/diaspora/protocol.py @@ -14,6 +14,7 @@ from federation.exceptions import EncryptedMessageError, NoSenderKeyFoundError, from federation.protocols.base import BaseProtocol from federation.protocols.diaspora.encrypted import EncryptedPayload from federation.protocols.diaspora.magic_envelope import MagicEnvelope +from federation.utils.text import decode_if_bytes logger = logging.getLogger("federation") @@ -29,7 +30,7 @@ def identify_payload(payload): """ # Private encrypted JSON payload try: - data = json.loads(payload) + data = json.loads(decode_if_bytes(payload)) if "encrypted_magic_envelope" in data: return True except Exception: @@ -67,7 +68,7 @@ class Protocol(BaseProtocol): def store_magic_envelope_doc(self, payload): """Get the Magic Envelope, trying JSON first.""" try: - json_payload = json.loads(payload) + json_payload = json.loads(decode_if_bytes(payload)) except ValueError: # XML payload xml = unquote_plus(payload) diff --git a/federation/utils/text.py b/federation/utils/text.py new file mode 100644 index 0000000..310a5e1 --- /dev/null +++ b/federation/utils/text.py @@ -0,0 +1,5 @@ +def decode_if_bytes(text): + try: + return text.decode("utf-8") + except AttributeError: + return text