diff --git a/federation/outbound.py b/federation/outbound.py index e72d17a..53e450b 100644 --- a/federation/outbound.py +++ b/federation/outbound.py @@ -1,3 +1,4 @@ +import json import logging from federation.entities.diaspora.mappers import get_outbound_entity @@ -70,11 +71,16 @@ def handle_send(entity, author_user, recipients=None, parent_user=None): public_key = recipient[1] if isinstance(recipient, tuple) and len(recipient) > 1 else None if public_key: # Private payload - payload = handle_create_payload(entity, author_user, to_user_key=public_key, parent_user=parent_user) + try: + payload = handle_create_payload(entity, author_user, to_user_key=public_key, parent_user=parent_user) + payload = json.dumps(payload) + except Exception as ex: + logger.error("handle_send - failed to generate private payload for %s: %s", id, ex) + continue # TODO get_private_endpoint should be imported per protocol url = get_private_endpoint(id) payloads.append({ - "urls": {url}, "payload": payload, + "urls": {url}, "payload": payload, "content_type": "application/json", }) else: if not public_payloads["diaspora"]["payload"]: @@ -89,6 +95,7 @@ def handle_send(entity, author_user, recipients=None, parent_user=None): if public_payloads["diaspora"]["payload"]: payloads.append({ "urls": public_payloads["diaspora"]["urls"], "payload": public_payloads["diaspora"]["payload"], + "content_type": "application/magic-envelope+xml", }) logger.debug("handle_send - %s", payloads) @@ -96,5 +103,7 @@ def handle_send(entity, author_user, recipients=None, parent_user=None): # Do actual sending for payload in payloads: for url in payload["urls"]: - # TODO set content type per protocol above when collecting and use here - send_document(url, payload["payload"]) + try: + send_document(url, payload["payload"], headers={"Content-Type": payload["content_type"]}) + except Exception as ex: + logger.error("handle_send - failed to send payload to %s: %s, payload: %s", url, ex, payload["payload"]) diff --git a/federation/protocols/diaspora/encrypted.py b/federation/protocols/diaspora/encrypted.py index b7f7102..a7006e4 100644 --- a/federation/protocols/diaspora/encrypted.py +++ b/federation/protocols/diaspora/encrypted.py @@ -83,6 +83,6 @@ class EncryptedPayload: padded_payload = pkcs7_pad(payload.encode("utf-8"), AES.block_size) encrypted_me = b64encode(encrypter.encrypt(padded_payload)) return { - "aes_key": aes_key, - "encrypted_magic_envelope": encrypted_me, + "aes_key": aes_key.decode("utf-8"), + "encrypted_magic_envelope": encrypted_me.decode("utf8"), } diff --git a/federation/tests/test_outbound.py b/federation/tests/test_outbound.py index d2f7bfc..e16e006 100644 --- a/federation/tests/test_outbound.py +++ b/federation/tests/test_outbound.py @@ -60,16 +60,18 @@ class TestHandleSend: handle_send(diasporapost, mock_author, recipients) # Ensure first call is a private payload - assert mock_send.call_args_list[0][0][0] == "https://127.0.0.1/receive/users/xyz" - encrypted = mock_send.call_args_list[0][0][1] - assert "aes_key" in encrypted - assert "encrypted_magic_envelope" in encrypted + args, kwargs = mock_send.call_args_list[0] + assert args[0] == "https://127.0.0.1/receive/users/xyz" + assert "aes_key" in args[1] + assert "encrypted_magic_envelope" in args[1] + assert kwargs['headers'] == {'Content-Type': 'application/json'} # Ensure public payloads and recipients, one per unique host - public_endpoints = { - mock_send.call_args_list[1][0][0], - mock_send.call_args_list[2][0][0], - } + args1, kwargs1 = mock_send.call_args_list[1] + args2, kwargs2 = mock_send.call_args_list[2] + public_endpoints = {args1[0], args2[0]} assert public_endpoints == {"https://example.net/receive/public", "https://localhost/receive/public"} - assert mock_send.call_args_list[1][0][1].startswith("