Don't reuse backup versions

Since we don't actually delete the keys, just mark the versions
as deleted in the db rather than actually deleting them, then we
won't reuse versions.

Fixes https://github.com/vector-im/riot-web/issues/7448
pull/4019/head
David Baker 2018-10-05 15:08:36 +01:00
parent bc74925c5b
commit 497444f1fd
2 changed files with 9 additions and 3 deletions

View File

@ -193,7 +193,8 @@ class EndToEndRoomKeyStore(SQLBaseStore):
@staticmethod
def _get_current_version(txn, user_id):
txn.execute(
"SELECT MAX(version) FROM e2e_room_keys_versions WHERE user_id=?",
"SELECT MAX(version) FROM e2e_room_keys_versions "
"WHERE user_id=? AND deleted=0",
(user_id,)
)
row = txn.fetchone()
@ -226,6 +227,7 @@ class EndToEndRoomKeyStore(SQLBaseStore):
keyvalues={
"user_id": user_id,
"version": this_version,
"deleted": 0,
},
retcols=(
"version",
@ -300,13 +302,16 @@ class EndToEndRoomKeyStore(SQLBaseStore):
else:
this_version = version
return self._simple_delete_one_txn(
return self._simple_update_one_txn(
txn,
table="e2e_room_keys_versions",
keyvalues={
"user_id": user_id,
"version": this_version,
},
updatevalues={
"deleted": 1,
}
)
return self.runInteraction(

View File

@ -32,7 +32,8 @@ CREATE TABLE e2e_room_keys_versions (
user_id TEXT NOT NULL,
version TEXT NOT NULL,
algorithm TEXT NOT NULL,
auth_data TEXT NOT NULL
auth_data TEXT NOT NULL,
deleted SMALLINT DEFAULT 0 NOT NULL
);
CREATE UNIQUE INDEX e2e_room_keys_versions_idx ON e2e_room_keys_versions(user_id, version);