summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erikj@jki.re>2018-11-08 14:37:20 +0000
committerGitHub <noreply@github.com>2018-11-08 14:37:20 +0000
commit7b22421a7b3a40462d919faa0016635ed0419a60 (patch)
treef0d51435a45fbceaffd9178e7bb74220081d0697
parentMerge pull request #4163 from matrix-org/rav/fix_consent_on_py3 (diff)
parentAdd test to assert set_e2e_device_keys correctly returns False on no-op (diff)
downloadsynapse-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.bugfix1
-rw-r--r--synapse/storage/end_to_end_keys.py5
-rw-r--r--tests/storage/test_end_to_end_keys.py15
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"}