13
13
// limitations under the License.
14
14
15
15
use std:: {
16
+ collections:: HashMap ,
16
17
ops:: Deref ,
17
18
sync:: {
18
19
atomic:: { AtomicBool , Ordering } ,
@@ -25,7 +26,7 @@ use ruma::{
25
26
events:: {
26
27
key:: verification:: VerificationMethod , room:: message:: KeyVerificationRequestEventContent ,
27
28
} ,
28
- EventId , OwnedDeviceId , OwnedUserId , RoomId , UserId ,
29
+ DeviceId , EventId , OwnedDeviceId , OwnedUserId , RoomId , UserId ,
29
30
} ;
30
31
use serde:: { Deserialize , Serialize } ;
31
32
use tracing:: error;
@@ -161,14 +162,10 @@ impl OwnUserIdentity {
161
162
& self ,
162
163
methods : Option < Vec < VerificationMethod > > ,
163
164
) -> Result < ( VerificationRequest , OutgoingVerificationRequest ) , CryptoStoreError > {
164
- let devices: Vec < OwnedDeviceId > = self
165
- . verification_machine
166
- . store
167
- . get_user_devices ( self . user_id ( ) )
168
- . await ?
169
- . into_keys ( )
170
- . filter ( |d| & * * d != self . verification_machine . own_device_id ( ) )
171
- . collect ( ) ;
165
+ let all_devices = self . verification_machine . store . get_user_devices ( self . user_id ( ) ) . await ?;
166
+ let devices = self
167
+ . inner
168
+ . filter_devices_to_request ( all_devices, self . verification_machine . own_device_id ( ) ) ;
172
169
173
170
Ok ( self
174
171
. verification_machine
@@ -622,6 +619,20 @@ impl ReadOnlyOwnUserIdentity {
622
619
623
620
Ok ( ( ) )
624
621
}
622
+
623
+ fn filter_devices_to_request (
624
+ & self ,
625
+ devices : HashMap < OwnedDeviceId , ReadOnlyDevice > ,
626
+ own_device_id : & DeviceId ,
627
+ ) -> Vec < OwnedDeviceId > {
628
+ devices
629
+ . into_iter ( )
630
+ . filter_map ( |( device_id, device) | {
631
+ ( device_id != own_device_id && self . is_device_signed ( & device) . is_ok ( ) )
632
+ . then_some ( device_id)
633
+ } )
634
+ . collect ( )
635
+ }
625
636
}
626
637
627
638
#[ cfg( any( test, feature = "testing" ) ) ]
@@ -699,11 +710,11 @@ pub(crate) mod testing {
699
710
700
711
#[ cfg( test) ]
701
712
pub ( crate ) mod tests {
702
- use std:: sync:: Arc ;
713
+ use std:: { collections :: HashMap , sync:: Arc } ;
703
714
704
715
use assert_matches:: assert_matches;
705
716
use matrix_sdk_test:: async_test;
706
- use ruma:: user_id;
717
+ use ruma:: { device_id , user_id} ;
707
718
use serde_json:: { json, Value } ;
708
719
use tokio:: sync:: Mutex ;
709
720
@@ -875,4 +886,27 @@ pub(crate) mod tests {
875
886
Err ( _)
876
887
) ;
877
888
}
889
+
890
+ #[ test]
891
+ fn filter_devices_to_request ( ) {
892
+ let response = own_key_query ( ) ;
893
+ let identity = get_own_identity ( ) ;
894
+ let ( first, second) = device ( & response) ;
895
+
896
+ let second_device_id = second. device_id ( ) . to_owned ( ) ;
897
+ let unknown_device_id = device_id ! ( "UNKNOWN" ) ;
898
+
899
+ let devices = HashMap :: from ( [
900
+ ( first. device_id ( ) . to_owned ( ) , first) ,
901
+ ( second. device_id ( ) . to_owned ( ) , second) ,
902
+ ] ) ;
903
+
904
+ // Own device and devices not verified are filtered out.
905
+ assert_eq ! ( identity. filter_devices_to_request( devices. clone( ) , & second_device_id) . len( ) , 0 ) ;
906
+ // Signed devices that are not our own are kept.
907
+ assert_eq ! (
908
+ identity. filter_devices_to_request( devices, unknown_device_id) ,
909
+ [ second_device_id]
910
+ ) ;
911
+ }
878
912
}
0 commit comments