diff options
author | Erik Johnston <erikj@jki.re> | 2018-11-08 14:37:20 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-08 14:37:20 +0000 |
commit | 7b22421a7b3a40462d919faa0016635ed0419a60 (patch) | |
tree | f0d51435a45fbceaffd9178e7bb74220081d0697 | |
parent | Merge pull request #4163 from matrix-org/rav/fix_consent_on_py3 (diff) | |
parent | Add test to assert set_e2e_device_keys correctly returns False on no-op (diff) | |
download | synapse-7b22421a7b3a40462d919faa0016635ed0419a60.tar.xz |
Merge pull request #4164 from matrix-org/erikj/fix_device_comparison
Fix noop checks when updating device keys
-rw-r--r-- | changelog.d/4164.bugfix | 1 | ||||
-rw-r--r-- | synapse/storage/end_to_end_keys.py | 5 | ||||
-rw-r--r-- | tests/storage/test_end_to_end_keys.py | 15 |
3 files changed, 20 insertions, 1 deletions
diff --git a/changelog.d/4164.bugfix b/changelog.d/4164.bugfix new file mode 100644 index 0000000000..f70e0b2056 --- /dev/null +++ b/changelog.d/4164.bugfix @@ -0,0 +1 @@ +Fix noop checks when updating device keys, reducing spurious device list update notifications. diff --git a/synapse/storage/end_to_end_keys.py b/synapse/storage/end_to_end_keys.py index 1f1721e820..2a0f6cfca9 100644 --- a/synapse/storage/end_to_end_keys.py +++ b/synapse/storage/end_to_end_keys.py @@ -40,7 +40,10 @@ class EndToEndKeyStore(SQLBaseStore): allow_none=True, ) - new_key_json = encode_canonical_json(device_keys) + # In py3 we need old_key_json to match new_key_json type. The DB + # returns unicode while encode_canonical_json returns bytes. + new_key_json = encode_canonical_json(device_keys).decode("utf-8") + if old_key_json == new_key_json: return False diff --git a/tests/storage/test_end_to_end_keys.py b/tests/storage/test_end_to_end_keys.py index 8f0aaece40..b83f7336d3 100644 --- a/tests/storage/test_end_to_end_keys.py +++ b/tests/storage/test_end_to_end_keys.py @@ -45,6 +45,21 @@ class EndToEndKeyStoreTestCase(tests.unittest.TestCase): self.assertDictContainsSubset({"keys": json, "device_display_name": None}, dev) @defer.inlineCallbacks + def test_reupload_key(self): + now = 1470174257070 + json = {"key": "value"} + + yield self.store.store_device("user", "device", None) + + changed = yield self.store.set_e2e_device_keys("user", "device", now, json) + self.assertTrue(changed) + + # If we try to upload the same key then we should be told nothing + # changed + changed = yield self.store.set_e2e_device_keys("user", "device", now, json) + self.assertFalse(changed) + + @defer.inlineCallbacks def test_get_key_with_device_name(self): now = 1470174257070 json = {"key": "value"} |