From c198cf6e9fc7abdf80affde31d769fecdf1a03c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20K=C3=B6sters?= Date: Thu, 27 May 2021 23:26:17 +0200 Subject: [PATCH] federation-api: Improve claim_keys endpoint --- crates/ruma-client-api/src/r0/to_device.rs | 73 +----------------- crates/ruma-common/src/lib.rs | 1 + crates/ruma-common/src/to_device.rs | 76 +++++++++++++++++++ crates/ruma-federation-api/CHANGELOG.md | 4 + .../src/keys/claim_keys/v1.rs | 3 +- .../src/transactions/edu.rs | 8 +- 6 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 crates/ruma-common/src/to_device.rs diff --git a/crates/ruma-client-api/src/r0/to_device.rs b/crates/ruma-client-api/src/r0/to_device.rs index 537883e4..476a0c8a 100644 --- a/crates/ruma-client-api/src/r0/to_device.rs +++ b/crates/ruma-client-api/src/r0/to_device.rs @@ -1,76 +1,5 @@ //! Endpoints for client devices to exchange information not persisted in room DAG. -use std::{ - convert::TryFrom, - fmt::{Display, Formatter, Result as FmtResult}, -}; - -use ruma_identifiers::DeviceIdBox; -use serde::{ - de::{self, Unexpected}, - Deserialize, Deserializer, Serialize, Serializer, -}; +pub use ruma_common::to_device::DeviceIdOrAllDevices; pub mod send_event_to_device; - -/// Represents one or all of a user's devices. -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -pub enum DeviceIdOrAllDevices { - /// Represents a device Id for one of a user's devices. - DeviceId(DeviceIdBox), - - /// Represents all devices for a user. - AllDevices, -} - -impl Display for DeviceIdOrAllDevices { - fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { - match self { - DeviceIdOrAllDevices::DeviceId(device_id) => write!(f, "{}", device_id.to_string()), - DeviceIdOrAllDevices::AllDevices => write!(f, "*"), - } - } -} - -impl From for DeviceIdOrAllDevices { - fn from(d: DeviceIdBox) -> Self { - DeviceIdOrAllDevices::DeviceId(d) - } -} - -impl TryFrom<&str> for DeviceIdOrAllDevices { - type Error = &'static str; - fn try_from(device_id_or_all_devices: &str) -> Result { - if device_id_or_all_devices.is_empty() { - Err("Device identifier cannot be empty") - } else if "*" == device_id_or_all_devices { - Ok(DeviceIdOrAllDevices::AllDevices) - } else { - Ok(DeviceIdOrAllDevices::DeviceId(device_id_or_all_devices.into())) - } - } -} - -impl Serialize for DeviceIdOrAllDevices { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match self { - Self::DeviceId(device_id) => device_id.serialize(serializer), - Self::AllDevices => serializer.serialize_str("*"), - } - } -} - -impl<'de> Deserialize<'de> for DeviceIdOrAllDevices { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = ruma_serde::deserialize_cow_str(deserializer)?; - DeviceIdOrAllDevices::try_from(s.as_ref()).map_err(|_| { - de::Error::invalid_value(Unexpected::Str(&s), &"a valid device identifier or '*'") - }) - } -} diff --git a/crates/ruma-common/src/lib.rs b/crates/ruma-common/src/lib.rs index 0626c8d4..9ea92d03 100644 --- a/crates/ruma-common/src/lib.rs +++ b/crates/ruma-common/src/lib.rs @@ -14,5 +14,6 @@ pub mod push; pub mod receipt; pub mod thirdparty; mod time; +pub mod to_device; pub use time::{MilliSecondsSinceUnixEpoch, SecondsSinceUnixEpoch}; diff --git a/crates/ruma-common/src/to_device.rs b/crates/ruma-common/src/to_device.rs new file mode 100644 index 00000000..aa977eef --- /dev/null +++ b/crates/ruma-common/src/to_device.rs @@ -0,0 +1,76 @@ +//! Common types for the Send-To-Device Messaging +//! +//! [send-to-device]: https://matrix.org/docs/spec/client_server/r0.6.1#id70 + +use std::{ + convert::TryFrom, + fmt::{Display, Formatter, Result as FmtResult}, +}; + +use ruma_identifiers::DeviceIdBox; +use serde::{ + de::{self, Unexpected}, + Deserialize, Deserializer, Serialize, Serializer, +}; + +/// Represents one or all of a user's devices. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub enum DeviceIdOrAllDevices { + /// Represents a device Id for one of a user's devices. + DeviceId(DeviceIdBox), + + /// Represents all devices for a user. + AllDevices, +} + +impl Display for DeviceIdOrAllDevices { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + match self { + DeviceIdOrAllDevices::DeviceId(device_id) => write!(f, "{}", device_id.to_string()), + DeviceIdOrAllDevices::AllDevices => write!(f, "*"), + } + } +} + +impl From for DeviceIdOrAllDevices { + fn from(d: DeviceIdBox) -> Self { + DeviceIdOrAllDevices::DeviceId(d) + } +} + +impl TryFrom<&str> for DeviceIdOrAllDevices { + type Error = &'static str; + fn try_from(device_id_or_all_devices: &str) -> Result { + if device_id_or_all_devices.is_empty() { + Err("Device identifier cannot be empty") + } else if "*" == device_id_or_all_devices { + Ok(DeviceIdOrAllDevices::AllDevices) + } else { + Ok(DeviceIdOrAllDevices::DeviceId(device_id_or_all_devices.into())) + } + } +} + +impl Serialize for DeviceIdOrAllDevices { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Self::DeviceId(device_id) => device_id.serialize(serializer), + Self::AllDevices => serializer.serialize_str("*"), + } + } +} + +impl<'de> Deserialize<'de> for DeviceIdOrAllDevices { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = ruma_serde::deserialize_cow_str(deserializer)?; + DeviceIdOrAllDevices::try_from(s.as_ref()).map_err(|_| { + de::Error::invalid_value(Unexpected::Str(&s), &"a valid device identifier or '*'") + }) + } +} diff --git a/crates/ruma-federation-api/CHANGELOG.md b/crates/ruma-federation-api/CHANGELOG.md index aeb29f24..6caac2e3 100644 --- a/crates/ruma-federation-api/CHANGELOG.md +++ b/crates/ruma-federation-api/CHANGELOG.md @@ -1,5 +1,9 @@ # [unreleased] +Breaking Changes: + +* Change types of keys::claim_keys::v1 response to match the client-server endpoint + Improvements: * Add master_keys and self_signing keys to keys::get_keys::v1 response diff --git a/crates/ruma-federation-api/src/keys/claim_keys/v1.rs b/crates/ruma-federation-api/src/keys/claim_keys/v1.rs index d1642149..9c6600b5 100644 --- a/crates/ruma-federation-api/src/keys/claim_keys/v1.rs +++ b/crates/ruma-federation-api/src/keys/claim_keys/v1.rs @@ -4,6 +4,7 @@ use std::collections::BTreeMap; use ruma_api::ruma_api; +use ruma_common::encryption::OneTimeKey; use ruma_identifiers::{DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, UserId}; use serde::{Deserialize, Serialize}; @@ -46,7 +47,7 @@ impl Response { pub type OneTimeKeyClaims = BTreeMap>; /// One time keys for use in pre-key messages -pub type OneTimeKeys = BTreeMap>>; +pub type OneTimeKeys = BTreeMap>>; /// A key and its signature #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/crates/ruma-federation-api/src/transactions/edu.rs b/crates/ruma-federation-api/src/transactions/edu.rs index a6cb79b3..d8ecc457 100644 --- a/crates/ruma-federation-api/src/transactions/edu.rs +++ b/crates/ruma-federation-api/src/transactions/edu.rs @@ -3,10 +3,10 @@ use std::collections::BTreeMap; use js_int::UInt; -use ruma_common::{encryption::DeviceKeys, presence::PresenceState}; -use ruma_events::{ - from_raw_json_value, receipt::Receipt, room_key::RoomKeyToDeviceEventContent, EventType, +use ruma_common::{ + encryption::DeviceKeys, presence::PresenceState, to_device::DeviceIdOrAllDevices, }; +use ruma_events::{from_raw_json_value, receipt::Receipt, EventType}; use ruma_identifiers::{DeviceIdBox, EventId, RoomId, UserId}; use serde::{de, Deserialize, Serialize}; use serde_json::{value::RawValue as RawJsonValue, Value as JsonValue}; @@ -258,7 +258,7 @@ pub struct DirectDeviceContent { /// The contents of the messages to be sent. These are arranged in a map /// of user IDs to a map of device IDs to message bodies. The device ID may /// also be *, meaning all known devices for the user. - pub messages: BTreeMap>, + pub messages: BTreeMap>>, } impl DirectDeviceContent {