@@ -111,6 +111,7 @@ impl SqliteCryptoStore {
111
111
let conn = pool. get ( ) . await ?;
112
112
113
113
let version = conn. db_version ( ) . await ?;
114
+ debug ! ( "Opened sqlite store with version {}" , version) ;
114
115
run_migrations ( & conn, version) . await ?;
115
116
116
117
let store_cipher = match passphrase {
@@ -207,7 +208,7 @@ impl SqliteCryptoStore {
207
208
}
208
209
}
209
210
210
- const DATABASE_VERSION : u8 = 9 ;
211
+ const DATABASE_VERSION : u8 = 10 ;
211
212
212
213
/// key for the dehydrated device pickle key in the key/value table.
213
214
const DEHYDRATED_DEVICE_PICKLE_KEY : & str = "dehydrated_device_pickle_key" ;
@@ -303,6 +304,16 @@ async fn run_migrations(conn: &SqliteAsyncConn, version: u8) -> Result<()> {
303
304
. await ?;
304
305
}
305
306
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
+
306
317
Ok ( ( ) )
307
318
}
308
319
@@ -350,6 +361,13 @@ trait SqliteConnectionExt {
350
361
fn set_room_settings ( & self , room_id : & [ u8 ] , data : & [ u8 ] ) -> rusqlite:: Result < ( ) > ;
351
362
352
363
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 < ( ) > ;
353
371
}
354
372
355
373
impl SqliteConnectionExt for rusqlite:: Connection {
@@ -478,6 +496,21 @@ impl SqliteConnectionExt for rusqlite::Connection {
478
496
479
497
Ok ( ( ) )
480
498
}
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
+ }
481
514
}
482
515
483
516
#[ async_trait]
@@ -744,6 +777,21 @@ trait SqliteObjectCryptoStoreExt: SqliteAsyncConnExt {
744
777
. await
745
778
. optional ( ) ?)
746
779
}
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
+ }
747
795
}
748
796
749
797
#[ async_trait]
@@ -947,6 +995,14 @@ impl CryptoStore for SqliteCryptoStore {
947
995
txn. set_secret ( & secret_name, & value) ?;
948
996
}
949
997
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
+
950
1006
Ok :: < _ , Error > ( ( ) )
951
1007
} )
952
1008
. await ?;
@@ -1339,10 +1395,17 @@ impl CryptoStore for SqliteCryptoStore {
1339
1395
1340
1396
async fn get_received_room_key_bundle_data (
1341
1397
& self ,
1342
- _room_id : & RoomId ,
1343
- _user_id : & UserId ,
1398
+ room_id : & RoomId ,
1399
+ user_id : & UserId ,
1344
1400
) -> 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 ( )
1346
1409
}
1347
1410
1348
1411
async fn get_custom_value ( & self , key : & str ) -> Result < Option < Vec < u8 > > > {
0 commit comments