Skip to content

Commit 4492df6

Browse files
committed
test(sdk): Add a test for retrying edit decryption
1 parent 573b672 commit 4492df6

File tree

1 file changed

+107
-2
lines changed

1 file changed

+107
-2
lines changed

crates/matrix-sdk/src/room/timeline/tests/encryption.rs

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ use futures_util::StreamExt;
88
use matrix_sdk_base::crypto::{decrypt_room_key_export, OlmMachine};
99
use matrix_sdk_test::async_test;
1010
use ruma::{
11+
assign,
1112
events::room::encrypted::{
12-
EncryptedEventScheme, MegolmV1AesSha2ContentInit, RoomEncryptedEventContent,
13+
EncryptedEventScheme, MegolmV1AesSha2ContentInit, Relation, Replacement,
14+
RoomEncryptedEventContent,
1315
},
1416
room_id, user_id,
1517
};
@@ -18,7 +20,7 @@ use super::{TestTimeline, BOB};
1820
use crate::room::timeline::{EncryptedMessage, TimelineItemContent};
1921

2022
#[async_test]
21-
async fn unable_to_decrypt() {
23+
async fn retry_message_decryption() {
2224
const SESSION_ID: &str = "gM8i47Xhu0q52xLfgUXzanCMpLinoyVyH7R58cBuVBU";
2325
const SESSION_KEY: &[u8] = b"\
2426
-----BEGIN MEGOLM SESSION DATA-----\n\
@@ -99,3 +101,106 @@ async fn unable_to_decrypt() {
99101
let text = assert_matches!(&event.content, TimelineItemContent::Message(msg) => msg.body());
100102
assert_eq!(text, "It's a secret to everybody");
101103
}
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

Comments
 (0)