@@ -22,7 +22,7 @@ use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer}
22
22
use tracing:: debug;
23
23
24
24
use super :: {
25
- filter:: { Filter , FilterInput } ,
25
+ filter:: { Filter , FilterInput , ToDeviceEventFilter } ,
26
26
MessageLikeEventFilter , StateEventFilter ,
27
27
} ;
28
28
@@ -84,11 +84,13 @@ impl Capabilities {
84
84
}
85
85
}
86
86
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" ;
92
94
pub ( super ) const SEND_DELAYED_EVENT : & str = "org.matrix.msc4157.send.delayed_event" ;
93
95
pub ( super ) const UPDATE_DELAYED_EVENT : & str = "org.matrix.msc4157.update_delayed_event" ;
94
96
@@ -151,13 +153,15 @@ impl Serialize for Capabilities {
151
153
let name = match filter {
152
154
Filter :: MessageLike ( _) => READ_EVENT ,
153
155
Filter :: State ( _) => READ_STATE ,
156
+ Filter :: ToDevice ( _) => READ_TODEVICE ,
154
157
} ;
155
158
seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
156
159
}
157
160
for filter in & self . send {
158
161
let name = match filter {
159
162
Filter :: MessageLike ( _) => SEND_EVENT ,
160
163
Filter :: State ( _) => SEND_STATE ,
164
+ Filter :: ToDevice ( _) => SEND_TODEVICE ,
161
165
} ;
162
166
seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
163
167
}
@@ -209,6 +213,12 @@ impl<'de> Deserialize<'de> for Capabilities {
209
213
Some ( ( SEND_STATE , filter_s) ) => {
210
214
Ok ( Permission :: Send ( Filter :: State ( parse_state_event_filter ( filter_s) ) ) )
211
215
}
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
+ ) ) ) ,
212
222
_ => {
213
223
debug ! ( "Unknown capability `{s}`" ) ;
214
224
Ok ( Self :: Unknown )
@@ -235,6 +245,10 @@ impl<'de> Deserialize<'de> for Capabilities {
235
245
}
236
246
}
237
247
248
+ fn parse_to_device_event_filter ( s : & str ) -> ToDeviceEventFilter {
249
+ ToDeviceEventFilter :: new ( s. into ( ) )
250
+ }
251
+
238
252
let mut capabilities = Capabilities :: default ( ) ;
239
253
for capability in Vec :: < Permission > :: deserialize ( deserializer) ? {
240
254
match capability {
@@ -256,6 +270,8 @@ impl<'de> Deserialize<'de> for Capabilities {
256
270
mod tests {
257
271
use ruma:: events:: StateEventType ;
258
272
273
+ use crate :: widget:: filter:: ToDeviceEventFilter ;
274
+
259
275
use super :: * ;
260
276
261
277
#[ test]
@@ -276,8 +292,10 @@ mod tests {
276
292
"org.matrix.msc2762.receive.event:org.matrix.rageshake_request",
277
293
"org.matrix.msc2762.receive.state_event:m.room.member",
278
294
"org.matrix.msc2762.receive.state_event:org.matrix.msc3401.call.member",
295
+ "org.matrix.msc3819.receive.to_device:io.element.call.encryption_keys",
279
296
"org.matrix.msc2762.send.event:org.matrix.rageshake_request",
280
297
"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",
281
299
"org.matrix.msc4157.send.delayed_event",
282
300
"org.matrix.msc4157.update_delayed_event"
283
301
]"# ;
@@ -290,6 +308,9 @@ mod tests {
290
308
) ) ,
291
309
Filter :: State ( StateEventFilter :: WithType ( StateEventType :: RoomMember ) ) ,
292
310
Filter :: State ( StateEventFilter :: WithType ( "org.matrix.msc3401.call.member" . into( ) ) ) ,
311
+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
312
+ "io.element.call.encryption_keys" . into( ) ,
313
+ ) ) ,
293
314
] ,
294
315
send : vec ! [
295
316
Filter :: MessageLike ( MessageLikeEventFilter :: WithType (
@@ -299,6 +320,9 @@ mod tests {
299
320
"org.matrix.msc3401.call.member" . into( ) ,
300
321
"@user:matrix.server" . into( ) ,
301
322
) ) ,
323
+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
324
+ "io.element.call.encryption_keys" . into( ) ,
325
+ ) ) ,
302
326
] ,
303
327
requires_client : true ,
304
328
update_delayed_event : true ,
@@ -318,13 +342,17 @@ mod tests {
318
342
"org.matrix.msc3401.call.member" . into( ) ,
319
343
"@user:matrix.server" . into( ) ,
320
344
) ) ,
345
+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
346
+ "io.element.call.encryption_keys" . into( ) ,
347
+ ) ) ,
321
348
] ,
322
349
send : vec ! [
323
350
Filter :: MessageLike ( MessageLikeEventFilter :: WithType ( "io.element.custom" . into( ) ) ) ,
324
351
Filter :: State ( StateEventFilter :: WithTypeAndStateKey (
325
352
"org.matrix.msc3401.call.member" . into( ) ,
326
353
"@user:matrix.server" . into( ) ,
327
354
) ) ,
355
+ Filter :: ToDevice ( ToDeviceEventFilter :: new( "my.org.other.to_device_event" . into( ) ) ) ,
328
356
] ,
329
357
requires_client : true ,
330
358
update_delayed_event : false ,
0 commit comments