Merge pull request #114 from jaywink/send-payloads-with-correct-content-type

Send Diaspora payloads with correct content type
merge-requests/130/head
Jason Robinson 2018-02-19 23:22:29 +02:00 zatwierdzone przez GitHub
commit 065d9e4d2b
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 27 dodań i 16 usunięć

Wyświetl plik

@ -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"])

Wyświetl plik

@ -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"),
}

Wyświetl plik

@ -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("<me:env xmlns:me=")
assert mock_send.call_args_list[2][0][1].startswith("<me:env xmlns:me=")
assert args1[1].startswith("<me:env xmlns:me=")
assert args2[1].startswith("<me:env xmlns:me=")
assert kwargs1['headers'] == {'Content-Type': 'application/magic-envelope+xml'}
assert kwargs2['headers'] == {'Content-Type': 'application/magic-envelope+xml'}