From b1a22b24ab7532da993e673f353dd87eeef49151 Mon Sep 17 00:00:00 2001
From: Erik Johnston <erik@matrix.org>
Date: Thu, 8 Nov 2018 12:14:20 +0000
Subject: [PATCH] Fix noop checks when updating device keys

Clients often reupload their device keys (for some reason) so its
important for the server to check for no-ops before sending out device
list update notifications.

The check is broken in python 3 due to the fact comparing bytes and
unicode always fails, and that we write bytes to the DB but get unicode
when we read.
---
 synapse/storage/end_to_end_keys.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/synapse/storage/end_to_end_keys.py b/synapse/storage/end_to_end_keys.py
index 1f1721e820..29281630c0 100644
--- a/synapse/storage/end_to_end_keys.py
+++ b/synapse/storage/end_to_end_keys.py
@@ -40,6 +40,11 @@ class EndToEndKeyStore(SQLBaseStore):
                 allow_none=True,
             )
 
+            if old_key_json and not isinstance(old_key_json, bytes):
+                # In py3 we need old_key_json to match new_key_json type. The DB
+                # returns unicode while encode_canonical_json returns bytes
+                old_key_json = old_key_json.encode("utf-8")
+
             new_key_json = encode_canonical_json(device_keys)
             if old_key_json == new_key_json:
                 return False
-- 
GitLab