Skip to content

Commit 197e150

Browse files
committed
WidgetDriver: add toDevice capability parsing
1 parent e410efb commit 197e150

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;
2323

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

@@ -84,11 +84,13 @@ impl Capabilities {
8484
}
8585
}
8686

87-
const SEND_EVENT: &str = "org.matrix.msc2762.send.event";
88-
const READ_EVENT: &str = "org.matrix.msc2762.receive.event";
89-
const SEND_STATE: &str = "org.matrix.msc2762.send.state_event";
90-
const READ_STATE: &str = "org.matrix.msc2762.receive.state_event";
91-
const REQUIRES_CLIENT: &str = "io.element.requires_client";
87+
pub(super) const SEND_EVENT: &str = "org.matrix.msc2762.send.event";
88+
pub(super) const READ_EVENT: &str = "org.matrix.msc2762.receive.event";
89+
pub(super) const SEND_STATE: &str = "org.matrix.msc2762.send.state_event";
90+
pub(super) const READ_STATE: &str = "org.matrix.msc2762.receive.state_event";
91+
pub(super) const SEND_TODEVICE: &str = "org.matrix.msc3819.send.to_device";
92+
pub(super) const READ_TODEVICE: &str = "org.matrix.msc3819.receive.to_device";
93+
pub(super) const REQUIRES_CLIENT: &str = "io.element.requires_client";
9294
pub(super) const SEND_DELAYED_EVENT: &str = "org.matrix.msc4157.send.delayed_event";
9395
pub(super) const UPDATE_DELAYED_EVENT: &str = "org.matrix.msc4157.update_delayed_event";
9496

@@ -151,13 +153,15 @@ impl Serialize for Capabilities {
151153
let name = match filter {
152154
Filter::MessageLike(_) => READ_EVENT,
153155
Filter::State(_) => READ_STATE,
156+
Filter::ToDevice(_) => READ_TODEVICE,
154157
};
155158
seq.serialize_element(&format!("{name}:{}", PrintEventFilter(filter)))?;
156159
}
157160
for filter in &self.send {
158161
let name = match filter {
159162
Filter::MessageLike(_) => SEND_EVENT,
160163
Filter::State(_) => SEND_STATE,
164+
Filter::ToDevice(_) => SEND_TODEVICE,
161165
};
162166
seq.serialize_element(&format!("{name}:{}", PrintEventFilter(filter)))?;
163167
}
@@ -209,6 +213,12 @@ impl<'de> Deserialize<'de> for Capabilities {
209213
Some((SEND_STATE, filter_s)) => {
210214
Ok(Permission::Send(Filter::State(parse_state_event_filter(filter_s))))
211215
}
216+
Some((READ_TODEVICE, filter_s)) => Ok(Permission::Read(Filter::ToDevice(
217+
parse_to_device_event_filter(filter_s),
218+
))),
219+
Some((SEND_TODEVICE, filter_s)) => Ok(Permission::Send(Filter::ToDevice(
220+
parse_to_device_event_filter(filter_s),
221+
))),
212222
_ => {
213223
debug!("Unknown capability `{s}`");
214224
Ok(Self::Unknown)
@@ -235,6 +245,10 @@ impl<'de> Deserialize<'de> for Capabilities {
235245
}
236246
}
237247

248+
fn parse_to_device_event_filter(s: &str) -> ToDeviceEventFilter {
249+
ToDeviceEventFilter::new(s.into())
250+
}
251+
238252
let mut capabilities = Capabilities::default();
239253
for capability in Vec::<Permission>::deserialize(deserializer)? {
240254
match capability {
@@ -256,6 +270,8 @@ impl<'de> Deserialize<'de> for Capabilities {
256270
mod tests {
257271
use ruma::events::StateEventType;
258272

273+
use crate::widget::filter::ToDeviceEventFilter;
274+
259275
use super::*;
260276

261277
#[test]
@@ -276,8 +292,10 @@ mod tests {
276292
"org.matrix.msc2762.receive.event:org.matrix.rageshake_request",
277293
"org.matrix.msc2762.receive.state_event:m.room.member",
278294
"org.matrix.msc2762.receive.state_event:org.matrix.msc3401.call.member",
295+
"org.matrix.msc3819.receive.to_device:io.element.call.encryption_keys",
279296
"org.matrix.msc2762.send.event:org.matrix.rageshake_request",
280297
"org.matrix.msc2762.send.state_event:org.matrix.msc3401.call.member#@user:matrix.server",
298+
"org.matrix.msc3819.send.to_device:io.element.call.encryption_keys",
281299
"org.matrix.msc4157.send.delayed_event",
282300
"org.matrix.msc4157.update_delayed_event"
283301
]"#;
@@ -290,6 +308,9 @@ mod tests {
290308
)),
291309
Filter::State(StateEventFilter::WithType(StateEventType::RoomMember)),
292310
Filter::State(StateEventFilter::WithType("org.matrix.msc3401.call.member".into())),
311+
Filter::ToDevice(ToDeviceEventFilter::new(
312+
"io.element.call.encryption_keys".into(),
313+
)),
293314
],
294315
send: vec![
295316
Filter::MessageLike(MessageLikeEventFilter::WithType(
@@ -299,6 +320,9 @@ mod tests {
299320
"org.matrix.msc3401.call.member".into(),
300321
"@user:matrix.server".into(),
301322
)),
323+
Filter::ToDevice(ToDeviceEventFilter::new(
324+
"io.element.call.encryption_keys".into(),
325+
)),
302326
],
303327
requires_client: true,
304328
update_delayed_event: true,
@@ -318,13 +342,17 @@ mod tests {
318342
"org.matrix.msc3401.call.member".into(),
319343
"@user:matrix.server".into(),
320344
)),
345+
Filter::ToDevice(ToDeviceEventFilter::new(
346+
"io.element.call.encryption_keys".into(),
347+
)),
321348
],
322349
send: vec![
323350
Filter::MessageLike(MessageLikeEventFilter::WithType("io.element.custom".into())),
324351
Filter::State(StateEventFilter::WithTypeAndStateKey(
325352
"org.matrix.msc3401.call.member".into(),
326353
"@user:matrix.server".into(),
327354
)),
355+
Filter::ToDevice(ToDeviceEventFilter::new("my.org.other.to_device_event".into())),
328356
],
329357
requires_client: true,
330358
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)