@@ -8,8 +8,10 @@ use futures_util::StreamExt;
8
8
use matrix_sdk_base:: crypto:: { decrypt_room_key_export, OlmMachine } ;
9
9
use matrix_sdk_test:: async_test;
10
10
use ruma:: {
11
+ assign,
11
12
events:: room:: encrypted:: {
12
- EncryptedEventScheme , MegolmV1AesSha2ContentInit , RoomEncryptedEventContent ,
13
+ EncryptedEventScheme , MegolmV1AesSha2ContentInit , Relation , Replacement ,
14
+ RoomEncryptedEventContent ,
13
15
} ,
14
16
room_id, user_id,
15
17
} ;
@@ -18,7 +20,7 @@ use super::{TestTimeline, BOB};
18
20
use crate :: room:: timeline:: { EncryptedMessage , TimelineItemContent } ;
19
21
20
22
#[ async_test]
21
- async fn unable_to_decrypt ( ) {
23
+ async fn retry_message_decryption ( ) {
22
24
const SESSION_ID : & str = "gM8i47Xhu0q52xLfgUXzanCMpLinoyVyH7R58cBuVBU" ;
23
25
const SESSION_KEY : & [ u8 ] = b"\
24
26
-----BEGIN MEGOLM SESSION DATA-----\n \
@@ -99,3 +101,106 @@ async fn unable_to_decrypt() {
99
101
let text = assert_matches ! ( & event. content, TimelineItemContent :: Message ( msg) => msg. body( ) ) ;
100
102
assert_eq ! ( text, "It's a secret to everybody" ) ;
101
103
}
104
+
105
+ #[ async_test]
106
+ async fn retry_edit_decryption ( ) {
107
+ const SESSION1_KEY : & [ u8 ] = b"\
108
+ -----BEGIN MEGOLM SESSION DATA-----\n \
109
+ AXou7bY+PWm0GrxTioyoKTkxAgfrQ5lGIla62WoBMrqWAAAACgXidLIt0gaK5NT3mGigzFAPjh/M0ibXjSvo\
110
+ P9haNoJN2839XPCqHpErqje9x25Vy830vQXu9OpwT/QNgVXoffK6rXvIMvom6V2ElopBSVVHqgJdfqRrlGKH\
111
+ okfW6AE+ApVPk31BclxuUuxCy+Ph9sWBTW3MA64YGog5Ddp2PAz2Vk/iZ9Dcmtf5CDLbhIRsWiLuSEvO56ok\
112
+ 8/ZxCsiuI4SXx+hikBs+krMTIHn74NL5ffpIlnPSOVtbiY49wE1SRwVgdeJUO9qjHpQX3fZKldBBC01l0BuB\
113
+ WK+W/f/LlOPgLr9Eac/u66fCK6Y81ziJOyn3l1wQuu3MQvuuJfwOqcljl47/yg6SaoTYhZ3ytHXkkBtYx0E6\
114
+ h+J3dgXvW6r0prqci/0gljDQR7KtWEUhXb0BwPK7ojRZWBIzF9T/5uKOio/hBZJ7MQHXt8S2HGOB+gKuzrG8\
115
+ azLt5EB48zgeciNlvQ5zh+AltVEErbyENhCAOxEMoO2sTjK1WZ58ZZmti8uaEZ2mJOCciAp6QiFFDnx2FiPv\
116
+ 5DN4g22qr4A2Z4rFZNgum4VosoDA8hBvqr+G9TN5ZxVyi4IPOlqv7ycf6WGOLB6022HmZMX74KHlimDtiYlv\
117
+ G6q7EyfpmeT5rKs51f83rQNkRzcNXKlK83YwIBxCdv9EQXZ4WATAvRqeVF8/m2qpv58zIHjLmq7irckNDmPF\
118
+ W8aUFGxYXuU\n \
119
+ -----END MEGOLM SESSION DATA-----";
120
+
121
+ const SESSION2_ID : & str = "HSRlM67FgLYl0J0l1luflfGwpnFcLKHnNoRqUuIhQ5Q" ;
122
+ const SESSION2_KEY : & [ u8 ] = b"\
123
+ -----BEGIN MEGOLM SESSION DATA-----\n \
124
+ AbMgil4w2zS9PcZ25f+vdcBdv0/YVaOg52K49DwCmMUkAAAAChEzP9tvnK3jd0NA+BjFfm0zzHYOiu5EyRK/\
125
+ F+2mFmC5vYzSiT6Zcx3dn23cU+BpmkCH/HxFli1TMZ29jLZt/ri6FgwRZtkNqmcRDnPi18xnY1GTDFYtdZEZ\
126
+ 8Fv4L29JVOWLgEIGRdH1ct8HAqxxgSCAEcuVY7ns8xjGWKrX6gs2yanF9vUbdMyRHzBqgytzwnXl+sg5TvQS\
127
+ a5Hh8D0eGewv0gWzUVh4PIhpwTxbEJ97k6Dklq2UneJiBo4kmna4uCRz3khq69k0kajIEiqT6eZtwIz0lDDT\
128
+ V+MQz7YUKkFI6Th88VL9/eehcnuYQgefEEbHeb3zvoA6LSJGpvJEPcHaVNpFgnxNlQaDowtb5XMGZfI/YU4O\
129
+ exTiEdtbYSjGnwDEuVUXtFfHCElvrBhvO3MAiXrk1QbZRNzyNUvU+1+ZmPc0IBsDHJiCN/15MKuEWF9kKqt+\
130
+ 9FsFoRnKbXwUfDk9azdOtzymiel6xiD7kr5RTEmyxBIbTQukqZSSyTzKcTxiWQyK7HL0vxztf7Vdy7o1qtKo\
131
+ 9Q48eyIc4fc3HwcSLz6CqRlJENsuhqdPcovE4TeIrv72/WBFLot+gGFltrhdXeaNdzLo+xTSdIjXRpnPtNob\
132
+ dld8OyD3F7GpNdtMXoNhpQNfeOWca0eKUkL/gJw5T7kNkTwso2t1gfcIezEge1UpigAQxUgVDRLTdZZ+C1mM\
133
+ rHCyB4ElRjU\n \
134
+ -----END MEGOLM SESSION DATA-----";
135
+
136
+ let timeline = TestTimeline :: new ( ) ;
137
+
138
+ let encrypted = EncryptedEventScheme :: MegolmV1AesSha2 (
139
+ MegolmV1AesSha2ContentInit {
140
+ ciphertext : "\
141
+ AwgAEpABqOCAaP6NqXquQcEsrGCVInjRTLHmVH8exqYO0b5Aulhgzqrt6oWVUZCpSRBCnlmvnc96\
142
+ n/wpjlALt6vYUcNr2lMkXpuKuYaQhHx5c4in2OJCkPzGmbpXRRdw6WC25uzzKr5Vi5Fa8B5o1C5E\
143
+ DGgNsJg8jC+cVZbcbVCFisQcLATG8UBDuZUGn3WtVFzw0aHzgxGEc+t4C8J9aWwqwokaEF7fRjTK\
144
+ ma5GZJZKR9KfdmeHR2TsnlnLPiPh5F12hqwd5XaOMQemS2j4pENfxpBlYIy5Wk3FQN0G"
145
+ . to_owned ( ) ,
146
+ sender_key : "sKSGv2uD9zUncgL6GiLedvuky3fjVcEz9qVKZkpzN14" . to_owned ( ) ,
147
+ device_id : "PNQBRWYIJL" . into ( ) ,
148
+ session_id : "gI3QWFyqg55EDS8d0omSJwDw8ZWBNEGUw8JxoZlzJgU" . into ( ) ,
149
+ }
150
+ . into ( ) ,
151
+ ) ;
152
+ timeline. handle_live_message_event ( & BOB , RoomEncryptedEventContent :: new ( encrypted, None ) ) . await ;
153
+
154
+ let event_id = timeline. inner . items ( ) [ 1 ] . as_event ( ) . unwrap ( ) . event_id ( ) . unwrap ( ) . to_owned ( ) ;
155
+
156
+ let encrypted = EncryptedEventScheme :: MegolmV1AesSha2 (
157
+ MegolmV1AesSha2ContentInit {
158
+ ciphertext : "\
159
+ AwgAEtABWuWeRLintqVP5ez5kki8sDsX7zSq++9AJo9lELGTDjNKzbF8sowUgg0DaGoP\
160
+ dgWyBmuUxT2bMggwM0fAevtu4XcFtWUx1c/sj1vhekrng9snmXpz4a30N8jhQ7N4WoIg\
161
+ /G5wsPKtOITjUHeon7EKjTPFU7xoYXmxbjDL/9R4hGQdRqogs1hj0ZnWRxNCvr3ahq24\
162
+ E0j8WyBrQXOb2PIHVNfV/9eW8AB744UQXn8FJpmQO8c0Us3YorXtIFrwAtvI3FknD7Lj\
163
+ eeYFpR9oeyZKuzo2Wzp7eiEZt0Lm+xb7Lfp9yY52RhAO7JLlCM4oPff2yXHpUmcjdGsi\
164
+ 9Zc9Z92hiILkZoKOSGccYQoLjYlfL8rVsIVvl4tDDQ"
165
+ . to_owned ( ) ,
166
+ sender_key : "sKSGv2uD9zUncgL6GiLedvuky3fjVcEz9qVKZkpzN14" . to_owned ( ) ,
167
+ device_id : "PNQBRWYIJL" . into ( ) ,
168
+ session_id : "HSRlM67FgLYl0J0l1luflfGwpnFcLKHnNoRqUuIhQ5Q" . into ( ) ,
169
+ }
170
+ . into ( ) ,
171
+ ) ;
172
+ timeline
173
+ . handle_live_message_event (
174
+ & BOB ,
175
+ assign ! ( RoomEncryptedEventContent :: new( encrypted, None ) , {
176
+ relates_to: Some ( Relation :: Replacement ( Replacement :: new( event_id) ) ) ,
177
+ } ) ,
178
+ )
179
+ . await ;
180
+
181
+ let mut keys = decrypt_room_key_export ( Cursor :: new ( SESSION1_KEY ) , "1234" ) . unwrap ( ) ;
182
+ keys. extend ( decrypt_room_key_export ( Cursor :: new ( SESSION2_KEY ) , "1234" ) . unwrap ( ) ) ;
183
+
184
+ let own_user_id = user_id ! ( "@example:morheus.localhost" ) ;
185
+ let olm_machine = OlmMachine :: new ( own_user_id, "SomeDeviceId" . into ( ) ) . await ;
186
+ olm_machine. import_room_keys ( keys, false , |_, _| { } ) . await . unwrap ( ) ;
187
+
188
+ timeline
189
+ . inner
190
+ . retry_event_decryption (
191
+ room_id ! ( "!bdsREiCPHyZAPkpXer:morpheus.localhost" ) ,
192
+ & olm_machine,
193
+ None ,
194
+ )
195
+ . await ;
196
+
197
+ let items = timeline. inner . items ( ) ;
198
+ assert_eq ! ( items. len( ) , 2 ) ;
199
+
200
+ let item = items[ 1 ] . as_event ( ) . unwrap ( ) . as_remote ( ) . unwrap ( ) ;
201
+
202
+ assert_matches ! ( & item. encryption_info, Some ( _) ) ;
203
+ let msg = assert_matches ! ( & item. content, TimelineItemContent :: Message ( msg) => msg) ;
204
+ assert ! ( msg. is_edited( ) ) ;
205
+ assert_eq ! ( msg. body( ) , "This is Error" ) ;
206
+ }
0 commit comments