Skip to content

Commit cd6d8af

Browse files
committed
sqlite: store data on received room key bundles
1 parent 2220b4e commit cd6d8af

File tree

2 files changed

+76
-4
lines changed

2 files changed

+76
-4
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE TABLE "received_room_key_bundle"
2+
(
3+
"room_id" BLOB NOT NULL,
4+
"sender_user" BLOB NOT NULL,
5+
"bundle_data" BLOB NOT NULL
6+
);
7+
8+
CREATE UNIQUE INDEX "received_room_key_bundle_room_id_user_id_idx"
9+
ON "received_room_key_bundle" ("room_id", "sender_user");

crates/matrix-sdk-sqlite/src/crypto_store.rs

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ impl SqliteCryptoStore {
111111
let conn = pool.get().await?;
112112

113113
let version = conn.db_version().await?;
114+
debug!("Opened sqlite store with version {}", version);
114115
run_migrations(&conn, version).await?;
115116

116117
let store_cipher = match passphrase {
@@ -207,7 +208,7 @@ impl SqliteCryptoStore {
207208
}
208209
}
209210

210-
const DATABASE_VERSION: u8 = 9;
211+
const DATABASE_VERSION: u8 = 10;
211212

212213
/// key for the dehydrated device pickle key in the key/value table.
213214
const DEHYDRATED_DEVICE_PICKLE_KEY: &str = "dehydrated_device_pickle_key";
@@ -303,6 +304,16 @@ async fn run_migrations(conn: &SqliteAsyncConn, version: u8) -> Result<()> {
303304
.await?;
304305
}
305306

307+
if version < 10 {
308+
conn.with_transaction(|txn| {
309+
txn.execute_batch(include_str!(
310+
"../migrations/crypto_store/010_received_room_key_bundles.sql"
311+
))?;
312+
txn.set_db_version(10)
313+
})
314+
.await?;
315+
}
316+
306317
Ok(())
307318
}
308319

@@ -350,6 +361,13 @@ trait SqliteConnectionExt {
350361
fn set_room_settings(&self, room_id: &[u8], data: &[u8]) -> rusqlite::Result<()>;
351362

352363
fn set_secret(&self, request_id: &[u8], data: &[u8]) -> rusqlite::Result<()>;
364+
365+
fn set_received_room_key_bundle(
366+
&self,
367+
room_id: &[u8],
368+
user_id: &[u8],
369+
data: &[u8],
370+
) -> rusqlite::Result<()>;
353371
}
354372

355373
impl SqliteConnectionExt for rusqlite::Connection {
@@ -478,6 +496,21 @@ impl SqliteConnectionExt for rusqlite::Connection {
478496

479497
Ok(())
480498
}
499+
500+
fn set_received_room_key_bundle(
501+
&self,
502+
room_id: &[u8],
503+
sender_user: &[u8],
504+
data: &[u8],
505+
) -> rusqlite::Result<()> {
506+
self.execute(
507+
"INSERT INTO received_room_key_bundle(room_id, sender_user, bundle_data)
508+
VALUES (?1, ?2, ?3)
509+
ON CONFLICT (room_id, sender_user) DO UPDATE SET bundle_data = ?3",
510+
(room_id, sender_user, data),
511+
)?;
512+
Ok(())
513+
}
481514
}
482515

483516
#[async_trait]
@@ -744,6 +777,21 @@ trait SqliteObjectCryptoStoreExt: SqliteAsyncConnExt {
744777
.await
745778
.optional()?)
746779
}
780+
781+
async fn get_received_room_key_bundle(
782+
&self,
783+
room_id: Key,
784+
sender_user: Key,
785+
) -> Result<Option<Vec<u8>>> {
786+
Ok(self
787+
.query_row(
788+
"SELECT bundle_data FROM received_room_key_bundle WHERE room_id = ? AND sender_user = ?",
789+
(room_id, sender_user),
790+
|row| { row.get(0) },
791+
)
792+
.await
793+
.optional()?)
794+
}
747795
}
748796

749797
#[async_trait]
@@ -947,6 +995,14 @@ impl CryptoStore for SqliteCryptoStore {
947995
txn.set_secret(&secret_name, &value)?;
948996
}
949997

998+
for bundle in changes.received_room_key_bundles {
999+
let room_id =
1000+
this.encode_key("received_room_key_bundle", &bundle.bundle_data.room_id);
1001+
let user_id = this.encode_key("received_room_key_bundle", &bundle.sender_user);
1002+
let value = this.serialize_value(&bundle)?;
1003+
txn.set_received_room_key_bundle(&room_id, &user_id, &value)?;
1004+
}
1005+
9501006
Ok::<_, Error>(())
9511007
})
9521008
.await?;
@@ -1339,10 +1395,17 @@ impl CryptoStore for SqliteCryptoStore {
13391395

13401396
async fn get_received_room_key_bundle_data(
13411397
&self,
1342-
_room_id: &RoomId,
1343-
_user_id: &UserId,
1398+
room_id: &RoomId,
1399+
user_id: &UserId,
13441400
) -> Result<Option<StoredRoomKeyBundleData>> {
1345-
todo!()
1401+
let room_id = self.encode_key("received_room_key_bundle", room_id);
1402+
let user_id = self.encode_key("received_room_key_bundle", user_id);
1403+
self.acquire()
1404+
.await?
1405+
.get_received_room_key_bundle(room_id, user_id)
1406+
.await?
1407+
.map(|value| self.deserialize_value(&value))
1408+
.transpose()
13461409
}
13471410

13481411
async fn get_custom_value(&self, key: &str) -> Result<Option<Vec<u8>>> {

0 commit comments

Comments
 (0)