Skip to content

Commit 83ff759

Browse files
committed
WidgetDriver: add toDevice capability parsing
1 parent 0b398ce commit 83ff759

File tree

2 files changed

+41
-12
lines changed

2 files changed

+41
-12
lines changed

crates/matrix-sdk/src/widget/capabilities.rs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer}
2222
use tracing::{debug, warn};
2323

2424
use super::{
25-
filter::{Filter, FilterInput},
25+
filter::{Filter, FilterInput, ToDeviceEventFilter},
2626
MessageLikeEventFilter, StateEventFilter,
2727
};
2828

@@ -102,11 +102,13 @@ impl Capabilities {
102102
}
103103
}
104104

105-
const SEND_EVENT: &str = "org.matrix.msc2762.send.event";
106-
const READ_EVENT: &str = "org.matrix.msc2762.receive.event";
107-
const SEND_STATE: &str = "org.matrix.msc2762.send.state_event";
108-
const READ_STATE: &str = "org.matrix.msc2762.receive.state_event";
109-
const REQUIRES_CLIENT: &str = "io.element.requires_client";
105+
pub(super) const SEND_EVENT: &str = "org.matrix.msc2762.send.event";
106+
pub(super) const READ_EVENT: &str = "org.matrix.msc2762.receive.event";
107+
pub(super) const SEND_STATE: &str = "org.matrix.msc2762.send.state_event";
108+
pub(super) const READ_STATE: &str = "org.matrix.msc2762.receive.state_event";
109+
pub(super) const SEND_TODEVICE: &str = "org.matrix.msc3819.send.to_device";
110+
pub(super) const READ_TODEVICE: &str = "org.matrix.msc3819.receive.to_device";
111+
pub(super) const REQUIRES_CLIENT: &str = "io.element.requires_client";
110112
pub(super) const SEND_DELAYED_EVENT: &str = "org.matrix.msc4157.send.delayed_event";
111113
pub(super) const UPDATE_DELAYED_EVENT: &str = "org.matrix.msc4157.update_delayed_event";
112114

@@ -169,13 +171,15 @@ impl Serialize for Capabilities {
169171
let name = match filter {
170172
Filter::MessageLike(_) => READ_EVENT,
171173
Filter::State(_) => READ_STATE,
174+
Filter::ToDevice(_) => READ_TODEVICE,
172175
};
173176
seq.serialize_element(&format!("{name}:{}", PrintEventFilter(filter)))?;
174177
}
175178
for filter in &self.send {
176179
let name = match filter {
177180
Filter::MessageLike(_) => SEND_EVENT,
178181
Filter::State(_) => SEND_STATE,
182+
Filter::ToDevice(_) => SEND_TODEVICE,
179183
};
180184
seq.serialize_element(&format!("{name}:{}", PrintEventFilter(filter)))?;
181185
}
@@ -227,6 +231,12 @@ impl<'de> Deserialize<'de> for Capabilities {
227231
Some((SEND_STATE, filter_s)) => {
228232
Ok(Permission::Send(Filter::State(parse_state_event_filter(filter_s))))
229233
}
234+
Some((READ_TODEVICE, filter_s)) => Ok(Permission::Read(Filter::ToDevice(
235+
parse_to_device_event_filter(filter_s),
236+
))),
237+
Some((SEND_TODEVICE, filter_s)) => Ok(Permission::Send(Filter::ToDevice(
238+
parse_to_device_event_filter(filter_s),
239+
))),
230240
_ => {
231241
debug!("Unknown capability `{s}`");
232242
Ok(Self::Unknown)
@@ -253,6 +263,10 @@ impl<'de> Deserialize<'de> for Capabilities {
253263
}
254264
}
255265

266+
fn parse_to_device_event_filter(s: &str) -> ToDeviceEventFilter {
267+
ToDeviceEventFilter::new(s.into())
268+
}
269+
256270
let mut capabilities = Capabilities::default();
257271
for capability in Vec::<Permission>::deserialize(deserializer)? {
258272
match capability {
@@ -274,6 +288,8 @@ impl<'de> Deserialize<'de> for Capabilities {
274288
mod tests {
275289
use ruma::events::StateEventType;
276290

291+
use crate::widget::filter::ToDeviceEventFilter;
292+
277293
use super::*;
278294

279295
#[test]
@@ -294,8 +310,10 @@ mod tests {
294310
"org.matrix.msc2762.receive.event:org.matrix.rageshake_request",
295311
"org.matrix.msc2762.receive.state_event:m.room.member",
296312
"org.matrix.msc2762.receive.state_event:org.matrix.msc3401.call.member",
313+
"org.matrix.msc3819.receive.to_device:io.element.call.encryption_keys",
297314
"org.matrix.msc2762.send.event:org.matrix.rageshake_request",
298315
"org.matrix.msc2762.send.state_event:org.matrix.msc3401.call.member#@user:matrix.server",
316+
"org.matrix.msc3819.send.to_device:io.element.call.encryption_keys",
299317
"org.matrix.msc4157.send.delayed_event",
300318
"org.matrix.msc4157.update_delayed_event"
301319
]"#;
@@ -308,6 +326,9 @@ mod tests {
308326
)),
309327
Filter::State(StateEventFilter::WithType(StateEventType::RoomMember)),
310328
Filter::State(StateEventFilter::WithType("org.matrix.msc3401.call.member".into())),
329+
Filter::ToDevice(ToDeviceEventFilter::new(
330+
"io.element.call.encryption_keys".into(),
331+
)),
311332
],
312333
send: vec![
313334
Filter::MessageLike(MessageLikeEventFilter::WithType(
@@ -317,6 +338,9 @@ mod tests {
317338
"org.matrix.msc3401.call.member".into(),
318339
"@user:matrix.server".into(),
319340
)),
341+
Filter::ToDevice(ToDeviceEventFilter::new(
342+
"io.element.call.encryption_keys".into(),
343+
)),
320344
],
321345
requires_client: true,
322346
update_delayed_event: true,
@@ -336,13 +360,17 @@ mod tests {
336360
"org.matrix.msc3401.call.member".into(),
337361
"@user:matrix.server".into(),
338362
)),
363+
Filter::ToDevice(ToDeviceEventFilter::new(
364+
"io.element.call.encryption_keys".into(),
365+
)),
339366
],
340367
send: vec![
341368
Filter::MessageLike(MessageLikeEventFilter::WithType("io.element.custom".into())),
342369
Filter::State(StateEventFilter::WithTypeAndStateKey(
343370
"org.matrix.msc3401.call.member".into(),
344371
"@user:matrix.server".into(),
345372
)),
373+
Filter::ToDevice(ToDeviceEventFilter::new("my.org.other.to_device_event".into())),
346374
],
347375
requires_client: true,
348376
update_delayed_event: false,

crates/matrix-sdk/src/widget/machine/tests/capabilities.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@ use ruma::owned_room_id;
1818
use serde_json::{from_value, json};
1919

2020
use super::{parse_msg, WIDGET_ID};
21-
use crate::widget::machine::{
22-
incoming::MatrixDriverResponse, Action, IncomingMessage, MatrixDriverRequestData, WidgetMachine,
21+
use crate::widget::{
22+
capabilities::{READ_EVENT, READ_STATE, READ_TODEVICE},
23+
machine::{
24+
incoming::MatrixDriverResponse, Action, IncomingMessage, MatrixDriverRequestData,
25+
WidgetMachine,
26+
},
2327
};
2428

2529
#[test]
@@ -191,10 +195,7 @@ pub(super) fn assert_capabilities_dance(
191195
};
192196

193197
// We get the `Subscribe` command if we requested some reading capabilities.
194-
if ["org.matrix.msc2762.receive.state_event", "org.matrix.msc2762.receive.event"]
195-
.into_iter()
196-
.any(|c| capability.starts_with(c))
197-
{
198+
if [READ_EVENT, READ_STATE, READ_TODEVICE].into_iter().any(|c| capability.starts_with(c)) {
198199
let action = actions.remove(0);
199200
assert_matches!(action, Action::Subscribe);
200201
}

0 commit comments

Comments
 (0)