@@ -26,6 +26,11 @@ use matrix_sdk_common::{
26
26
executor:: spawn,
27
27
} ;
28
28
use matrix_sdk_test:: { async_test, message_like_event_content, ruma_response_from_json, test_json} ;
29
+ #[ cfg( feature = "experimental-encrypted-state-events" ) ]
30
+ use ruma:: events:: {
31
+ room:: topic:: { OriginalRoomTopicEvent , RoomTopicEventContent } ,
32
+ StateEvent ,
33
+ } ;
29
34
use ruma:: {
30
35
api:: client:: {
31
36
keys:: { get_keys, upload_keys} ,
@@ -727,6 +732,104 @@ async fn test_megolm_encryption() {
727
732
}
728
733
}
729
734
735
+ #[ cfg( feature = "experimental-encrypted-state-events" ) ]
736
+ #[ async_test]
737
+ async fn test_megolm_state_encryption ( ) {
738
+ use ruma:: events:: { AnyStateEvent , EmptyStateKey } ;
739
+
740
+ let ( alice, bob) =
741
+ get_machine_pair_with_setup_sessions_test_helper ( alice_id ( ) , user_id ( ) , false ) . await ;
742
+ let room_id = room_id ! ( "!test:example.org" ) ;
743
+
744
+ let to_device_requests = alice
745
+ . share_room_key ( room_id, iter:: once ( bob. user_id ( ) ) , EncryptionSettings :: default ( ) )
746
+ . await
747
+ . unwrap ( ) ;
748
+
749
+ let event = ToDeviceEvent :: new (
750
+ alice. user_id ( ) . to_owned ( ) ,
751
+ to_device_requests_to_content ( to_device_requests) ,
752
+ ) ;
753
+
754
+ let mut room_keys_received_stream = Box :: pin ( bob. store ( ) . room_keys_received_stream ( ) ) ;
755
+
756
+ let decryption_settings =
757
+ DecryptionSettings { sender_device_trust_requirement : TrustRequirement :: Untrusted } ;
758
+
759
+ let group_session = bob
760
+ . store ( )
761
+ . with_transaction ( |mut tr| async {
762
+ let res = bob
763
+ . decrypt_to_device_event (
764
+ & mut tr,
765
+ & event,
766
+ & mut Changes :: default ( ) ,
767
+ & decryption_settings,
768
+ )
769
+ . await ?;
770
+ Ok ( ( tr, res) )
771
+ } )
772
+ . await
773
+ . unwrap ( )
774
+ . inbound_group_session
775
+ . unwrap ( ) ;
776
+ let sessions = std:: slice:: from_ref ( & group_session) ;
777
+ bob. store ( ) . save_inbound_group_sessions ( sessions) . await . unwrap ( ) ;
778
+
779
+ // when we decrypt the room key, the
780
+ // inbound_group_session_streamroom_keys_received_stream should tell us
781
+ // about it.
782
+ let room_keys = room_keys_received_stream
783
+ . next ( )
784
+ . now_or_never ( )
785
+ . flatten ( )
786
+ . expect ( "We should have received an update of room key infos" )
787
+ . unwrap ( ) ;
788
+ assert_eq ! ( room_keys. len( ) , 1 ) ;
789
+ assert_eq ! ( room_keys[ 0 ] . session_id, group_session. session_id( ) ) ;
790
+
791
+ let plaintext = "It is a secret to everybody" ;
792
+
793
+ let content = RoomTopicEventContent :: new ( plaintext. to_owned ( ) ) ;
794
+
795
+ let encrypted_content =
796
+ alice. encrypt_state_event ( room_id, content, EmptyStateKey ) . await . unwrap ( ) ;
797
+
798
+ let event = json ! ( {
799
+ "event_id" : "$xxxxx:example.org" ,
800
+ "origin_server_ts" : MilliSecondsSinceUnixEpoch :: now( ) ,
801
+ "sender" : alice. user_id( ) ,
802
+ "type" : "m.room.encrypted" ,
803
+ "content" : encrypted_content,
804
+ } ) ;
805
+
806
+ let event = json_convert ( & event) . unwrap ( ) ;
807
+
808
+ let decryption_settings =
809
+ DecryptionSettings { sender_device_trust_requirement : TrustRequirement :: Untrusted } ;
810
+
811
+ let decryption_result =
812
+ bob. try_decrypt_room_event ( & event, room_id, & decryption_settings) . await . unwrap ( ) ;
813
+ assert_let ! ( RoomEventDecryptionResult :: Decrypted ( decrypted_event) = decryption_result) ;
814
+ let decrypted_event = decrypted_event. event . deserialize ( ) . unwrap ( ) ;
815
+
816
+ if let AnyTimelineEvent :: State ( AnyStateEvent :: RoomTopic ( StateEvent :: Original (
817
+ OriginalRoomTopicEvent { sender, content, .. } ,
818
+ ) ) ) = decrypted_event
819
+ {
820
+ assert_eq ! ( & sender, alice. user_id( ) ) ;
821
+ assert_eq ! ( & content. topic, plaintext) ;
822
+ } else {
823
+ panic ! ( "Decrypted room event has the wrong type" ) ;
824
+ }
825
+
826
+ // Just decrypting the event should *not* cause an update on the
827
+ // inbound_group_session_stream.
828
+ if let Some ( igs) = room_keys_received_stream. next ( ) . now_or_never ( ) {
829
+ panic ! ( "Session stream unexpectedly returned update: {igs:?}" ) ;
830
+ }
831
+ }
832
+
730
833
#[ async_test]
731
834
async fn test_withheld_unverified ( ) {
732
835
let ( alice, bob) =
0 commit comments