diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2019-12-04 07:38:35 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-04 07:38:35 +0000 |
commit | 012087546227e566eb7234faae54ab7674e017de (patch) | |
tree | 39a5267b9f38575fe5a0be401074726494e7b38e | |
parent | Add ephemeral messages support (MSC2228) (#6409) (diff) | |
download | synapse-012087546227e566eb7234faae54ab7674e017de.tar.xz |
Fix exception when a cross-signed device is deleted (#6462)
(hopefully) ... and deobfuscate the relevant bit of code.
-rw-r--r-- | changelog.d/6462.bugfix | 1 | ||||
-rw-r--r-- | synapse/storage/data_stores/main/end_to_end_keys.py | 23 |
2 files changed, 20 insertions, 4 deletions
diff --git a/changelog.d/6462.bugfix b/changelog.d/6462.bugfix new file mode 100644 index 0000000000..c435939526 --- /dev/null +++ b/changelog.d/6462.bugfix @@ -0,0 +1 @@ +Fix bug which lead to exceptions being thrown in a loop when a cross-signed device is deleted. diff --git a/synapse/storage/data_stores/main/end_to_end_keys.py b/synapse/storage/data_stores/main/end_to_end_keys.py index d8ad59ad93..643327b57b 100644 --- a/synapse/storage/data_stores/main/end_to_end_keys.py +++ b/synapse/storage/data_stores/main/end_to_end_keys.py @@ -145,13 +145,28 @@ class EndToEndKeyWorkerStore(SQLBaseStore): txn.execute(signature_sql, signature_query_params) rows = self.cursor_to_dict(txn) + # add each cross-signing signature to the correct device in the result dict. for row in rows: + signing_user_id = row["user_id"] + signing_key_id = row["key_id"] target_user_id = row["target_user_id"] target_device_id = row["target_device_id"] - if target_user_id in result and target_device_id in result[target_user_id]: - result[target_user_id][target_device_id].setdefault( - "signatures", {} - ).setdefault(row["user_id"], {})[row["key_id"]] = row["signature"] + signature = row["signature"] + + target_user_result = result.get(target_user_id) + if not target_user_result: + continue + + target_device_result = target_user_result.get(target_device_id) + if not target_device_result: + # note that target_device_result will be None for deleted devices. + continue + + target_device_signatures = target_device_result.setdefault("signatures", {}) + signing_user_signatures = target_device_signatures.setdefault( + signing_user_id, {} + ) + signing_user_signatures[signing_key_id] = signature log_kv(result) return result |