Noop device key changes if they're the same

This commit is contained in:
Erik Johnston 2017-01-30 16:55:04 +00:00
parent e75a779d9e
commit c2c9a78db9
3 changed files with 45 additions and 15 deletions

View File

@ -287,10 +287,11 @@ class E2eKeysHandler(object):
device_id, user_id, time_now device_id, user_id, time_now
) )
# TODO: Sign the JSON with the server key # TODO: Sign the JSON with the server key
yield self.store.set_e2e_device_keys( changed = yield self.store.set_e2e_device_keys(
user_id, device_id, time_now, user_id, device_id, time_now, device_keys,
encode_canonical_json(device_keys)
) )
if changed:
# Only notify about device updates *if* the keys actually changed
yield self.device_handler.notify_device_update(user_id, [device_id]) yield self.device_handler.notify_device_update(user_id, [device_id])
one_time_keys = keys.get("one_time_keys", None) one_time_keys = keys.get("one_time_keys", None)

View File

@ -164,6 +164,7 @@ class DeviceStore(SQLBaseStore):
keyvalues={ keyvalues={
"user_id": user_id, "user_id": user_id,
}, },
desc="mark_remote_user_device_list_as_unsubscribed",
) )
def update_remote_device_list_cache_entry(self, user_id, device_id, content, def update_remote_device_list_cache_entry(self, user_id, device_id, content,

View File

@ -14,12 +14,34 @@
# limitations under the License. # limitations under the License.
from twisted.internet import defer from twisted.internet import defer
from canonicaljson import encode_canonical_json
from ._base import SQLBaseStore from ._base import SQLBaseStore
class EndToEndKeyStore(SQLBaseStore): class EndToEndKeyStore(SQLBaseStore):
def set_e2e_device_keys(self, user_id, device_id, time_now, json_bytes): def set_e2e_device_keys(self, user_id, device_id, time_now, device_keys):
return self._simple_upsert( """Stores device keys for a device. Returns whether there was a change
or the keys were already in the database.
"""
def _set_e2e_device_keys_txn(txn):
old_key_json = self._simple_select_one_onecol_txn(
txn,
table="e2e_device_keys_json",
keyvalues={
"user_id": user_id,
"device_id": device_id,
},
retcol="key_json",
allow_none=True,
)
new_key_json = encode_canonical_json(device_keys)
if old_key_json == new_key_json:
return False
self._simple_upsert_txn(
txn,
table="e2e_device_keys_json", table="e2e_device_keys_json",
keyvalues={ keyvalues={
"user_id": user_id, "user_id": user_id,
@ -27,10 +49,16 @@ class EndToEndKeyStore(SQLBaseStore):
}, },
values={ values={
"ts_added_ms": time_now, "ts_added_ms": time_now,
"key_json": json_bytes, "key_json": new_key_json,
} }
) )
return True
return self.runInteraction(
"set_e2e_device_keys", _set_e2e_device_keys_txn
)
def get_e2e_device_keys(self, query_list, include_all_devices=False): def get_e2e_device_keys(self, query_list, include_all_devices=False):
"""Fetch a list of device keys. """Fetch a list of device keys.
Args: Args: