@@ -60,7 +60,7 @@ use thiserror::Error;
60
60
use tokio:: sync:: { Mutex , Notify , OwnedRwLockWriteGuard , RwLock } ;
61
61
use tokio_stream:: wrappers:: errors:: BroadcastStreamRecvError ;
62
62
use tracing:: { error, info, instrument, trace, warn} ;
63
- use types:: RoomKeyBundleInfo ;
63
+ use types:: { RoomKeyBundleInfo , StoredRoomKeyBundleData } ;
64
64
use vodozemac:: { megolm:: SessionOrdering , Curve25519PublicKey } ;
65
65
66
66
use self :: types:: {
@@ -1341,14 +1341,11 @@ impl Store {
1341
1341
///
1342
1342
/// while let Some(bundle_info) = bundle_stream.next().await {
1343
1343
/// // Try to find the bundle content in the store and if it's valid accept it.
1344
- /// if let Some(bundle_content) = machine.store().get_received_room_key_bundle_data(&bundle_info.room_id, &bundle_info.sender).await? {
1345
- /// let StoredRoomKeyBundleData { sender_user, sender_data, bundle_data, .. } = bundle_content;
1344
+ /// if let Some(bundle_data) = machine.store().get_received_room_key_bundle_data(&bundle_info.room_id, &bundle_info.sender).await? {
1346
1345
/// // Download the bundle now and import it.
1347
1346
/// let bundle: RoomKeyBundle = todo!("Download the bundle");
1348
1347
/// machine.store().receive_room_key_bundle(
1349
- /// &bundle_info.room_id,
1350
- /// &sender_user,
1351
- /// &sender_data,
1348
+ /// &bundle_data,
1352
1349
/// bundle,
1353
1350
/// |_, _| {},
1354
1351
/// ).await?;
@@ -1611,66 +1608,86 @@ impl Store {
1611
1608
///
1612
1609
/// # Arguments
1613
1610
///
1611
+ /// * `bundle_info` - The [`StoredRoomKeyBundleData`] of the bundle that is
1612
+ /// being received.
1614
1613
/// * `bundle` - The decrypted and deserialized bundle itself.
1615
- /// * `room_id` - The room that we expect this bundle to correspond to.
1616
- /// * `sender_user` - The user that sent us the to-device message pointing
1617
- /// to this data.
1618
- /// * `sender_data` - Information on the sending device at the time we
1619
- /// received that message.
1620
1614
///
1621
1615
/// [MSC4268]: https://github.com/matrix-org/matrix-spec-proposals/pull/4268
1622
- #[ instrument( skip( self , bundle, progress_listener) , fields( bundle_size = bundle. room_keys. len( ) ) ) ]
1616
+ #[ instrument( skip( self , bundle, progress_listener) , fields( bundle_size = bundle. room_keys. len( ) , sender_data ) ) ]
1623
1617
pub async fn receive_room_key_bundle (
1624
1618
& self ,
1625
- room_id : & RoomId ,
1626
- sender_user : & UserId ,
1627
- sender_data : & SenderData ,
1619
+ bundle_info : & StoredRoomKeyBundleData ,
1628
1620
bundle : RoomKeyBundle ,
1629
1621
progress_listener : impl Fn ( usize , usize ) ,
1630
1622
) -> Result < ( ) , CryptoStoreError > {
1631
- let ( good, bad) : ( Vec < _ > , Vec < _ > ) = bundle. room_keys . iter ( ) . partition_map ( |key| {
1632
- if key. room_id != room_id {
1633
- trace ! ( "Ignoring key for incorrect room {} in bundle" , key. room_id) ;
1634
- Either :: Right ( key)
1635
- } else {
1636
- Either :: Left ( key)
1637
- }
1638
- } ) ;
1623
+ let sender_data = if bundle_info. sender_data . should_recalculate ( ) {
1624
+ let device = self
1625
+ . get_device_from_curve_key ( & bundle_info. sender_user , bundle_info. sender_key )
1626
+ . await ?;
1639
1627
1640
- match ( bad. is_empty ( ) , good. is_empty ( ) ) {
1641
- // Case 1: Completely empty bundle.
1642
- ( true , true ) => {
1643
- warn ! ( "Received a completely empty room key bundle" ) ;
1628
+ device
1629
+ . as_ref ( )
1630
+ . map ( SenderData :: from_device)
1631
+ . unwrap_or_else ( || bundle_info. sender_data . clone ( ) )
1632
+ } else {
1633
+ bundle_info. sender_data . clone ( )
1634
+ } ;
1635
+
1636
+ tracing:: Span :: current ( ) . record ( "sender_data" , tracing:: field:: debug ( & sender_data) ) ;
1637
+
1638
+ match sender_data {
1639
+ SenderData :: UnknownDevice { .. }
1640
+ | SenderData :: VerificationViolation ( _)
1641
+ | SenderData :: DeviceInfo { .. } => {
1642
+ warn ! ( "Not accepting a historic room key bundle due to insufficient trust in the sender" ) ;
1643
+ Ok ( ( ) )
1644
1644
}
1645
+ SenderData :: SenderUnverified ( _) | SenderData :: SenderVerified ( _) => {
1646
+ let ( good, bad) : ( Vec < _ > , Vec < _ > ) = bundle. room_keys . iter ( ) . partition_map ( |key| {
1647
+ if key. room_id != bundle_info. bundle_data . room_id {
1648
+ trace ! ( "Ignoring key for incorrect room {} in bundle" , key. room_id) ;
1649
+ Either :: Right ( key)
1650
+ } else {
1651
+ Either :: Left ( key)
1652
+ }
1653
+ } ) ;
1654
+
1655
+ match ( bad. is_empty ( ) , good. is_empty ( ) ) {
1656
+ // Case 1: Completely empty bundle.
1657
+ ( true , true ) => {
1658
+ warn ! ( "Received a completely empty room key bundle" ) ;
1659
+ }
1645
1660
1646
- // Case 2: A bundle for the wrong room.
1647
- ( false , true ) => {
1648
- let bad_keys: Vec < _ > =
1649
- bad. iter ( ) . map ( |& key| ( & key. room_id , & key. session_id ) ) . collect ( ) ;
1661
+ // Case 2: A bundle for the wrong room.
1662
+ ( false , true ) => {
1663
+ let bad_keys: Vec < _ > =
1664
+ bad. iter ( ) . map ( |& key| ( & key. room_id , & key. session_id ) ) . collect ( ) ;
1650
1665
1651
- warn ! (
1666
+ warn ! (
1652
1667
?bad_keys,
1653
1668
"Received a room key bundle for the wrong room, ignoring all room keys from the bundle"
1654
1669
) ;
1655
- }
1670
+ }
1656
1671
1657
- // Case 3: A bundle containing useful room keys.
1658
- ( _, false ) => {
1659
- // We have at least some good keys, if we also have some bad ones let's mention
1660
- // that here.
1661
- if !bad. is_empty ( ) {
1662
- warn ! (
1663
- bad_key_count = bad. len( ) ,
1664
- "The room key bundle contained some room keys \
1672
+ // Case 3: A bundle containing useful room keys.
1673
+ ( _, false ) => {
1674
+ // We have at least some good keys, if we also have some bad ones let's
1675
+ // mention that here.
1676
+ if !bad. is_empty ( ) {
1677
+ warn ! (
1678
+ bad_key_count = bad. len( ) ,
1679
+ "The room key bundle contained some room keys \
1665
1680
that were meant for a different room"
1666
- ) ;
1681
+ ) ;
1682
+ }
1683
+
1684
+ self . import_sessions_impl ( good, None , progress_listener) . await ?;
1685
+ }
1667
1686
}
1668
1687
1669
- self . import_sessions_impl ( good , None , progress_listener ) . await ? ;
1688
+ Ok ( ( ) )
1670
1689
}
1671
1690
}
1672
-
1673
- Ok ( ( ) )
1674
1691
}
1675
1692
}
1676
1693
0 commit comments