@@ -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.
213214const 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
355373impl 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_id : & [ u8 ] ,
504+ data : & [ u8 ] ,
505+ ) -> rusqlite:: Result < ( ) > {
506+ self . execute (
507+ "INSERT INTO received_room_key_bundle(room_id, sender_user_id, bundle_data)
508+ VALUES (?1, ?2, ?3)
509+ ON CONFLICT (room_id, sender_user_id) DO UPDATE SET bundle_data = ?3" ,
510+ ( room_id, sender_user_id, 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