Make add_hashes_and_signatures operate on dicts

pull/4481/head
Erik Johnston 2019-01-25 17:17:38 +00:00
parent 073f6c2e5e
commit 554ca58ea1
2 changed files with 30 additions and 38 deletions

View File

@ -131,12 +131,12 @@ def compute_event_signature(event_dict, signature_name, signing_key):
return redact_json["signatures"] return redact_json["signatures"]
def add_hashes_and_signatures(event, signature_name, signing_key, def add_hashes_and_signatures(event_dict, signature_name, signing_key,
hash_algorithm=hashlib.sha256): hash_algorithm=hashlib.sha256):
"""Add content hash and sign the event """Add content hash and sign the event
Args: Args:
event_dict (EventBuilder): The event to add hashes to and sign event_dict (dict): The event to add hashes to and sign
signature_name (str): The name of the entity signing the event signature_name (str): The name of the entity signing the event
(typically the server's hostname). (typically the server's hostname).
signing_key (syutil.crypto.SigningKey): The key to sign with signing_key (syutil.crypto.SigningKey): The key to sign with
@ -144,16 +144,12 @@ def add_hashes_and_signatures(event, signature_name, signing_key,
to hash the event to hash the event
""" """
name, digest = compute_content_hash( name, digest = compute_content_hash(event_dict, hash_algorithm=hash_algorithm)
event.get_pdu_json(), hash_algorithm=hash_algorithm,
)
if not hasattr(event, "hashes"): event_dict.setdefault("hashes", {})[name] = encode_base64(digest)
event.hashes = {}
event.hashes[name] = encode_base64(digest)
event.signatures = compute_event_signature( event_dict["signatures"] = compute_event_signature(
event.get_pdu_json(), event_dict,
signature_name=signature_name, signature_name=signature_name,
signing_key=signing_key, signing_key=signing_key,
) )

View File

@ -18,7 +18,7 @@ import nacl.signing
from unpaddedbase64 import decode_base64 from unpaddedbase64 import decode_base64
from synapse.crypto.event_signing import add_hashes_and_signatures from synapse.crypto.event_signing import add_hashes_and_signatures
from synapse.events.builder import EventBuilder from synapse.events import FrozenEvent
from tests import unittest from tests import unittest
@ -40,20 +40,18 @@ class EventSigningTestCase(unittest.TestCase):
self.signing_key.version = KEY_VER self.signing_key.version = KEY_VER
def test_sign_minimal(self): def test_sign_minimal(self):
builder = EventBuilder( event_dict = {
{ 'event_id': "$0:domain",
'event_id': "$0:domain", 'origin': "domain",
'origin': "domain", 'origin_server_ts': 1000000,
'origin_server_ts': 1000000, 'signatures': {},
'signatures': {}, 'type': "X",
'type': "X", 'unsigned': {'age_ts': 1000000},
'unsigned': {'age_ts': 1000000}, }
}
)
add_hashes_and_signatures(builder, HOSTNAME, self.signing_key) add_hashes_and_signatures(event_dict, HOSTNAME, self.signing_key)
event = builder.build() event = FrozenEvent(event_dict)
self.assertTrue(hasattr(event, 'hashes')) self.assertTrue(hasattr(event, 'hashes'))
self.assertIn('sha256', event.hashes) self.assertIn('sha256', event.hashes)
@ -71,23 +69,21 @@ class EventSigningTestCase(unittest.TestCase):
) )
def test_sign_message(self): def test_sign_message(self):
builder = EventBuilder( event_dict = {
{ 'content': {'body': "Here is the message content"},
'content': {'body': "Here is the message content"}, 'event_id': "$0:domain",
'event_id': "$0:domain", 'origin': "domain",
'origin': "domain", 'origin_server_ts': 1000000,
'origin_server_ts': 1000000, 'type': "m.room.message",
'type': "m.room.message", 'room_id': "!r:domain",
'room_id': "!r:domain", 'sender': "@u:domain",
'sender': "@u:domain", 'signatures': {},
'signatures': {}, 'unsigned': {'age_ts': 1000000},
'unsigned': {'age_ts': 1000000}, }
}
)
add_hashes_and_signatures(builder, HOSTNAME, self.signing_key) add_hashes_and_signatures(event_dict, HOSTNAME, self.signing_key)
event = builder.build() event = FrozenEvent(event_dict)
self.assertTrue(hasattr(event, 'hashes')) self.assertTrue(hasattr(event, 'hashes'))
self.assertIn('sha256', event.hashes) self.assertIn('sha256', event.hashes)