From 36db5e47dda07a5567558c19c9491e8d48331a3d Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 26 Nov 2021 02:33:41 +0100 Subject: [PATCH 1/4] Upgrade Ruma --- crates/matrix-qrcode/Cargo.toml | 2 +- crates/matrix-qrcode/src/types.rs | 8 +- crates/matrix-sdk-appservice/Cargo.toml | 2 +- .../examples/appservice_autojoin.rs | 2 +- crates/matrix-sdk-appservice/src/lib.rs | 8 +- crates/matrix-sdk-base/Cargo.toml | 2 +- .../examples/state_inspector.rs | 36 +++-- crates/matrix-sdk-base/src/client.rs | 46 +++--- crates/matrix-sdk-base/src/media.rs | 4 +- crates/matrix-sdk-base/src/rooms/members.rs | 4 +- crates/matrix-sdk-base/src/rooms/mod.rs | 6 +- crates/matrix-sdk-base/src/rooms/normal.rs | 22 ++- crates/matrix-sdk-base/src/session.rs | 12 +- .../src/store/ambiguity_map.rs | 23 +-- .../matrix-sdk-base/src/store/memory_store.rs | 97 ++++++----- crates/matrix-sdk-base/src/store/mod.rs | 46 +++--- .../src/store/sled_store/mod.rs | 106 ++++++------ crates/matrix-sdk-common/Cargo.toml | 2 +- .../src/deserialized_responses.rs | 36 ++--- crates/matrix-sdk-crypto/Cargo.toml | 2 +- crates/matrix-sdk-crypto/README.md | 4 +- .../matrix-sdk-crypto/benches/crypto_bench.rs | 61 ++++--- .../src/backups/keys/backup.rs | 4 +- crates/matrix-sdk-crypto/src/backups/mod.rs | 42 ++--- crates/matrix-sdk-crypto/src/error.rs | 20 +-- .../src/file_encryption/key_export.rs | 12 +- .../src/gossiping/machine.rs | 120 +++++++------- crates/matrix-sdk-crypto/src/gossiping/mod.rs | 15 +- .../src/identities/device.rs | 14 +- .../src/identities/manager.rs | 54 ++++--- .../matrix-sdk-crypto/src/identities/user.rs | 45 +++--- crates/matrix-sdk-crypto/src/lib.rs | 4 +- crates/matrix-sdk-crypto/src/machine.rs | 153 ++++++++---------- crates/matrix-sdk-crypto/src/olm/account.rs | 68 ++++---- .../src/olm/group_sessions/inbound.rs | 12 +- .../src/olm/group_sessions/mod.rs | 10 +- .../src/olm/group_sessions/outbound.rs | 13 +- crates/matrix-sdk-crypto/src/olm/mod.rs | 43 ++--- .../matrix-sdk-crypto/src/olm/signing/mod.rs | 34 ++-- .../src/olm/signing/pk_signing.rs | 8 +- crates/matrix-sdk-crypto/src/olm/utility.rs | 6 +- crates/matrix-sdk-crypto/src/requests.rs | 17 +- .../src/session_manager/group_sessions.rs | 41 +++-- .../src/session_manager/sessions.rs | 70 +++----- crates/matrix-sdk-crypto/src/store/caches.rs | 20 +-- .../src/store/memorystore.rs | 25 ++- crates/matrix-sdk-crypto/src/store/mod.rs | 16 +- crates/matrix-sdk-crypto/src/store/sled.rs | 68 ++++---- .../src/verification/cache.rs | 2 +- .../src/verification/event_enums.rs | 34 ++-- .../src/verification/machine.rs | 38 ++--- .../matrix-sdk-crypto/src/verification/mod.rs | 34 ++-- .../src/verification/qrcode.rs | 42 ++--- .../src/verification/requests.rs | 88 +++++----- .../src/verification/sas/helpers.rs | 2 +- .../src/verification/sas/inner_sas.rs | 4 +- .../src/verification/sas/mod.rs | 30 ++-- .../src/verification/sas/sas_state.rs | 33 ++-- crates/matrix-sdk-test/Cargo.toml | 2 +- crates/matrix-sdk-test/src/lib.rs | 24 +-- crates/matrix-sdk/Cargo.toml | 2 +- crates/matrix-sdk/README.md | 2 +- .../examples/cross_signing_bootstrap.rs | 2 +- crates/matrix-sdk/examples/get_profiles.rs | 4 +- crates/matrix-sdk/src/client.rs | 126 +++++++-------- .../src/encryption/identities/devices.rs | 34 ++-- .../src/encryption/identities/mod.rs | 10 +- .../src/encryption/identities/users.rs | 12 +- crates/matrix-sdk/src/encryption/mod.rs | 28 ++-- crates/matrix-sdk/src/event_handler.rs | 2 +- crates/matrix-sdk/src/http_client.rs | 2 +- crates/matrix-sdk/src/room/common.rs | 2 +- crates/matrix-sdk/src/room/joined.rs | 8 +- crates/matrix-sdk/src/room_member.rs | 2 +- 74 files changed, 1016 insertions(+), 1018 deletions(-) diff --git a/crates/matrix-qrcode/Cargo.toml b/crates/matrix-qrcode/Cargo.toml index 6f0b1b5abad..8747634f47c 100644 --- a/crates/matrix-qrcode/Cargo.toml +++ b/crates/matrix-qrcode/Cargo.toml @@ -27,5 +27,5 @@ byteorder = "1.4.3" image = { version = "0.23.14", optional = true } qrcode = { version = "0.12.0", default-features = false } rqrr = { version = "0.4.0", optional = true } -ruma-identifiers = { git = "https://github.com/ruma/ruma", rev = "ac6ecc3e5" } +ruma-identifiers = { git = "https://github.com/ruma/ruma", rev = "6c4892664" } thiserror = "1.0.25" diff --git a/crates/matrix-qrcode/src/types.rs b/crates/matrix-qrcode/src/types.rs index afecb7e2149..45d18a3e349 100644 --- a/crates/matrix-qrcode/src/types.rs +++ b/crates/matrix-qrcode/src/types.rs @@ -13,7 +13,7 @@ // limitations under the License. use std::{ - convert::TryFrom, + convert::{TryFrom, TryInto}, io::{Cursor, Read}, }; @@ -316,7 +316,7 @@ impl QrVerificationData { match mode { VerificationData::QR_MODE => { - let event_id = EventId::try_from(flow_id)?; + let event_id = flow_id.try_into()?; Ok(VerificationData::new(event_id, first_key, second_key, shared_secret).into()) } SelfVerificationData::QR_MODE => { @@ -375,7 +375,7 @@ impl QrVerificationData { /// cross signing keys. #[derive(Clone, Debug, PartialEq)] pub struct VerificationData { - event_id: EventId, + event_id: Box, first_master_key: String, second_master_key: String, shared_secret: String, @@ -398,7 +398,7 @@ impl VerificationData { /// * ` shared_secret` - A random bytestring encoded as unpadded base64, /// needs to be at least 8 bytes long. pub fn new( - event_id: EventId, + event_id: Box, first_key: String, second_key: String, shared_secret: String, diff --git a/crates/matrix-sdk-appservice/Cargo.toml b/crates/matrix-sdk-appservice/Cargo.toml index 58af3017d6e..4b0f5e46193 100644 --- a/crates/matrix-sdk-appservice/Cargo.toml +++ b/crates/matrix-sdk-appservice/Cargo.toml @@ -38,7 +38,7 @@ warp = { version = "0.3.1", optional = true, default-features = false } [dependencies.ruma] git = "https://github.com/ruma/ruma" -rev = "ac6ecc3e5" +rev = "6c4892664" features = ["client-api-c", "appservice-api-s", "unstable-pre-spec"] [dev-dependencies] diff --git a/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs b/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs index e3f462f9519..49946b1d393 100644 --- a/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs +++ b/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs @@ -21,7 +21,7 @@ pub async fn handle_room_member( if !appservice.user_id_is_in_namespace(&event.state_key)? { trace!("not an appservice user: {}", event.state_key); } else if let MembershipState::Invite = event.content.membership { - let user_id = UserId::try_from(event.state_key.as_str())?; + let user_id = Box::::try_from(event.state_key.as_str())?; appservice.register_virtual_user(user_id.localpart()).await?; let client = appservice.virtual_user_client(user_id.localpart()).await?; diff --git a/crates/matrix-sdk-appservice/src/lib.rs b/crates/matrix-sdk-appservice/src/lib.rs index 7f3ef985b4c..3b8c7aaa763 100644 --- a/crates/matrix-sdk-appservice/src/lib.rs +++ b/crates/matrix-sdk-appservice/src/lib.rs @@ -107,7 +107,7 @@ use ruma::{ }, client::r0::account::register, }, - assign, identifiers, DeviceId, ServerNameBox, UserId, + assign, identifiers, DeviceId, ServerName, UserId, }; use serde::de::DeserializeOwned; use tracing::info; @@ -203,7 +203,7 @@ pub type VirtualUser = (); #[derive(Debug, Clone)] pub struct AppService { homeserver_url: Url, - server_name: ServerNameBox, + server_name: Box, registration: Arc, clients: Arc>, event_handler: event_handler::EventHandler, @@ -227,7 +227,7 @@ impl AppService { /// [AppService Registration]: https://matrix.org/docs/spec/application_service/r0.1.2#registration pub async fn new( homeserver_url: impl TryInto, - server_name: impl TryInto, + server_name: impl TryInto, Error = identifiers::Error>, registration: AppServiceRegistration, ) -> Result { let appservice = Self::new_with_config( @@ -245,7 +245,7 @@ impl AppService { /// [`Client`] pub async fn new_with_config( homeserver_url: impl TryInto, - server_name: impl TryInto, + server_name: impl TryInto, Error = identifiers::Error>, registration: AppServiceRegistration, client_config: ClientConfig, ) -> Result { diff --git a/crates/matrix-sdk-base/Cargo.toml b/crates/matrix-sdk-base/Cargo.toml index 648acc76ef2..31b1c049d82 100644 --- a/crates/matrix-sdk-base/Cargo.toml +++ b/crates/matrix-sdk-base/Cargo.toml @@ -35,7 +35,7 @@ matrix-sdk-common = { version = "0.4.0", path = "../matrix-sdk-common" } matrix-sdk-crypto = { version = "0.4.0", path = "../matrix-sdk-crypto", optional = true } pbkdf2 = { version = "0.9.0", default-features = false, optional = true } rand = { version = "0.8.4", optional = true } -ruma = { git = "https://github.com/ruma/ruma", rev = "ac6ecc3e5", features = ["client-api-c", "unstable-pre-spec"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "6c4892664", features = ["client-api-c", "unstable-pre-spec"] } serde = { version = "1.0.126", features = ["rc"] } serde_json = "1.0.64" sha2 = { version = "0.9.5", optional = true } diff --git a/crates/matrix-sdk-base/examples/state_inspector.rs b/crates/matrix-sdk-base/examples/state_inspector.rs index 3e6386376dc..fc670e7ab74 100644 --- a/crates/matrix-sdk-base/examples/state_inspector.rs +++ b/crates/matrix-sdk-base/examples/state_inspector.rs @@ -223,27 +223,27 @@ impl Inspector { match matches.subcommand() { ("get-profiles", args) => { let args = args.expect("No args provided for get-state"); - let room_id = RoomId::try_from(args.value_of("room-id").unwrap()).unwrap(); + let room_id = Box::::try_from(args.value_of("room-id").unwrap()).unwrap(); self.get_profiles(room_id).await; } ("get-members", args) => { let args = args.expect("No args provided for get-state"); - let room_id = RoomId::try_from(args.value_of("room-id").unwrap()).unwrap(); + let room_id = Box::::try_from(args.value_of("room-id").unwrap()).unwrap(); self.get_members(room_id).await; } ("list-rooms", _) => self.list_rooms().await, ("get-display-names", args) => { let args = args.expect("No args provided for get-state"); - let room_id = RoomId::try_from(args.value_of("room-id").unwrap()).unwrap(); + let room_id = Box::::try_from(args.value_of("room-id").unwrap()).unwrap(); let display_name = args.value_of("display-name").unwrap().to_string(); self.get_display_name_owners(room_id, display_name).await; } ("get-state", args) => { let args = args.expect("No args provided for get-state"); - let room_id = RoomId::try_from(args.value_of("room-id").unwrap()).unwrap(); + let room_id = Box::::try_from(args.value_of("room-id").unwrap()).unwrap(); let event_type = EventType::try_from(args.value_of("event-type").unwrap()).unwrap(); self.get_state(room_id, event_type).await; } @@ -256,13 +256,13 @@ impl Inspector { self.printer.pretty_print_struct(&rooms); } - async fn get_display_name_owners(&self, room_id: RoomId, display_name: String) { + async fn get_display_name_owners(&self, room_id: Box, display_name: String) { let users = self.store.get_users_with_display_name(&room_id, &display_name).await.unwrap(); self.printer.pretty_print_struct(&users); } - async fn get_profiles(&self, room_id: RoomId) { - let joined: Vec = self.store.get_joined_user_ids(&room_id).await.unwrap(); + async fn get_profiles(&self, room_id: Box) { + let joined: Vec> = self.store.get_joined_user_ids(&room_id).await.unwrap(); for member in joined { let event = self.store.get_profile(&room_id, &member).await.unwrap(); @@ -270,8 +270,8 @@ impl Inspector { } } - async fn get_members(&self, room_id: RoomId) { - let joined: Vec = self.store.get_joined_user_ids(&room_id).await.unwrap(); + async fn get_members(&self, room_id: Box) { + let joined: Vec> = self.store.get_joined_user_ids(&room_id).await.unwrap(); for member in joined { let event = self.store.get_member_event(&room_id, &member).await.unwrap(); @@ -279,7 +279,7 @@ impl Inspector { } } - async fn get_state(&self, room_id: RoomId, event_type: EventType) { + async fn get_state(&self, room_id: Box, event_type: EventType) { self.printer.pretty_print_struct( &self.store.get_state_event(&room_id, event_type, "").await.unwrap(), ); @@ -290,22 +290,30 @@ impl Inspector { SubCommand::with_name("list-rooms"), SubCommand::with_name("get-members").arg( Arg::with_name("room-id").required(true).validator(|r| { - RoomId::try_from(r).map(|_| ()).map_err(|_| "Invalid room id given".to_owned()) + Box::::try_from(r) + .map(|_| ()) + .map_err(|_| "Invalid room id given".to_owned()) }), ), SubCommand::with_name("get-profiles").arg( Arg::with_name("room-id").required(true).validator(|r| { - RoomId::try_from(r).map(|_| ()).map_err(|_| "Invalid room id given".to_owned()) + Box::::try_from(r) + .map(|_| ()) + .map_err(|_| "Invalid room id given".to_owned()) }), ), SubCommand::with_name("get-display-names") .arg(Arg::with_name("room-id").required(true).validator(|r| { - RoomId::try_from(r).map(|_| ()).map_err(|_| "Invalid room id given".to_owned()) + Box::::try_from(r) + .map(|_| ()) + .map_err(|_| "Invalid room id given".to_owned()) })) .arg(Arg::with_name("display-name").required(true)), SubCommand::with_name("get-state") .arg(Arg::with_name("room-id").required(true).validator(|r| { - RoomId::try_from(r).map(|_| ()).map_err(|_| "Invalid room id given".to_owned()) + Box::::try_from(r) + .map(|_| ()) + .map_err(|_| "Invalid room id given".to_owned()) })) .arg(Arg::with_name("event-type").required(true).validator(|e| { EventType::try_from(e).map(|_| ()).map_err(|_| "Invalid event type".to_string()) diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index 209ea5859e0..2882a7fe44c 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(feature = "encryption")] +use std::ops::Deref; use std::{ collections::{BTreeMap, BTreeSet}, convert::TryFrom, @@ -352,7 +354,7 @@ impl BaseClient { room_info: &mut RoomInfo, changes: &mut StateChanges, ambiguity_cache: &mut AmbiguityCache, - user_ids: &mut BTreeSet, + user_ids: &mut BTreeSet>, ) -> Result { let room_id = room.room_id(); let user_id = room.own_user_id(); @@ -388,14 +390,14 @@ impl BaseClient { if member.state_key == member.sender { changes .profiles - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) .insert(member.sender.clone(), member.content.clone()); } changes .members - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) .insert(member.state_key.clone(), member); } @@ -443,7 +445,7 @@ impl BaseClient { actions, event.event.clone(), false, - room_id.clone(), + room_id.to_owned(), MilliSecondsSinceUnixEpoch::now(), ), ); @@ -475,7 +477,7 @@ impl BaseClient { events: &[Raw], room_info: &mut RoomInfo, ) -> ( - BTreeMap, + BTreeMap, StrippedMemberEvent>, BTreeMap>>, ) { events.iter().fold( @@ -520,7 +522,7 @@ impl BaseClient { ambiguity_cache: &mut AmbiguityCache, events: &[Raw], room_info: &mut RoomInfo, - ) -> StoreResult> { + ) -> StoreResult>> { let mut members = BTreeMap::new(); let mut state_events = BTreeMap::new(); let mut user_ids = BTreeSet::new(); @@ -577,9 +579,9 @@ impl BaseClient { } } - changes.members.insert(room_id.as_ref().clone(), members); - changes.profiles.insert(room_id.as_ref().clone(), profiles); - changes.state.insert(room_id.as_ref().clone(), state_events); + changes.members.insert((&*room_id).to_owned(), members); + changes.profiles.insert((&*room_id).to_owned(), profiles); + changes.state.insert((&*room_id).to_owned(), state_events); Ok(user_ids) } @@ -748,11 +750,12 @@ impl BaseClient { let joined = self.store.get_joined_user_ids(&room_id).await?; let invited = self.store.get_invited_user_ids(&room_id).await?; - let user_ids: Vec<&UserId> = joined.iter().chain(&invited).collect(); + let user_ids: Vec<&UserId> = + joined.iter().chain(&invited).map(Deref::deref).collect(); o.update_tracked_users(user_ids).await } - o.update_tracked_users(&user_ids).await + o.update_tracked_users(user_ids.iter().map(|x| &**x)).await } } @@ -923,14 +926,14 @@ impl BaseClient { if member.state_key == member.sender { changes .profiles - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) .insert(member.sender.clone(), member.content.clone()); } changes .members - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) .insert(member.state_key.clone(), member.clone()); } @@ -939,7 +942,7 @@ impl BaseClient { #[cfg(feature = "encryption")] if room_info.is_encrypted() { if let Some(o) = self.olm_machine().await { - o.update_tracked_users(&user_ids).await + o.update_tracked_users(user_ids.iter().map(Deref::deref)).await } } @@ -1077,7 +1080,7 @@ impl BaseClient { let settings = settings.ok_or(MegolmError::EncryptionNotEnabled)?; let settings = EncryptionSettings::new(settings, history_visibility); - Ok(o.share_group_session(room_id, members, settings).await?) + Ok(o.share_group_session(room_id, members.map(Deref::deref), settings).await?) } None => panic!("Olm machine wasn't started"), } @@ -1145,10 +1148,10 @@ impl BaseClient { /// # use matrix_sdk_base::BaseClient; /// # use ruma::UserId; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let client = BaseClient::new().unwrap(); /// # block_on(async { - /// let device = client.get_device(&alice, "DEVICEID".into()).await; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await; /// /// println!("{:?}", device); /// # }); @@ -1201,7 +1204,7 @@ impl BaseClient { /// # use matrix_sdk_base::BaseClient; /// # use ruma::UserId; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let client = BaseClient::new().unwrap(); /// # block_on(async { /// let devices = client.get_user_devices(&alice).await.unwrap(); @@ -1307,7 +1310,7 @@ impl BaseClient { }; Ok(Some(PushConditionRoomCtx { - room_id: room_id.clone(), + room_id: room_id.to_owned(), member_count: UInt::new(member_count).unwrap_or(UInt::MAX), user_display_name, users_power_levels: room_power_levels.users, @@ -1330,7 +1333,8 @@ impl BaseClient { push_rules.member_count = UInt::new(room_info.active_members_count()).unwrap_or(UInt::MAX); - if let Some(member) = changes.members.get(room_id).and_then(|members| members.get(user_id)) + if let Some(member) = + changes.members.get(&**room_id).and_then(|members| members.get(user_id)) { push_rules.user_display_name = member.content.displayname.clone().unwrap_or_else(|| user_id.localpart().to_owned()) @@ -1338,7 +1342,7 @@ impl BaseClient { if let Some(AnySyncStateEvent::RoomPowerLevels(event)) = changes .state - .get(room_id) + .get(&**room_id) .and_then(|types| types.get(EventType::RoomPowerLevels.as_str())) .and_then(|events| events.get("")) .and_then(|e| e.deserialize().ok()) diff --git a/crates/matrix-sdk-base/src/media.rs b/crates/matrix-sdk-base/src/media.rs index bc22c7d3852..6b33d9fccba 100644 --- a/crates/matrix-sdk-base/src/media.rs +++ b/crates/matrix-sdk-base/src/media.rs @@ -68,7 +68,7 @@ impl UniqueKey for MediaThumbnailSize { #[derive(Clone, Debug)] pub enum MediaType { /// A media content URI. - Uri(MxcUri), + Uri(Box), /// An encrypted media content. Encrypted(Box), @@ -219,7 +219,7 @@ pub(crate) mod test { use super::*; - fn encrypted_test_data() -> (MxcUri, EncryptedFile) { + fn encrypted_test_data() -> (Box, EncryptedFile) { let c = &mut std::io::Cursor::new("some content"); let reader = crate::crypto::AttachmentEncryptor::new(c); diff --git a/crates/matrix-sdk-base/src/rooms/members.rs b/crates/matrix-sdk-base/src/rooms/members.rs index 193006e53f9..d9315b39ef6 100644 --- a/crates/matrix-sdk-base/src/rooms/members.rs +++ b/crates/matrix-sdk-base/src/rooms/members.rs @@ -67,8 +67,8 @@ impl RoomMember { /// Get the avatar url of the member, if there is one. pub fn avatar_url(&self) -> Option<&MxcUri> { match self.profile.as_ref() { - Some(p) => p.avatar_url.as_ref(), - None => self.event.content.avatar_url.as_ref(), + Some(p) => p.avatar_url.as_deref(), + None => self.event.content.avatar_url.as_deref(), } } diff --git a/crates/matrix-sdk-base/src/rooms/mod.rs b/crates/matrix-sdk-base/src/rooms/mod.rs index 69cbf4f2a6d..819aa93fd9a 100644 --- a/crates/matrix-sdk-base/src/rooms/mod.rs +++ b/crates/matrix-sdk-base/src/rooms/mod.rs @@ -24,14 +24,14 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BaseRoomInfo { /// The avatar URL of this room. - pub avatar_url: Option, + pub avatar_url: Option>, /// The canonical alias of this room. - pub canonical_alias: Option, + pub canonical_alias: Option>, /// The `m.room.create` event content of this room. pub create: Option, /// The user id this room is sharing the direct message with, if the room is /// a direct message. - pub dm_target: Option, + pub dm_target: Option>, /// The `m.room.encryption` event content that enabled E2EE in this room. pub encryption: Option, /// The guest access policy of this room. diff --git a/crates/matrix-sdk-base/src/rooms/normal.rs b/crates/matrix-sdk-base/src/rooms/normal.rs index 30dff29db8f..3d2ca25a0c0 100644 --- a/crates/matrix-sdk-base/src/rooms/normal.rs +++ b/crates/matrix-sdk-base/src/rooms/normal.rs @@ -87,10 +87,8 @@ impl Room { room_id: &RoomId, room_type: RoomType, ) -> Self { - let room_id = Arc::new(room_id.clone()); - let room_info = RoomInfo { - room_id, + room_id: room_id.into(), room_type, notification_counts: Default::default(), summary: Default::default(), @@ -108,7 +106,7 @@ impl Room { room_info: RoomInfo, ) -> Self { Self { - own_user_id: Arc::new(own_user_id.clone()), + own_user_id: own_user_id.into(), room_id: room_info.room_id.clone(), store, inner: Arc::new(SyncRwLock::new(room_info)), @@ -160,12 +158,12 @@ impl Room { } /// Get the avatar url of this room. - pub fn avatar_url(&self) -> Option { + pub fn avatar_url(&self) -> Option> { self.inner.read().unwrap().base_info.avatar_url.clone() } /// Get the canonical alias of this room. - pub fn canonical_alias(&self) -> Option { + pub fn canonical_alias(&self) -> Option> { self.inner.read().unwrap().base_info.canonical_alias.clone() } @@ -189,7 +187,7 @@ impl Room { /// *Note*: The member list might have been modified in the meantime and /// the target might not even be in the room anymore. This setting should /// only be considered as guidance. - pub fn direct_target(&self) -> Option { + pub fn direct_target(&self) -> Option> { self.inner.read().unwrap().base_info.dm_target.clone() } @@ -264,7 +262,7 @@ impl Room { /// Get the list of users ids that are considered to be joined members of /// this room. - pub async fn joined_user_ids(&self) -> StoreResult> { + pub async fn joined_user_ids(&self) -> StoreResult>> { self.store.get_joined_user_ids(self.room_id()).await } @@ -348,7 +346,7 @@ impl Room { let members: Vec<_> = stream::iter(summary.heroes.iter().filter(|u| !is_own_user_id(u))) .filter_map(|u| async move { - let user_id = UserId::try_from(u.as_str()).ok()?; + let user_id = Box::::try_from(u.as_str()).ok()?; self.get_member(&user_id).await.transpose() }) .collect() @@ -404,7 +402,7 @@ impl Room { .base_info .create .as_ref() - .map(|c| &c.creator == user_id) + .map(|c| c.creator == user_id) .unwrap_or(false); let power = @@ -460,7 +458,7 @@ impl Room { pub async fn user_read_receipt( &self, user_id: &UserId, - ) -> StoreResult> { + ) -> StoreResult, Receipt)>> { self.store.get_user_room_receipt_event(self.room_id(), ReceiptType::Read, user_id).await } @@ -469,7 +467,7 @@ impl Room { pub async fn event_read_receipts( &self, event_id: &EventId, - ) -> StoreResult> { + ) -> StoreResult, Receipt)>> { self.store.get_event_room_receipt_events(self.room_id(), ReceiptType::Read, event_id).await } } diff --git a/crates/matrix-sdk-base/src/session.rs b/crates/matrix-sdk-base/src/session.rs index a5f0620f4eb..57b668521a2 100644 --- a/crates/matrix-sdk-base/src/session.rs +++ b/crates/matrix-sdk-base/src/session.rs @@ -15,7 +15,7 @@ //! User sessions. -use ruma::{DeviceIdBox, UserId}; +use ruma::{DeviceId, UserId}; use serde::{Deserialize, Serialize}; /// A user session, containing an access token and information about the @@ -25,12 +25,12 @@ use serde::{Deserialize, Serialize}; /// /// ``` /// use matrix_sdk_base::Session; -/// use ruma::{DeviceIdBox, user_id}; +/// use ruma::{device_id, user_id}; /// /// let session = Session { /// access_token: "My-Token".to_owned(), -/// user_id: user_id!("@example:localhost"), -/// device_id: DeviceIdBox::from("MYDEVICEID"), +/// user_id: user_id!("@example:localhost").to_owned(), +/// device_id: device_id!("MYDEVICEID").to_owned(), /// }; /// /// assert_eq!(session.device_id.as_str(), "MYDEVICEID"); @@ -40,9 +40,9 @@ pub struct Session { /// The access token used for this session. pub access_token: String, /// The user the access token was issued for. - pub user_id: UserId, + pub user_id: Box, /// The ID of the client device - pub device_id: DeviceIdBox, + pub device_id: Box, } impl From for Session { diff --git a/crates/matrix-sdk-base/src/store/ambiguity_map.rs b/crates/matrix-sdk-base/src/store/ambiguity_map.rs index 79463affc2b..4974b5b2c11 100644 --- a/crates/matrix-sdk-base/src/store/ambiguity_map.rs +++ b/crates/matrix-sdk-base/src/store/ambiguity_map.rs @@ -24,18 +24,18 @@ use crate::Store; #[derive(Clone, Debug)] pub struct AmbiguityCache { pub store: Store, - pub cache: BTreeMap>>, - pub changes: BTreeMap>, + pub cache: BTreeMap, BTreeMap>>>, + pub changes: BTreeMap, BTreeMap, AmbiguityChange>>, } #[derive(Clone, Debug)] struct AmbiguityMap { display_name: String, - users: BTreeSet, + users: BTreeSet>, } impl AmbiguityMap { - fn remove(&mut self, user_id: &UserId) -> Option { + fn remove(&mut self, user_id: &UserId) -> Option> { self.users.remove(user_id); if self.user_count() == 1 { @@ -45,7 +45,7 @@ impl AmbiguityMap { } } - fn add(&mut self, user_id: UserId) -> Option { + fn add(&mut self, user_id: Box) -> Option> { let ambiguous_user = if self.user_count() == 1 { self.users.iter().next().cloned() } else { None }; @@ -129,7 +129,7 @@ impl AmbiguityCache { old_map: Option, new_map: Option, ) { - let entry = self.cache.entry(room_id.clone()).or_insert_with(BTreeMap::new); + let entry = self.cache.entry(room_id.to_owned()).or_insert_with(BTreeMap::new); if let Some(old) = old_map { entry.insert(old.display_name, old.users); @@ -140,8 +140,11 @@ impl AmbiguityCache { } } - fn add_change(&mut self, room_id: &RoomId, event_id: EventId, change: AmbiguityChange) { - self.changes.entry(room_id.clone()).or_insert_with(BTreeMap::new).insert(event_id, change); + fn add_change(&mut self, room_id: &RoomId, event_id: Box, change: AmbiguityChange) { + self.changes + .entry(room_id.to_owned()) + .or_insert_with(BTreeMap::new) + .insert(event_id, change); } async fn get( @@ -190,7 +193,7 @@ impl AmbiguityCache { let old_map = if let Some(old_name) = old_display_name.as_deref() { let old_display_name_map = if let Some(u) = - self.cache.entry(room_id.clone()).or_insert_with(BTreeMap::new).get(old_name) + self.cache.entry(room_id.to_owned()).or_insert_with(BTreeMap::new).get(old_name) { u.clone() } else { @@ -222,7 +225,7 @@ impl AmbiguityCache { let new_display_name_map = if let Some(u) = self .cache - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) .get(new_display_name) { diff --git a/crates/matrix-sdk-base/src/store/memory_store.rs b/crates/matrix-sdk-base/src/store/memory_store.rs index e7f35a90fa0..d6af4394d28 100644 --- a/crates/matrix-sdk-base/src/store/memory_store.rs +++ b/crates/matrix-sdk-base/src/store/memory_store.rs @@ -40,31 +40,30 @@ use crate::{ media::{MediaRequest, UniqueKey}, }; +#[allow(clippy::type_complexity)] #[derive(Debug, Clone)] pub struct MemoryStore { sync_token: Arc>>, filters: Arc>, account_data: Arc>>, - members: Arc>>, - profiles: Arc>>, - display_names: Arc>>>, - joined_user_ids: Arc>>, - invited_user_ids: Arc>>, - room_info: Arc>, - #[allow(clippy::type_complexity)] - room_state: Arc>>>>, - room_account_data: Arc>>>, - stripped_room_info: Arc>, - #[allow(clippy::type_complexity)] + members: Arc, DashMap, MemberEvent>>>, + profiles: Arc, DashMap, RoomMemberEventContent>>>, + display_names: Arc, DashMap>>>>, + joined_user_ids: Arc, DashSet>>>, + invited_user_ids: Arc, DashSet>>>, + room_info: Arc, RoomInfo>>, + room_state: Arc, DashMap>>>>, + room_account_data: Arc, DashMap>>>, + stripped_room_info: Arc, RoomInfo>>, stripped_room_state: - Arc>>>>, - stripped_members: Arc>>, - presence: Arc>>, - #[allow(clippy::type_complexity)] - room_user_receipts: Arc>>>, - #[allow(clippy::type_complexity)] - room_event_receipts: - Arc>>>>, + Arc, DashMap>>>>, + stripped_members: Arc, DashMap, StrippedMemberEvent>>>, + presence: Arc, Raw>>, + room_user_receipts: + Arc, DashMap, (Box, Receipt)>>>>, + room_event_receipts: Arc< + DashMap, DashMap, DashMap, Receipt>>>>, + >, media: Arc>>>, custom: Arc, Vec>>, } @@ -323,21 +322,21 @@ impl MemoryStore { Ok(self.members.get(room_id).and_then(|m| m.get(state_key).map(|m| m.clone()))) } - fn get_user_ids(&self, room_id: &RoomId) -> Vec { + fn get_user_ids(&self, room_id: &RoomId) -> Vec> { self.members .get(room_id) .map(|u| u.iter().map(|u| u.key().clone()).collect()) .unwrap_or_default() } - fn get_invited_user_ids(&self, room_id: &RoomId) -> Vec { + fn get_invited_user_ids(&self, room_id: &RoomId) -> Vec> { self.invited_user_ids .get(room_id) .map(|u| u.iter().map(|u| u.clone()).collect()) .unwrap_or_default() } - fn get_joined_user_ids(&self, room_id: &RoomId) -> Vec { + fn get_joined_user_ids(&self, room_id: &RoomId) -> Vec> { self.joined_user_ids .get(room_id) .map(|u| u.iter().map(|u| u.clone()).collect()) @@ -375,7 +374,7 @@ impl MemoryStore { room_id: &RoomId, receipt_type: ReceiptType, user_id: &UserId, - ) -> Result> { + ) -> Result, Receipt)>> { Ok(self.room_user_receipts.get(room_id).and_then(|m| { m.get(receipt_type.as_ref()).and_then(|m| m.get(user_id).map(|r| r.clone())) })) @@ -386,7 +385,7 @@ impl MemoryStore { room_id: &RoomId, receipt_type: ReceiptType, event_id: &EventId, - ) -> Result> { + ) -> Result, Receipt)>> { Ok(self .room_event_receipts .get(room_id) @@ -497,15 +496,15 @@ impl StateStore for MemoryStore { self.get_member_event(room_id, state_key).await } - async fn get_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_user_ids(&self, room_id: &RoomId) -> Result>> { Ok(self.get_user_ids(room_id)) } - async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result>> { Ok(self.get_invited_user_ids(room_id)) } - async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result>> { Ok(self.get_joined_user_ids(room_id)) } @@ -521,7 +520,7 @@ impl StateStore for MemoryStore { &self, room_id: &RoomId, display_name: &str, - ) -> Result> { + ) -> Result>> { Ok(self .display_names .get(room_id) @@ -549,7 +548,7 @@ impl StateStore for MemoryStore { room_id: &RoomId, receipt_type: ReceiptType, user_id: &UserId, - ) -> Result> { + ) -> Result, Receipt)>> { self.get_user_room_receipt_event(room_id, receipt_type, user_id).await } @@ -558,7 +557,7 @@ impl StateStore for MemoryStore { room_id: &RoomId, receipt_type: ReceiptType, event_id: &EventId, - ) -> Result> { + ) -> Result, Receipt)>> { self.get_event_room_receipt_events(room_id, receipt_type, event_id).await } @@ -599,7 +598,7 @@ mod test { use super::{MemoryStore, StateChanges}; use crate::media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType}; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } @@ -609,13 +608,13 @@ mod test { let room_id = room_id!("!test:localhost"); - let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org"); - let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org"); + let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org").to_owned(); + let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org").to_owned(); let first_receipt_event = serde_json::from_value(json!({ first_event_id.clone(): { "m.read": { - user_id(): { + user_id().to_owned(): { "ts": 1436451550453u64 } } @@ -626,7 +625,7 @@ mod test { let second_receipt_event = serde_json::from_value(json!({ second_event_id.clone(): { "m.read": { - user_id(): { + user_id().to_owned(): { "ts": 1436451551453u64 } } @@ -635,61 +634,61 @@ mod test { .unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_none()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .is_empty()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .is_empty()); let mut changes = StateChanges::default(); - changes.add_receipts(&room_id, first_receipt_event); + changes.add_receipts(room_id, first_receipt_event); store.save_changes(&changes).await.unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_some(),); assert_eq!( store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .len(), 1 ); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .is_empty()); let mut changes = StateChanges::default(); - changes.add_receipts(&room_id, second_receipt_event); + changes.add_receipts(room_id, second_receipt_event); store.save_changes(&changes).await.unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_some()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .is_empty()); assert_eq!( store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .len(), @@ -705,10 +704,10 @@ mod test { let content: Vec = "somebinarydata".into(); let request_file = - MediaRequest { media_type: MediaType::Uri(uri.clone()), format: MediaFormat::File }; + MediaRequest { media_type: MediaType::Uri(uri.to_owned()), format: MediaFormat::File }; let request_thumbnail = MediaRequest { - media_type: MediaType::Uri(uri.clone()), + media_type: MediaType::Uri(uri.to_owned()), format: MediaFormat::Thumbnail(MediaThumbnailSize { method: Method::Crop, width: uint!(100), @@ -731,7 +730,7 @@ mod test { store.add_media_content(&request_thumbnail, content.clone()).await.unwrap(); assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_some()); - store.remove_media_content_for_uri(&uri).await.unwrap(); + store.remove_media_content_for_uri(uri).await.unwrap(); assert!(store.get_media_content(&request_file).await.unwrap().is_none()); assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_none()); } diff --git a/crates/matrix-sdk-base/src/store/mod.rs b/crates/matrix-sdk-base/src/store/mod.rs index adcbd379134..83b423439fc 100644 --- a/crates/matrix-sdk-base/src/store/mod.rs +++ b/crates/matrix-sdk-base/src/store/mod.rs @@ -177,15 +177,15 @@ pub trait StateStore: AsyncTraitDeps { ) -> Result>; /// Get all the user ids of members for a given room. - async fn get_user_ids(&self, room_id: &RoomId) -> Result>; + async fn get_user_ids(&self, room_id: &RoomId) -> Result>>; /// Get all the user ids of members that are in the invited state for a /// given room. - async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result>; + async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result>>; /// Get all the user ids of members that are in the joined state for a /// given room. - async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result>; + async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result>>; /// Get all the pure `RoomInfo`s the store knows about. async fn get_room_infos(&self) -> Result>; @@ -205,7 +205,7 @@ pub trait StateStore: AsyncTraitDeps { &self, room_id: &RoomId, display_name: &str, - ) -> Result>; + ) -> Result>>; /// Get an event out of the account data store. /// @@ -247,7 +247,7 @@ pub trait StateStore: AsyncTraitDeps { room_id: &RoomId, receipt_type: ReceiptType, user_id: &UserId, - ) -> Result>; + ) -> Result, Receipt)>>; /// Get events out of the event room receipt store. /// @@ -265,7 +265,7 @@ pub trait StateStore: AsyncTraitDeps { room_id: &RoomId, receipt_type: ReceiptType, event_id: &EventId, - ) -> Result>; + ) -> Result, Receipt)>>; /// Get arbitrary data from the custom store /// @@ -324,8 +324,8 @@ pub struct Store { inner: Arc, pub(crate) session: Arc>>, pub(crate) sync_token: Arc>>, - rooms: Arc>, - stripped_rooms: Arc>, + rooms: Arc, Room>>, + stripped_rooms: Arc, Room>>, } impl Store { @@ -417,7 +417,7 @@ impl Store { let user_id = &session.as_ref().expect("Creating room while not being logged in").user_id; self.stripped_rooms - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(|| Room::new(user_id, self.inner.clone(), room_id, RoomType::Invited)) .clone() } @@ -427,7 +427,7 @@ impl Store { let user_id = &session.as_ref().expect("Creating room while not being logged in").user_id; self.rooms - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_insert_with(|| Room::new(user_id, self.inner.clone(), room_id, room_type)) .clone() } @@ -452,38 +452,40 @@ pub struct StateChanges { /// A mapping of event type string to `AnyBasicEvent`. pub account_data: BTreeMap>, /// A mapping of `UserId` to `PresenceEvent`. - pub presence: BTreeMap>, + pub presence: BTreeMap, Raw>, /// A mapping of `RoomId` to a map of users and their `MemberEvent`. - pub members: BTreeMap>, + pub members: BTreeMap, BTreeMap, MemberEvent>>, /// A mapping of `RoomId` to a map of users and their /// `RoomMemberEventContent`. - pub profiles: BTreeMap>, + pub profiles: BTreeMap, BTreeMap, RoomMemberEventContent>>, /// A mapping of `RoomId` to a map of event type string to a state key and /// `AnySyncStateEvent`. - pub state: BTreeMap>>>, + #[allow(clippy::type_complexity)] + pub state: BTreeMap, BTreeMap>>>, /// A mapping of `RoomId` to a map of event type string to `AnyBasicEvent`. - pub room_account_data: BTreeMap>>, + pub room_account_data: BTreeMap, BTreeMap>>, /// A map of `RoomId` to `RoomInfo`. - pub room_infos: BTreeMap, + pub room_infos: BTreeMap, RoomInfo>, /// A map of `RoomId` to `ReceiptEventContent`. - pub receipts: BTreeMap, + pub receipts: BTreeMap, ReceiptEventContent>, /// A mapping of `RoomId` to a map of event type to a map of state key to /// `AnyStrippedStateEvent`. + #[allow(clippy::type_complexity)] pub stripped_state: - BTreeMap>>>, + BTreeMap, BTreeMap>>>, /// A mapping of `RoomId` to a map of users and their `StrippedMemberEvent`. - pub stripped_members: BTreeMap>, + pub stripped_members: BTreeMap, BTreeMap, StrippedMemberEvent>>, /// A map of `RoomId` to `RoomInfo`. - pub invited_room_info: BTreeMap, + pub invited_room_info: BTreeMap, RoomInfo>, /// A map from room id to a map of a display name and a set of user ids that /// share that display name in the given room. - pub ambiguity_maps: BTreeMap>>, + pub ambiguity_maps: BTreeMap, BTreeMap>>>, /// A map of `RoomId` to a vector of `Notification`s - pub notifications: BTreeMap>, + pub notifications: BTreeMap, Vec>, } impl StateChanges { diff --git a/crates/matrix-sdk-base/src/store/sled_store/mod.rs b/crates/matrix-sdk-base/src/store/sled_store/mod.rs index c6f6d9f23fd..97be63b3a0c 100644 --- a/crates/matrix-sdk-base/src/store/sled_store/mod.rs +++ b/crates/matrix-sdk-base/src/store/sled_store/mod.rs @@ -456,7 +456,7 @@ impl SledStore { for (room_id, room_info) in &changes.room_infos { rooms.insert( - room_id.encode(), + (&**room_id).encode(), self.serialize_event(room_info) .map_err(ConflictableTransactionError::Abort)?, )?; @@ -464,7 +464,7 @@ impl SledStore { for (sender, event) in &changes.presence { presence.insert( - sender.encode(), + (&**sender).encode(), self.serialize_event(&event) .map_err(ConflictableTransactionError::Abort)?, )?; @@ -472,7 +472,7 @@ impl SledStore { for (room_id, info) in &changes.invited_room_info { striped_rooms.insert( - room_id.encode(), + (&**room_id).encode(), self.serialize_event(&info) .map_err(ConflictableTransactionError::Abort)?, )?; @@ -522,7 +522,7 @@ impl SledStore { .map_err(ConflictableTransactionError::Abort)?, )? { // Remove the old receipt from the room event receipts - let (old_event, _): (EventId, Receipt) = self + let (old_event, _): (Box, Receipt) = self .deserialize_event(&old) .map_err(ConflictableTransactionError::Abort)?; room_event_receipts.remove( @@ -635,8 +635,8 @@ impl SledStore { pub async fn get_user_ids_stream( &self, room_id: &RoomId, - ) -> Result>> { - let decode = |key: &[u8]| -> Result { + ) -> Result>>> { + let decode = |key: &[u8]| -> Result> { let mut iter = key.split(|c| c == &ENCODE_SEPARATOR); // Our key is a the room id separated from the user id by a null // byte, discard the first value of the split. @@ -644,7 +644,7 @@ impl SledStore { let user_id = iter.next().expect("User ids weren't properly encoded"); - Ok(UserId::try_from(String::from_utf8_lossy(user_id).to_string())?) + Ok(Box::::try_from(String::from_utf8_lossy(user_id).to_string())?) }; let members = self.members.clone(); @@ -658,12 +658,12 @@ impl SledStore { pub async fn get_invited_user_ids( &self, room_id: &RoomId, - ) -> Result>> { + ) -> Result>>> { let db = self.clone(); let key = room_id.encode(); spawn_blocking(move || { stream::iter(db.invited_user_ids.scan_prefix(key).map(|u| { - UserId::try_from(String::from_utf8_lossy(&u?.1).to_string()) + Box::::try_from(String::from_utf8_lossy(&u?.1).to_string()) .map_err(StoreError::Identifier) })) }) @@ -674,12 +674,12 @@ impl SledStore { pub async fn get_joined_user_ids( &self, room_id: &RoomId, - ) -> Result>> { + ) -> Result>>> { let db = self.clone(); let key = room_id.encode(); spawn_blocking(move || { stream::iter(db.joined_user_ids.scan_prefix(key).map(|u| { - UserId::try_from(String::from_utf8_lossy(&u?.1).to_string()) + Box::::try_from(String::from_utf8_lossy(&u?.1).to_string()) .map_err(StoreError::Identifier) })) }) @@ -715,7 +715,7 @@ impl SledStore { &self, room_id: &RoomId, display_name: &str, - ) -> Result> { + ) -> Result>> { let db = self.clone(); let key = (room_id.as_str(), display_name).encode(); spawn_blocking(move || { @@ -759,7 +759,7 @@ impl SledStore { room_id: &RoomId, receipt_type: ReceiptType, user_id: &UserId, - ) -> Result> { + ) -> Result, Receipt)>> { let db = self.clone(); let key = (room_id.as_str(), receipt_type.as_ref(), user_id.as_str()).encode(); spawn_blocking(move || { @@ -773,7 +773,7 @@ impl SledStore { room_id: &RoomId, receipt_type: ReceiptType, event_id: &EventId, - ) -> Result> { + ) -> Result, Receipt)>> { let db = self.clone(); let key = (room_id.as_str(), receipt_type.as_ref(), event_id.as_str()).encode(); spawn_blocking(move || { @@ -903,15 +903,15 @@ impl StateStore for SledStore { self.get_member_event(room_id, state_key).await } - async fn get_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_user_ids(&self, room_id: &RoomId) -> Result>> { self.get_user_ids_stream(room_id).await?.try_collect().await } - async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_invited_user_ids(&self, room_id: &RoomId) -> Result>> { self.get_invited_user_ids(room_id).await?.try_collect().await } - async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result> { + async fn get_joined_user_ids(&self, room_id: &RoomId) -> Result>> { self.get_joined_user_ids(room_id).await?.try_collect().await } @@ -927,7 +927,7 @@ impl StateStore for SledStore { &self, room_id: &RoomId, display_name: &str, - ) -> Result> { + ) -> Result>> { self.get_users_with_display_name(room_id, display_name).await } @@ -951,7 +951,7 @@ impl StateStore for SledStore { room_id: &RoomId, receipt_type: ReceiptType, user_id: &UserId, - ) -> Result> { + ) -> Result, Receipt)>> { self.get_user_room_receipt_event(room_id, receipt_type, user_id).await } @@ -960,7 +960,7 @@ impl StateStore for SledStore { room_id: &RoomId, receipt_type: ReceiptType, event_id: &EventId, - ) -> Result> { + ) -> Result, Receipt)>> { self.get_event_room_receipt_events(room_id, receipt_type, event_id).await } @@ -991,8 +991,6 @@ impl StateStore for SledStore { #[cfg(test)] mod test { - use std::convert::TryFrom; - use matrix_sdk_test::async_test; use ruma::{ api::client::r0::media::get_content_thumbnail::Method, @@ -1008,7 +1006,7 @@ mod test { receipt::ReceiptType, room_id, serde::Raw, - uint, user_id, EventId, MilliSecondsSinceUnixEpoch, UserId, + uint, user_id, MilliSecondsSinceUnixEpoch, UserId, }; use serde_json::json; @@ -1019,7 +1017,7 @@ mod test { StateStore, }; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } @@ -1027,7 +1025,7 @@ mod test { let content = RoomPowerLevelsEventContent::default(); let event = json!({ - "event_id": EventId::try_from("$h29iv0s8:example.com").unwrap(), + "event_id": "$h29iv0s8:example.com", "content": content, "sender": user_id(), "type": "m.room.power_levels", @@ -1041,11 +1039,11 @@ mod test { fn membership_event() -> MemberEvent { MemberEvent { - event_id: EventId::try_from("$h29iv0s8:example.com").unwrap(), + event_id: event_id!("$h29iv0s8:example.com").to_owned(), content: RoomMemberEventContent::new(MembershipState::Join), - sender: user_id(), + sender: user_id().to_owned(), origin_server_ts: MilliSecondsSinceUnixEpoch::now(), - state_key: user_id(), + state_key: user_id().to_owned(), prev_content: None, unsigned: Unsigned::default(), } @@ -1057,18 +1055,18 @@ mod test { let room_id = room_id!("!test:localhost"); let user_id = user_id(); - assert!(store.get_member_event(&room_id, &user_id).await.unwrap().is_none()); + assert!(store.get_member_event(room_id, user_id).await.unwrap().is_none()); let mut changes = StateChanges::default(); changes .members - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_default() - .insert(user_id.clone(), membership_event()); + .insert(user_id.to_owned(), membership_event()); store.save_changes(&changes).await.unwrap(); - assert!(store.get_member_event(&room_id, &user_id).await.unwrap().is_some()); + assert!(store.get_member_event(room_id, user_id).await.unwrap().is_some()); - let members = store.get_user_ids(&room_id).await.unwrap(); + let members = store.get_user_ids(room_id).await.unwrap(); assert!(!members.is_empty()) } @@ -1081,16 +1079,16 @@ mod test { let event = raw_event.deserialize().unwrap(); assert!(store - .get_state_event(&room_id, EventType::RoomPowerLevels, "") + .get_state_event(room_id, EventType::RoomPowerLevels, "") .await .unwrap() .is_none()); let mut changes = StateChanges::default(); - changes.add_state_event(&room_id, event, raw_event); + changes.add_state_event(room_id, event, raw_event); store.save_changes(&changes).await.unwrap(); assert!(store - .get_state_event(&room_id, EventType::RoomPowerLevels, "") + .get_state_event(room_id, EventType::RoomPowerLevels, "") .await .unwrap() .is_some()); @@ -1102,13 +1100,13 @@ mod test { let room_id = room_id!("!test:localhost"); - let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org"); - let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org"); + let first_event_id = event_id!("$1435641916114394fHBLK:matrix.org").to_owned(); + let second_event_id = event_id!("$fHBLK1435641916114394:matrix.org").to_owned(); let first_receipt_event = serde_json::from_value(json!({ first_event_id.clone(): { "m.read": { - user_id(): { + user_id().to_owned(): { "ts": 1436451550453u64 } } @@ -1119,7 +1117,7 @@ mod test { let second_receipt_event = serde_json::from_value(json!({ second_event_id.clone(): { "m.read": { - user_id(): { + user_id().to_owned(): { "ts": 1436451551453u64 } } @@ -1128,61 +1126,61 @@ mod test { .unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_none()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .is_empty()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .is_empty()); let mut changes = StateChanges::default(); - changes.add_receipts(&room_id, first_receipt_event); + changes.add_receipts(room_id, first_receipt_event); store.save_changes(&changes).await.unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_some(),); assert_eq!( store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .len(), 1 ); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .is_empty()); let mut changes = StateChanges::default(); - changes.add_receipts(&room_id, second_receipt_event); + changes.add_receipts(room_id, second_receipt_event); store.save_changes(&changes).await.unwrap(); assert!(store - .get_user_room_receipt_event(&room_id, ReceiptType::Read, &user_id()) + .get_user_room_receipt_event(room_id, ReceiptType::Read, user_id()) .await .unwrap() .is_some()); assert!(store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &first_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &first_event_id) .await .unwrap() .is_empty()); assert_eq!( store - .get_event_room_receipt_events(&room_id, ReceiptType::Read, &second_event_id) + .get_event_room_receipt_events(room_id, ReceiptType::Read, &second_event_id) .await .unwrap() .len(), @@ -1198,10 +1196,10 @@ mod test { let content: Vec = "somebinarydata".into(); let request_file = - MediaRequest { media_type: MediaType::Uri(uri.clone()), format: MediaFormat::File }; + MediaRequest { media_type: MediaType::Uri(uri.to_owned()), format: MediaFormat::File }; let request_thumbnail = MediaRequest { - media_type: MediaType::Uri(uri.clone()), + media_type: MediaType::Uri(uri.to_owned()), format: MediaFormat::Thumbnail(MediaThumbnailSize { method: Method::Crop, width: uint!(100), @@ -1224,7 +1222,7 @@ mod test { store.add_media_content(&request_thumbnail, content.clone()).await.unwrap(); assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_some()); - store.remove_media_content_for_uri(&uri).await.unwrap(); + store.remove_media_content_for_uri(uri).await.unwrap(); assert!(store.get_media_content(&request_file).await.unwrap().is_none()); assert!(store.get_media_content(&request_thumbnail).await.unwrap().is_none()); } diff --git a/crates/matrix-sdk-common/Cargo.toml b/crates/matrix-sdk-common/Cargo.toml index 16b2df4a8ea..9075477d1fb 100644 --- a/crates/matrix-sdk-common/Cargo.toml +++ b/crates/matrix-sdk-common/Cargo.toml @@ -13,7 +13,7 @@ version = "0.4.1" [dependencies] async-trait = "0.1.50" -ruma = { git = "https://github.com/ruma/ruma", rev = "ac6ecc3e5", features = ["client-api-c"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "6c4892664", features = ["client-api-c"] } serde = "1.0.126" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/crates/matrix-sdk-common/src/deserialized_responses.rs b/crates/matrix-sdk-common/src/deserialized_responses.rs index 79020f2a4ba..3adb21c3a55 100644 --- a/crates/matrix-sdk-common/src/deserialized_responses.rs +++ b/crates/matrix-sdk-common/src/deserialized_responses.rs @@ -15,7 +15,7 @@ use ruma::{ AnyRoomEvent, AnySyncRoomEvent, Unsigned, }, serde::Raw, - DeviceIdBox, DeviceKeyAlgorithm, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, + DeviceId, DeviceKeyAlgorithm, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, }; use serde::{Deserialize, Serialize}; @@ -27,9 +27,9 @@ pub struct AmbiguityChange { /// event itself ambiguous because of the event. pub member_ambiguous: bool, /// Has another user been disambiguated because of this event. - pub disambiguated_member: Option, + pub disambiguated_member: Option>, /// Has another user become ambiguous because of this event. - pub ambiguated_member: Option, + pub ambiguated_member: Option>, } /// Collection of ambiguioty changes that room member events trigger. @@ -37,7 +37,7 @@ pub struct AmbiguityChange { pub struct AmbiguityChanges { /// A map from room id to a map of an event id to the `AmbiguityChange` that /// the event with the given id caused. - pub changes: BTreeMap>, + pub changes: BTreeMap, BTreeMap, AmbiguityChange>>, } /// The verification state of the device that sent an event to us. @@ -74,10 +74,10 @@ pub enum AlgorithmInfo { pub struct EncryptionInfo { /// The user ID of the event sender, note this is untrusted data unless the /// `verification_state` is as well trusted. - pub sender: UserId, + pub sender: Box, /// The device ID of the device that sent us the event, note this is /// untrusted data unless `verification_state` is as well trusted. - pub sender_device: DeviceIdBox, + pub sender_device: Box, /// Information about the algorithm that was used to encrypt the event. pub algorithm_info: AlgorithmInfo, /// The verification state of the device that sent us the event, note this @@ -126,7 +126,7 @@ pub struct SyncResponse { /// Collection of ambiguity changes that room member events trigger. pub ambiguity_changes: AmbiguityChanges, /// New notifications per room. - pub notifications: BTreeMap>, + pub notifications: BTreeMap, Vec>, } impl SyncResponse { @@ -147,11 +147,11 @@ pub struct RoomEvent { #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Rooms { /// The rooms that the user has left or been banned from. - pub leave: BTreeMap, + pub leave: BTreeMap, LeftRoom>, /// The rooms that the user has joined. - pub join: BTreeMap, + pub join: BTreeMap, JoinedRoom>, /// The rooms that the user has been invited to. - pub invite: BTreeMap, + pub invite: BTreeMap, InvitedRoom>, } /// Updates to joined rooms. @@ -249,11 +249,11 @@ impl Timeline { #[serde(try_from = "SyncRoomMemberEvent", into = "SyncRoomMemberEvent")] pub struct MemberEvent { pub content: RoomMemberEventContent, - pub event_id: EventId, + pub event_id: Box, pub origin_server_ts: MilliSecondsSinceUnixEpoch, pub prev_content: Option, - pub sender: UserId, - pub state_key: UserId, + pub sender: Box, + pub state_key: Box, pub unsigned: Unsigned, } @@ -267,7 +267,7 @@ impl TryFrom for MemberEvent { origin_server_ts: event.origin_server_ts, prev_content: event.prev_content, sender: event.sender, - state_key: UserId::try_from(event.state_key)?, + state_key: event.state_key.try_into()?, unsigned: event.unsigned, }) } @@ -283,7 +283,7 @@ impl TryFrom for MemberEvent { origin_server_ts: event.origin_server_ts, prev_content: event.prev_content, sender: event.sender, - state_key: UserId::try_from(event.state_key)?, + state_key: event.state_key.try_into()?, unsigned: event.unsigned, }) } @@ -307,8 +307,8 @@ impl From for SyncRoomMemberEvent { #[serde(try_from = "StrippedRoomMemberEvent", into = "StrippedRoomMemberEvent")] pub struct StrippedMemberEvent { pub content: RoomMemberEventContent, - pub sender: UserId, - pub state_key: UserId, + pub sender: Box, + pub state_key: Box, } impl TryFrom for StrippedMemberEvent { @@ -318,7 +318,7 @@ impl TryFrom for StrippedMemberEvent { Ok(StrippedMemberEvent { content: event.content, sender: event.sender, - state_key: UserId::try_from(event.state_key)?, + state_key: event.state_key.try_into()?, }) } } diff --git a/crates/matrix-sdk-crypto/Cargo.toml b/crates/matrix-sdk-crypto/Cargo.toml index 70f6176b7e2..dbb7c9923ae 100644 --- a/crates/matrix-sdk-crypto/Cargo.toml +++ b/crates/matrix-sdk-crypto/Cargo.toml @@ -38,7 +38,7 @@ matrix-sdk-common = { version = "0.4.0", path = "../matrix-sdk-common" } olm-rs = { version = "2.1", features = ["serde"] } pbkdf2 = { version = "0.9.0", default-features = false } rand = "0.8.4" -ruma = { git = "https://github.com/ruma/ruma", rev = "ac6ecc3e5", features = [ +ruma = { git = "https://github.com/ruma/ruma", rev = "6c4892664", features = [ "client-api-c", "unstable-pre-spec", ] } diff --git a/crates/matrix-sdk-crypto/README.md b/crates/matrix-sdk-crypto/README.md index f957fc3f5df..66f95e791ef 100644 --- a/crates/matrix-sdk-crypto/README.md +++ b/crates/matrix-sdk-crypto/README.md @@ -24,8 +24,8 @@ use ruma::{UserId, api::client::r0::sync::sync_events::{ToDevice, DeviceLists}}; #[tokio::main] async fn main() -> Result<(), OlmError> { - let alice = UserId::try_from("@alice:example.org").unwrap(); - let machine = OlmMachine::new(&alice, "DEVICEID".into()); + let alice = Box::::try_from("@alice:example.org").unwrap(); + let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); let to_device_events = ToDevice::default(); let changed_devices = DeviceLists::default(); diff --git a/crates/matrix-sdk-crypto/benches/crypto_bench.rs b/crates/matrix-sdk-crypto/benches/crypto_bench.rs index 96414b19be7..11a7f269daf 100644 --- a/crates/matrix-sdk-crypto/benches/crypto_bench.rs +++ b/crates/matrix-sdk-crypto/benches/crypto_bench.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{ops::Deref, sync::Arc}; use criterion::*; use matrix_sdk_common::uuid::Uuid; @@ -12,17 +12,17 @@ use ruma::{ }, IncomingResponse, }, - room_id, user_id, DeviceIdBox, UserId, + device_id, room_id, user_id, DeviceId, UserId, }; use serde_json::Value; use tokio::runtime::Builder; -fn alice_id() -> UserId { +fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } -fn alice_device_id() -> DeviceIdBox { - "JLAFKJWSCS".into() +fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } fn keys_query_response() -> get_keys::Response { @@ -49,7 +49,7 @@ fn huge_keys_query_response() -> get_keys::Response { pub fn keys_query(c: &mut Criterion) { let runtime = Builder::new_multi_thread().build().expect("Can't create runtime"); - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); let response = keys_query_response(); let uuid = Uuid::new_v4(); @@ -71,8 +71,8 @@ pub fn keys_query(c: &mut Criterion) { let dir = tempfile::tempdir().unwrap(); let machine = runtime .block_on(OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), dir.path(), None, )) @@ -104,7 +104,7 @@ pub fn keys_claiming(c: &mut Criterion) { group.bench_with_input(BenchmarkId::new("memory store", &name), &response, |b, response| { b.iter_batched( || { - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); runtime .block_on(machine.mark_request_as_sent(&uuid, &keys_query_response)) .unwrap(); @@ -123,8 +123,8 @@ pub fn keys_claiming(c: &mut Criterion) { let dir = tempfile::tempdir().unwrap(); let machine = runtime .block_on(OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), dir.path(), None, )) @@ -153,11 +153,11 @@ pub fn room_key_sharing(c: &mut Criterion) { let room_id = room_id!("!test:localhost"); let to_device_response = ToDeviceResponse::new(); - let users: Vec = keys_query_response.device_keys.keys().cloned().collect(); + let users: Vec> = keys_query_response.device_keys.keys().cloned().collect(); let count = response.one_time_keys.values().fold(0, |acc, d| acc + d.len()); - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); runtime.block_on(machine.mark_request_as_sent(&uuid, &keys_query_response)).unwrap(); runtime.block_on(machine.mark_request_as_sent(&uuid, &response)).unwrap(); @@ -168,7 +168,11 @@ pub fn room_key_sharing(c: &mut Criterion) { group.bench_function(BenchmarkId::new("memory store", &name), |b| { b.to_async(&runtime).iter(|| async { let requests = machine - .share_group_session(&room_id, users.iter(), EncryptionSettings::default()) + .share_group_session( + room_id, + users.iter().map(Deref::deref), + EncryptionSettings::default(), + ) .await .unwrap(); @@ -178,15 +182,15 @@ pub fn room_key_sharing(c: &mut Criterion) { machine.mark_request_as_sent(&request.txn_id, &to_device_response).await.unwrap(); } - machine.invalidate_group_session(&room_id).await.unwrap(); + machine.invalidate_group_session(room_id).await.unwrap(); }) }); let dir = tempfile::tempdir().unwrap(); let machine = runtime .block_on(OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), dir.path(), None, )) @@ -197,7 +201,11 @@ pub fn room_key_sharing(c: &mut Criterion) { group.bench_function(BenchmarkId::new("sled store", &name), |b| { b.to_async(&runtime).iter(|| async { let requests = machine - .share_group_session(&room_id, users.iter(), EncryptionSettings::default()) + .share_group_session( + room_id, + users.iter().map(Deref::deref), + EncryptionSettings::default(), + ) .await .unwrap(); @@ -207,7 +215,7 @@ pub fn room_key_sharing(c: &mut Criterion) { machine.mark_request_as_sent(&request.txn_id, &to_device_response).await.unwrap(); } - machine.invalidate_group_session(&room_id).await.unwrap(); + machine.invalidate_group_session(room_id).await.unwrap(); }) }); @@ -217,10 +225,10 @@ pub fn room_key_sharing(c: &mut Criterion) { pub fn devices_missing_sessions_collecting(c: &mut Criterion) { let runtime = Builder::new_multi_thread().build().expect("Can't create runtime"); - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); let response = huge_keys_query_response(); let uuid = Uuid::new_v4(); - let users: Vec = response.device_keys.keys().cloned().collect(); + let users: Vec> = response.device_keys.keys().cloned().collect(); let count = response.device_keys.values().fold(0, |acc, d| acc + d.len()); @@ -233,15 +241,15 @@ pub fn devices_missing_sessions_collecting(c: &mut Criterion) { group.bench_function(BenchmarkId::new("memory store", &name), |b| { b.to_async(&runtime).iter_with_large_drop(|| async { - machine.get_missing_sessions(users.iter()).await.unwrap() + machine.get_missing_sessions(users.iter().map(Deref::deref)).await.unwrap() }) }); let dir = tempfile::tempdir().unwrap(); let machine = runtime .block_on(OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), dir.path(), None, )) @@ -250,8 +258,9 @@ pub fn devices_missing_sessions_collecting(c: &mut Criterion) { runtime.block_on(machine.mark_request_as_sent(&uuid, &response)).unwrap(); group.bench_function(BenchmarkId::new("sled store", &name), |b| { - b.to_async(&runtime) - .iter(|| async { machine.get_missing_sessions(users.iter()).await.unwrap() }) + b.to_async(&runtime).iter(|| async { + machine.get_missing_sessions(users.iter().map(Deref::deref)).await.unwrap() + }) }); group.finish() diff --git a/crates/matrix-sdk-crypto/src/backups/keys/backup.rs b/crates/matrix-sdk-crypto/src/backups/keys/backup.rs index d80e944e93e..81e8361f36e 100644 --- a/crates/matrix-sdk-crypto/src/backups/keys/backup.rs +++ b/crates/matrix-sdk-crypto/src/backups/keys/backup.rs @@ -30,7 +30,7 @@ use crate::olm::InboundGroupSession; #[derive(Debug)] struct InnerBackupKey { key: [u8; MegolmV1BackupKey::KEY_SIZE], - signatures: BTreeMap>, + signatures: BTreeMap, BTreeMap, String>>, version: Mutex>, } @@ -69,7 +69,7 @@ impl MegolmV1BackupKey { } /// Get all the signatures of this `MegolmV1BackupKey`. - pub fn signatures(&self) -> BTreeMap> { + pub fn signatures(&self) -> BTreeMap, BTreeMap, String>> { self.inner.signatures.to_owned() } diff --git a/crates/matrix-sdk-crypto/src/backups/mod.rs b/crates/matrix-sdk-crypto/src/backups/mod.rs index bc0fe9b94a8..aa94bad28b1 100644 --- a/crates/matrix-sdk-crypto/src/backups/mod.rs +++ b/crates/matrix-sdk-crypto/src/backups/mod.rs @@ -65,7 +65,7 @@ pub struct BackupMachine { struct PendingBackup { request_id: Uuid, request: KeysBackupRequest, - sessions: BTreeMap>>, + sessions: BTreeMap, BTreeMap>>, } impl PendingBackup { @@ -124,7 +124,7 @@ impl BackupMachine { struct AuthData { public_key: String, #[serde(default)] - signatures: BTreeMap>, + signatures: BTreeMap, BTreeMap, String>>, #[serde(flatten)] extra: BTreeMap, } @@ -348,10 +348,12 @@ impl BackupMachine { async fn backup_keys( sessions: Vec, backup_key: &MegolmV1BackupKey, - ) -> (BTreeMap, BTreeMap>>) - { - let mut backup: BTreeMap = BTreeMap::new(); - let mut session_record: BTreeMap>> = + ) -> ( + BTreeMap, RoomKeyBackup>, + BTreeMap, BTreeMap>>, + ) { + let mut backup: BTreeMap, RoomKeyBackup> = BTreeMap::new(); + let mut session_record: BTreeMap, BTreeMap>> = BTreeMap::new(); for session in sessions.into_iter() { @@ -361,7 +363,7 @@ impl BackupMachine { let session = backup_key.encrypt(session).await; session_record - .entry(room_id.clone()) + .entry(room_id.to_owned()) .or_default() .entry(sender_key) .or_default() @@ -381,24 +383,24 @@ impl BackupMachine { #[cfg(test)] mod test { use matrix_sdk_test::async_test; - use ruma::{room_id, user_id, DeviceIdBox, RoomId, UserId}; + use ruma::{device_id, room_id, user_id, DeviceId, RoomId, UserId}; use super::RecoveryKey; use crate::{OlmError, OlmMachine}; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> DeviceIdBox { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn room_id() -> RoomId { + fn room_id() -> &'static RoomId { room_id!("!test:localhost") } - fn room_id2() -> RoomId { + fn room_id2() -> &'static RoomId { room_id!("!test2:localhost") } @@ -409,8 +411,8 @@ mod test { assert_eq!(counts.total, 0, "Initially no keys exist"); assert_eq!(counts.backed_up, 0, "Initially no backed up keys exist"); - machine.create_outbound_group_session_with_defaults(&room_id()).await?; - machine.create_outbound_group_session_with_defaults(&room_id2()).await?; + machine.create_outbound_group_session_with_defaults(room_id()).await?; + machine.create_outbound_group_session_with_defaults(room_id2()).await?; let counts = backup_machine.store.inbound_group_session_counts().await?; assert_eq!(counts.total, 2, "Two room keys need to exist in the store"); @@ -455,7 +457,7 @@ mod test { #[async_test] async fn memory_store_backups() -> Result<(), OlmError> { - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); backup_flow(machine).await } @@ -467,8 +469,8 @@ mod test { let tmpdir = tempdir().expect("Can't create a temporary dir"); let machine = OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), tmpdir.as_ref(), None, ) @@ -484,8 +486,8 @@ mod test { let tmpdir = tempdir().expect("Can't create a temporary dir"); let machine = OlmMachine::new_with_default_store( - &alice_id(), - &alice_device_id(), + alice_id(), + alice_device_id(), tmpdir.as_ref(), Some("test"), ) diff --git a/crates/matrix-sdk-crypto/src/error.rs b/crates/matrix-sdk-crypto/src/error.rs index fdac447fb5e..3dba23a6069 100644 --- a/crates/matrix-sdk-crypto/src/error.rs +++ b/crates/matrix-sdk-crypto/src/error.rs @@ -50,12 +50,12 @@ pub enum OlmError { #[error( "decryption failed likely because an Olm session from {0} with sender key {1} was wedged" )] - SessionWedged(UserId, String), + SessionWedged(Box, String), /// An Olm message got replayed while the Olm ratchet has already moved /// forward. #[error("decryption failed because an Olm message from {0} with sender key {1} was replayed")] - ReplayedMessage(UserId, String), + ReplayedMessage(Box, String), /// Encryption failed because the device does not have a valid Olm session /// with us. @@ -122,7 +122,7 @@ pub enum EventError { "the sender of the plaintext doesn't match the sender of the encrypted \ message, got {0}, expected {0}" )] - MismatchedSender(UserId, UserId), + MismatchedSender(Box, Box), #[error( "the public that was part of the message doesn't match to the key we \ @@ -134,7 +134,7 @@ pub enum EventError { "the room id of the room key doesn't match the room id of the \ decrypted event: expected {0}, got {:1}" )] - MismatchedRoom(RoomId, Option), + MismatchedRoom(Box, Option>), } #[derive(Error, Debug)] @@ -193,24 +193,24 @@ pub(crate) enum SessionCreationError { "Failed to create a new Olm session for {0} {1}, the requested \ one-time key isn't a signed curve key" )] - OneTimeKeyNotSigned(UserId, Box), + OneTimeKeyNotSigned(Box, Box), #[error( "Tried to create a new Olm session for {0} {1}, but the signed \ one-time key is missing" )] - OneTimeKeyMissing(UserId, Box), + OneTimeKeyMissing(Box, Box), #[error( "Tried to create a new Olm session for {0} {1}, but the one-time \ key algorithm is unsupported" )] - OneTimeKeyUnknown(UserId, Box), + OneTimeKeyUnknown(Box, Box), #[error("Failed to verify the one-time key signatures for {0} {1}: {2:?}")] - InvalidSignature(UserId, Box, SignatureError), + InvalidSignature(Box, Box, SignatureError), #[error( "Tried to create an Olm session for {0} {1}, but the device is missing \ a curve25519 key" )] - DeviceMissingCurveKey(UserId, Box), + DeviceMissingCurveKey(Box, Box), #[error("Error creating new Olm session for {0} {1}: {2:?}")] - OlmError(UserId, Box, OlmSessionError), + OlmError(Box, Box, OlmSessionError), } diff --git a/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs b/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs index 98ffc90bdfe..750b96c4c99 100644 --- a/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs +++ b/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs @@ -79,7 +79,7 @@ pub enum KeyExportError { /// # use ruma::user_id; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); -/// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); +/// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// # let export = Cursor::new("".to_owned()); /// let exported_keys = decrypt_key_export(export, "1234").unwrap(); @@ -130,7 +130,7 @@ pub fn decrypt_key_export( /// # use ruma::{user_id, room_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); -/// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); +/// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let room_id = room_id!("!test:localhost"); /// let exported_keys = machine.export_keys(|s| s.room_id() == &room_id).await.unwrap(); @@ -305,8 +305,8 @@ mod test { let (machine, _) = get_prepared_machine().await; let room_id = room_id!("!test:localhost"); - machine.create_outbound_group_session_with_defaults(&room_id).await.unwrap(); - let export = machine.export_keys(|s| s.room_id() == &room_id).await.unwrap(); + machine.create_outbound_group_session_with_defaults(room_id).await.unwrap(); + let export = machine.export_keys(|s| s.room_id() == room_id).await.unwrap(); assert!(!export.is_empty()); @@ -324,7 +324,7 @@ mod test { async fn test_importing_better_session() -> OlmResult<()> { let (machine, _) = get_prepared_machine().await; let room_id = room_id!("!test:localhost"); - let session = machine.create_inbound_session(&room_id).await?; + let session = machine.create_inbound_session(room_id).await?; let export = vec![session.export_at_index(10).await]; @@ -350,7 +350,7 @@ mod test { assert_eq!(machine.import_keys(better_export, false, |_, _| {}).await?, keys,); - let another_session = machine.create_inbound_session(&room_id).await?; + let another_session = machine.create_inbound_session(room_id).await?; let export = vec![another_session.export_at_index(10).await]; let keys = RoomKeyImportResult::new( diff --git a/crates/matrix-sdk-crypto/src/gossiping/machine.rs b/crates/matrix-sdk-crypto/src/gossiping/machine.rs index 552c93461b1..df7aa044054 100644 --- a/crates/matrix-sdk-crypto/src/gossiping/machine.rs +++ b/crates/matrix-sdk-crypto/src/gossiping/machine.rs @@ -40,7 +40,7 @@ use ruma::{ }, AnyToDeviceEvent, AnyToDeviceEventContent, }, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, EventEncryptionAlgorithm, RoomId, UserId, + DeviceId, DeviceKeyAlgorithm, EventEncryptionAlgorithm, RoomId, UserId, }; use tracing::{debug, info, trace, warn}; @@ -63,7 +63,7 @@ pub(crate) struct GossipMachine { outgoing_requests: Arc>, incoming_key_requests: Arc>, wait_queue: WaitQueue, - users_for_key_claim: Arc>>, + users_for_key_claim: Arc, DashSet>>>, } impl GossipMachine { @@ -72,7 +72,7 @@ impl GossipMachine { device_id: Arc, store: Store, outbound_group_sessions: GroupSessionCache, - users_for_key_claim: Arc>>, + users_for_key_claim: Arc, DashSet>>>, ) -> Self { Self { user_id, @@ -940,6 +940,7 @@ mod test { use matrix_sdk_common::locks::Mutex; use matrix_sdk_test::async_test; use ruma::{ + device_id, events::{ forwarded_room_key::ToDeviceForwardedRoomKeyEventContent, room::encrypted::ToDeviceRoomEncryptedEventContent, @@ -949,7 +950,7 @@ mod test { }, room_id, to_device::DeviceIdOrAllDevices, - user_id, DeviceIdBox, DeviceKeyAlgorithm, RoomId, UserId, + user_id, DeviceId, DeviceKeyAlgorithm, RoomId, UserId, }; use super::{GossipMachine, KeyForwardDecision}; @@ -962,49 +963,50 @@ mod test { OutgoingRequests, }; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> DeviceIdBox { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn bob_id() -> UserId { + fn bob_id() -> &'static UserId { user_id!("@bob:example.org") } - fn bob_device_id() -> DeviceIdBox { - "ILMLKASTES".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("ILMLKASTES") } - fn alice2_device_id() -> DeviceIdBox { - "ILMLKASTES".into() + fn alice2_device_id() -> &'static DeviceId { + device_id!("ILMLKASTES") } - fn room_id() -> RoomId { + fn room_id() -> &'static RoomId { room_id!("!test:example.org") } fn account() -> ReadOnlyAccount { - ReadOnlyAccount::new(&alice_id(), &alice_device_id()) + ReadOnlyAccount::new(alice_id(), alice_device_id()) } fn bob_account() -> ReadOnlyAccount { - ReadOnlyAccount::new(&bob_id(), &bob_device_id()) + ReadOnlyAccount::new(bob_id(), bob_device_id()) } fn alice_2_account() -> ReadOnlyAccount { - ReadOnlyAccount::new(&alice_id(), &alice2_device_id()) + ReadOnlyAccount::new(alice_id(), alice2_device_id()) } fn bob_machine() -> GossipMachine { - let user_id = Arc::new(bob_id()); - let account = ReadOnlyAccount::new(&user_id, &alice_device_id()); + let user_id = Arc::from(bob_id()); + let account = ReadOnlyAccount::new(&user_id, alice_device_id()); let store: Arc = Arc::new(MemoryStore::new()); - let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(bob_id()))); + let identity = + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(bob_id().to_owned()))); let verification = VerificationMachine::new(account, identity.clone(), store.clone()); - let store = Store::new(user_id.clone(), identity, store, verification); + let store = Store::new(user_id.to_owned(), identity, store, verification); let session_cache = GroupSessionCache::new(store.clone()); GossipMachine::new( @@ -1018,14 +1020,14 @@ mod test { async fn get_machine() -> GossipMachine { let user_id: Arc = alice_id().into(); - let account = ReadOnlyAccount::new(&user_id, &alice_device_id()); + let account = ReadOnlyAccount::new(&user_id, alice_device_id()); let device = ReadOnlyDevice::from_account(&account).await; let another_device = - ReadOnlyDevice::from_account(&ReadOnlyAccount::new(&user_id, &alice2_device_id())) - .await; + ReadOnlyDevice::from_account(&ReadOnlyAccount::new(&user_id, alice2_device_id())).await; let store: Arc = Arc::new(MemoryStore::new()); - let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id()))); + let identity = + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id().to_owned()))); let verification = VerificationMachine::new(account, identity.clone(), store.clone()); let store = Store::new(user_id.clone(), identity, store, verification); @@ -1054,7 +1056,7 @@ mod test { let account = account(); let (_, session) = - account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); assert!(machine.outgoing_to_device_requests().await.unwrap().is_empty()); let (cancel, request) = machine @@ -1086,7 +1088,7 @@ mod test { machine.store.save_devices(&[alice_device]).await.unwrap(); let (_, session) = - account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); assert!(machine.outgoing_to_device_requests().await.unwrap().is_empty()); machine @@ -1131,7 +1133,7 @@ mod test { machine.store.save_devices(&[alice_device]).await.unwrap(); let (_, session) = - account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); machine .create_outgoing_key_request( session.room_id(), @@ -1151,7 +1153,7 @@ mod test { let content: ToDeviceForwardedRoomKeyEventContent = export.try_into().unwrap(); - let mut event = ToDeviceEvent { sender: alice_id(), content }; + let mut event = ToDeviceEvent { sender: alice_id().to_owned(), content }; assert!( machine @@ -1198,7 +1200,7 @@ mod test { let content: ToDeviceForwardedRoomKeyEventContent = export.try_into().unwrap(); - let mut event = ToDeviceEvent { sender: alice_id(), content }; + let mut event = ToDeviceEvent { sender: alice_id().to_owned(), content }; let (_, second_session) = machine.receive_forwarded_room_key(&session.sender_key, &mut event).await.unwrap(); @@ -1209,7 +1211,7 @@ mod test { let content: ToDeviceForwardedRoomKeyEventContent = export.try_into().unwrap(); - let mut event = ToDeviceEvent { sender: alice_id(), content }; + let mut event = ToDeviceEvent { sender: alice_id().to_owned(), content }; let (_, second_session) = machine.receive_forwarded_room_key(&session.sender_key, &mut event).await.unwrap(); @@ -1223,10 +1225,10 @@ mod test { let account = account(); let own_device = - machine.store.get_device(&alice_id(), &alice2_device_id()).await.unwrap().unwrap(); + machine.store.get_device(alice_id(), alice2_device_id()).await.unwrap().unwrap(); let (outbound, inbound) = - account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); // We don't share keys with untrusted devices. assert_matches!( @@ -1241,7 +1243,7 @@ mod test { machine.store.save_devices(&[bob_device]).await.unwrap(); let bob_device = - machine.store.get_device(&bob_id(), &bob_device_id()).await.unwrap().unwrap(); + machine.store.get_device(bob_id(), bob_device_id()).await.unwrap().unwrap(); // We don't share sessions with other user's devices if no outbound // session was provided. @@ -1284,7 +1286,7 @@ mod test { assert!(machine.should_share_key(&bob_device, &inbound).await.is_ok()); let (other_outbound, other_inbound) = - account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); // But we don't share some other session that doesn't match our outbound // session. @@ -1299,7 +1301,7 @@ mod test { machine.store.save_devices(&[bob_device]).await.unwrap(); let bob_device = - machine.store.get_device(&bob_id(), &bob_device_id()).await.unwrap().unwrap(); + machine.store.get_device(bob_id(), bob_device_id()).await.unwrap().unwrap(); assert_matches!( machine.should_share_key(&bob_device, &inbound).await, Err(KeyForwardDecision::ChangedSenderKey) @@ -1362,14 +1364,14 @@ mod test { bob_machine.store.save_devices(&[alice_device.clone()]).await.unwrap(); let (group_session, inbound_group_session) = - bob_account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + bob_account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); bob_machine.store.save_inbound_group_sessions(&[inbound_group_session]).await.unwrap(); // Alice wants to request the outbound group session from bob. alice_machine .create_outgoing_key_request( - &room_id(), + room_id(), bob_account.identity_keys.curve25519(), group_session.session_id(), ) @@ -1395,7 +1397,7 @@ mod test { .to_device() .unwrap() .messages - .get(&alice_id()) + .get(alice_id()) .unwrap() .get(&DeviceIdOrAllDevices::AllDevices) .unwrap(); @@ -1403,7 +1405,7 @@ mod test { alice_machine.mark_outgoing_request_as_sent(id).await.unwrap(); - let event = ToDeviceEvent { sender: alice_id(), content }; + let event = ToDeviceEvent { sender: alice_id().to_owned(), content }; // Bob doesn't have any outgoing requests. assert!(bob_machine.outgoing_requests.is_empty()); @@ -1424,21 +1426,21 @@ mod test { .to_device() .unwrap() .messages - .get(&alice_id()) + .get(alice_id()) .unwrap() - .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id())) + .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id().to_owned())) .unwrap(); let content: ToDeviceRoomEncryptedEventContent = content.deserialize_as().unwrap(); bob_machine.mark_outgoing_request_as_sent(id).await.unwrap(); - let event = ToDeviceEvent { sender: bob_id(), content }; + let event = ToDeviceEvent { sender: bob_id().to_owned(), content }; // Check that alice doesn't have the session. assert!(alice_machine .store .get_inbound_group_session( - &room_id(), + room_id(), bob_account.identity_keys().curve25519(), group_session.session_id() ) @@ -1461,11 +1463,7 @@ mod test { // Check that alice now does have the session. let session = alice_machine .store - .get_inbound_group_session( - &room_id(), - &decrypted.sender_key, - group_session.session_id(), - ) + .get_inbound_group_session(room_id(), &decrypted.sender_key, group_session.session_id()) .await .unwrap() .unwrap(); @@ -1521,7 +1519,7 @@ mod test { assert!(alice_machine.outgoing_requests.is_empty()); let event = ToDeviceEvent { - sender: alice_id(), + sender: alice_id().to_owned(), content: ToDeviceSecretRequestEventContent::new( RequestAction::Request(SecretName::CrossSigningMasterKey), second_account.device_id().into(), @@ -1570,14 +1568,14 @@ mod test { bob_machine.store.save_devices(&[alice_device.clone()]).await.unwrap(); let (group_session, inbound_group_session) = - bob_account.create_group_session_pair_with_defaults(&room_id()).await.unwrap(); + bob_account.create_group_session_pair_with_defaults(room_id()).await.unwrap(); bob_machine.store.save_inbound_group_sessions(&[inbound_group_session]).await.unwrap(); // Alice wants to request the outbound group session from bob. alice_machine .create_outgoing_key_request( - &room_id(), + room_id(), bob_account.identity_keys.curve25519(), group_session.session_id(), ) @@ -1603,7 +1601,7 @@ mod test { .to_device() .unwrap() .messages - .get(&alice_id()) + .get(alice_id()) .unwrap() .get(&DeviceIdOrAllDevices::AllDevices) .unwrap(); @@ -1611,7 +1609,7 @@ mod test { alice_machine.mark_outgoing_request_as_sent(id).await.unwrap(); - let event = ToDeviceEvent { sender: alice_id(), content }; + let event = ToDeviceEvent { sender: alice_id().to_owned(), content }; // Bob doesn't have any outgoing requests. assert!(bob_machine.outgoing_to_device_requests().await.unwrap().is_empty()); @@ -1634,7 +1632,7 @@ mod test { alice_machine.store.save_sessions(&[alice_session]).await.unwrap(); bob_machine.store.save_sessions(&[bob_session]).await.unwrap(); - bob_machine.retry_keyshare(&alice_id(), &alice_device_id()); + bob_machine.retry_keyshare(alice_id(), alice_device_id()); assert!(bob_machine.users_for_key_claim.is_empty()); bob_machine.collect_incoming_key_requests().await.unwrap(); // Bob now has an outgoing requests. @@ -1652,21 +1650,21 @@ mod test { .to_device() .unwrap() .messages - .get(&alice_id()) + .get(alice_id()) .unwrap() - .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id())) + .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id().to_owned())) .unwrap(); let content: ToDeviceRoomEncryptedEventContent = content.deserialize_as().unwrap(); bob_machine.mark_outgoing_request_as_sent(id).await.unwrap(); - let event = ToDeviceEvent { sender: bob_id(), content }; + let event = ToDeviceEvent { sender: bob_id().to_owned(), content }; // Check that alice doesn't have the session. assert!(alice_machine .store .get_inbound_group_session( - &room_id(), + room_id(), bob_account.identity_keys().curve25519(), group_session.session_id() ) @@ -1689,11 +1687,7 @@ mod test { // Check that alice now does have the session. let session = alice_machine .store - .get_inbound_group_session( - &room_id(), - &decrypted.sender_key, - group_session.session_id(), - ) + .get_inbound_group_session(room_id(), &decrypted.sender_key, group_session.session_id()) .await .unwrap() .unwrap(); diff --git a/crates/matrix-sdk-crypto/src/gossiping/mod.rs b/crates/matrix-sdk-crypto/src/gossiping/mod.rs index b10651f8e12..658afb92c91 100644 --- a/crates/matrix-sdk-crypto/src/gossiping/mod.rs +++ b/crates/matrix-sdk-crypto/src/gossiping/mod.rs @@ -32,7 +32,7 @@ use ruma::{ AnyToDeviceEventContent, }, to_device::DeviceIdOrAllDevices, - DeviceId, DeviceIdBox, UserId, + DeviceId, UserId, }; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -67,7 +67,7 @@ pub enum KeyForwardDecision { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GossipRequest { /// The user we requested the secret from - pub request_recipient: UserId, + pub request_recipient: Box, /// The unique id of the secret request. pub request_id: Uuid, /// The info of the requested secret. @@ -99,7 +99,7 @@ impl From for SecretInfo { impl GossipRequest { /// Create an ougoing secret request for the given secret. - pub(crate) fn from_secret_name(own_user_id: UserId, secret_name: SecretName) -> Self { + pub(crate) fn from_secret_name(own_user_id: Box, secret_name: SecretName) -> Self { Self { request_recipient: own_user_id, request_id: Uuid::new_v4(), @@ -243,13 +243,13 @@ impl RequestEvent { #[derive(Debug, Clone, PartialEq, Eq, Hash)] struct RequestInfo { - sender: UserId, - requesting_device_id: DeviceIdBox, + sender: Box, + requesting_device_id: Box, request_id: String, } impl RequestInfo { - fn new(sender: UserId, requesting_device_id: DeviceIdBox, request_id: String) -> Self { + fn new(sender: Box, requesting_device_id: Box, request_id: String) -> Self { Self { sender, requesting_device_id, request_id } } } @@ -259,7 +259,8 @@ impl RequestInfo { #[derive(Debug, Clone)] struct WaitQueue { requests_waiting_for_session: Arc>, - requests_ids_waiting: Arc>>, + #[allow(clippy::type_complexity)] + requests_ids_waiting: Arc, Box), DashSet>>, } impl WaitQueue { diff --git a/crates/matrix-sdk-crypto/src/identities/device.rs b/crates/matrix-sdk-crypto/src/identities/device.rs index 00057ec3796..6b46073c931 100644 --- a/crates/matrix-sdk-crypto/src/identities/device.rs +++ b/crates/matrix-sdk-crypto/src/identities/device.rs @@ -32,7 +32,7 @@ use ruma::{ key::verification::VerificationMethod, room::encrypted::ToDeviceRoomEncryptedEventContent, AnyToDeviceEventContent, }, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, UserId, + DeviceId, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, UserId, }; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_json::{json, Value}; @@ -69,7 +69,7 @@ pub struct ReadOnlyDevice { impl std::fmt::Debug for ReadOnlyDevice { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ReadOnlyDevice") - .field("user_id", self.user_id()) + .field("user_id", &self.user_id()) .field("device_id", &self.device_id()) .field("display_name", &self.display_name()) .field("keys", self.keys()) @@ -290,7 +290,7 @@ impl Device { /// A read only view over all devices belonging to a user. #[derive(Debug)] pub struct UserDevices { - pub(crate) inner: HashMap, + pub(crate) inner: HashMap, ReadOnlyDevice>, pub(crate) verification_machine: VerificationMachine, pub(crate) own_identity: Option, pub(crate) device_owner_identity: Option, @@ -330,7 +330,7 @@ impl UserDevices { } /// Iterator over all the device ids of the user devices. - pub fn keys(&self) -> impl Iterator { + pub fn keys(&self) -> impl Iterator> { self.inner.keys() } @@ -404,12 +404,12 @@ impl ReadOnlyDevice { } /// Get a map containing all the device keys. - pub fn keys(&self) -> &BTreeMap { + pub fn keys(&self) -> &BTreeMap, String> { &self.inner.keys } /// Get a map containing all the device signatures. - pub fn signatures(&self) -> &BTreeMap> { + pub fn signatures(&self) -> &BTreeMap, BTreeMap, String>> { &self.inner.signatures } @@ -651,7 +651,7 @@ pub(crate) mod test { let device = get_device(); - assert_eq!(&user_id, device.user_id()); + assert_eq!(user_id, device.user_id()); assert_eq!(device_id, device.device_id()); assert_eq!(device.algorithms().len(), 2); assert_eq!(LocalTrust::Unset, device.local_trust_state()); diff --git a/crates/matrix-sdk-crypto/src/identities/manager.rs b/crates/matrix-sdk-crypto/src/identities/manager.rs index 4136b361f1d..cb4336ae3d5 100644 --- a/crates/matrix-sdk-crypto/src/identities/manager.rs +++ b/crates/matrix-sdk-crypto/src/identities/manager.rs @@ -15,6 +15,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashSet}, convert::TryFrom, + ops::Deref, sync::Arc, }; @@ -22,7 +23,7 @@ use futures_util::future::join_all; use matrix_sdk_common::executor::spawn; use ruma::{ api::client::r0::keys::get_keys::Response as KeysQueryResponse, encryption::DeviceKeys, - DeviceId, DeviceIdBox, UserId, + DeviceId, UserId, }; use tracing::{debug, info, trace, warn}; @@ -76,7 +77,7 @@ impl IdentityManager { response: &KeysQueryResponse, ) -> OlmResult<(DeviceChanges, IdentityChanges)> { debug!( - users =? response.device_keys.keys().collect::>(), + users =? response.device_keys.keys().collect::>(), failures =? response.failures, "Handling a keys query response" ); @@ -93,7 +94,7 @@ impl IdentityManager { // TODO turn this into a single transaction. self.store.save_changes(changes).await?; - let updated_users: Vec<&UserId> = response.device_keys.keys().collect(); + let updated_users: Vec<&UserId> = response.device_keys.keys().map(Deref::deref).collect(); for user_id in updated_users { self.store.update_tracked_user(user_id, false).await?; @@ -203,14 +204,14 @@ impl IdentityManager { store: Store, own_user_id: Arc, own_device_id: Arc, - user_id: UserId, - device_map: BTreeMap, + user_id: Box, + device_map: BTreeMap, DeviceKeys>, ) -> StoreResult { let own_device_id = (&*own_device_id).to_owned(); let mut changes = DeviceChanges::default(); - let current_devices: HashSet = device_map.keys().cloned().collect(); + let current_devices: HashSet> = device_map.keys().cloned().collect(); let tasks = device_map.into_iter().filter_map(|(device_id, device_keys)| { if user_id != device_keys.user_id || device_id != device_keys.device_id { @@ -239,9 +240,9 @@ impl IdentityManager { } } - let current_devices: HashSet<&DeviceIdBox> = current_devices.iter().collect(); + let current_devices: HashSet<&Box> = current_devices.iter().collect(); let stored_devices = store.get_readonly_devices_unfiltered(&user_id).await?; - let stored_devices_set: HashSet<&DeviceIdBox> = stored_devices.keys().collect(); + let stored_devices_set: HashSet<&Box> = stored_devices.keys().collect(); let deleted_devices_set = stored_devices_set.difference(¤t_devices); for device_id in deleted_devices_set { @@ -271,7 +272,7 @@ impl IdentityManager { /// they are new, one of their properties has changed or they got deleted. async fn handle_devices_from_key_query( &self, - device_keys_map: BTreeMap>, + device_keys_map: BTreeMap, BTreeMap, DeviceKeys>>, ) -> StoreResult { let mut changes = DeviceChanges::default(); @@ -442,7 +443,7 @@ impl IdentityManager { if users.is_empty() { Vec::new() } else { - let users: Vec = users.into_iter().collect(); + let users: Vec> = users.into_iter().collect(); users .chunks(Self::MAX_KEY_QUERY_USERS) @@ -502,7 +503,7 @@ pub(crate) mod test { use matrix_sdk_test::async_test; use ruma::{ api::{client::r0::keys::get_keys::Response as KeyQueryResponse, IncomingResponse}, - user_id, DeviceIdBox, UserId, + device_id, user_id, DeviceId, UserId, }; use serde_json::json; @@ -514,22 +515,23 @@ pub(crate) mod test { verification::VerificationMachine, }; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } - fn other_user_id() -> UserId { + fn other_user_id() -> &'static UserId { user_id!("@example2:localhost") } - fn device_id() -> DeviceIdBox { - "WSKKLTJZCL".into() + fn device_id() -> &'static DeviceId { + device_id!("WSKKLTJZCL") } fn manager() -> IdentityManager { - let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(user_id()))); - let user_id = Arc::new(user_id()); - let account = ReadOnlyAccount::new(&user_id, &device_id()); + let identity = + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(user_id().to_owned()))); + let user_id = Arc::from(user_id()); + let account = ReadOnlyAccount::new(&user_id, device_id()); let store: Arc = Arc::new(MemoryStore::new()); let verification = VerificationMachine::new(account, identity.clone(), store); let store = @@ -707,21 +709,21 @@ pub(crate) mod test { async fn test_manager_key_query_response() { let manager = manager(); let other_user = other_user_id(); - let devices = manager.store.get_user_devices(&other_user).await.unwrap(); + let devices = manager.store.get_user_devices(other_user).await.unwrap(); assert_eq!(devices.devices().count(), 0); manager.receive_keys_query_response(&other_key_query()).await.unwrap(); - let devices = manager.store.get_user_devices(&other_user).await.unwrap(); + let devices = manager.store.get_user_devices(other_user).await.unwrap(); assert_eq!(devices.devices().count(), 1); let device = manager .store - .get_readonly_device(&other_user, "SKISMLNIMH".into()) + .get_readonly_device(other_user, device_id!("SKISMLNIMH")) .await .unwrap() .unwrap(); - let identity = manager.store.get_user_identity(&other_user).await.unwrap().unwrap(); + let identity = manager.store.get_user_identity(other_user).await.unwrap().unwrap(); let identity = identity.other().unwrap(); assert!(identity.is_device_signed(&device).is_ok()) @@ -731,21 +733,21 @@ pub(crate) mod test { async fn test_manager_own_key_query_response() { let manager = manager(); let other_user = other_user_id(); - let devices = manager.store.get_user_devices(&other_user).await.unwrap(); + let devices = manager.store.get_user_devices(other_user).await.unwrap(); assert_eq!(devices.devices().count(), 0); manager.receive_keys_query_response(&other_key_query()).await.unwrap(); - let devices = manager.store.get_user_devices(&other_user).await.unwrap(); + let devices = manager.store.get_user_devices(other_user).await.unwrap(); assert_eq!(devices.devices().count(), 1); let device = manager .store - .get_readonly_device(&other_user, "SKISMLNIMH".into()) + .get_readonly_device(other_user, device_id!("SKISMLNIMH")) .await .unwrap() .unwrap(); - let identity = manager.store.get_user_identity(&other_user).await.unwrap().unwrap(); + let identity = manager.store.get_user_identity(other_user).await.unwrap().unwrap(); let identity = identity.other().unwrap(); assert!(identity.is_device_signed(&device).is_ok()) diff --git a/crates/matrix-sdk-crypto/src/identities/user.rs b/crates/matrix-sdk-crypto/src/identities/user.rs index 065ad165d3d..ff0c93b7aff 100644 --- a/crates/matrix-sdk-crypto/src/identities/user.rs +++ b/crates/matrix-sdk-crypto/src/identities/user.rs @@ -28,7 +28,7 @@ use ruma::{ events::{ key::verification::VerificationMethod, room::message::KeyVerificationRequestEventContent, }, - DeviceIdBox, DeviceKeyId, EventId, RoomId, UserId, + DeviceId, DeviceKeyId, EventId, RoomId, UserId, }; use serde::{Deserialize, Serialize}; use serde_json::to_value; @@ -165,7 +165,7 @@ impl OwnUserIdentity { &self, methods: Option>, ) -> Result<(VerificationRequest, OutgoingVerificationRequest), CryptoStoreError> { - let devices: Vec = self + let devices: Vec> = self .verification_machine .store .get_user_devices(self.user_id()) @@ -440,7 +440,7 @@ impl MasterPubkey { } /// Get the signatures map of this cross signing key. - pub fn signatures(&self) -> &BTreeMap> { + pub fn signatures(&self) -> &BTreeMap, BTreeMap> { &self.0.signatures } @@ -475,7 +475,7 @@ impl MasterPubkey { ) -> Result<(), SignatureError> { let (key_id, key) = self.0.keys.iter().next().ok_or(SignatureError::MissingSigningKey)?; - let key_id = DeviceKeyId::try_from(key_id.as_str())?; + let key_id = <&DeviceKeyId>::try_from(key_id.as_str())?; // FIXME `KeyUsage is missing PartialEq. // if self.0.usage.contains(&KeyUsage::Master) { @@ -483,14 +483,14 @@ impl MasterPubkey { // } let subkey: CrossSigningSubKeys = subkey.into(); - if &self.0.user_id != subkey.user_id() { + if self.0.user_id != subkey.user_id() { return Err(SignatureError::UserIdMismatch); } let utility = Utility::new(); utility.verify_json( &self.0.user_id, - &key_id, + key_id, key, &mut to_value(subkey.cross_signing_key()).map_err(|_| SignatureError::NotAnObject)?, ) @@ -537,7 +537,7 @@ impl UserSigningPubkey { let utility = Utility::new(); utility.verify_json( &self.0.user_id, - &DeviceKeyId::try_from(key_id.as_str())?, + key_id.as_str().try_into()?, key, &mut to_value(&*master_key.0).map_err(|_| SignatureError::NotAnObject)?, ) @@ -572,12 +572,7 @@ impl SelfSigningPubkey { let utility = Utility::new(); - utility.verify_json( - &self.0.user_id, - &DeviceKeyId::try_from(key_id.as_str())?, - key, - &mut device, - ) + utility.verify_json(&self.0.user_id, key_id.as_str().try_into()?, key, &mut device) } /// Check if the given device is signed by this self signing key. @@ -718,7 +713,7 @@ impl ReadOnlyUserIdentity { ) -> Result { master_key.verify_subkey(&self_signing_key)?; - Ok(Self { user_id: Arc::new(master_key.0.user_id.clone()), master_key, self_signing_key }) + Ok(Self { user_id: master_key.0.user_id.clone().into(), master_key, self_signing_key }) } #[cfg(test)] @@ -727,7 +722,7 @@ impl ReadOnlyUserIdentity { let self_signing_key = identity.self_signing_key.lock().await.as_ref().unwrap().public_key.clone(); - Self { user_id: Arc::new(identity.user_id().clone()), master_key, self_signing_key } + Self { user_id: identity.user_id().into(), master_key, self_signing_key } } /// Get the user id of this identity. @@ -831,7 +826,7 @@ impl ReadOnlyOwnUserIdentity { master_key.verify_subkey(&user_signing_key)?; Ok(Self { - user_id: Arc::new(master_key.0.user_id.clone()), + user_id: master_key.0.user_id.clone().into(), master_key, self_signing_key, user_signing_key, @@ -969,9 +964,9 @@ pub(crate) mod test { fn own_identity(response: &KeyQueryResponse) -> ReadOnlyOwnUserIdentity { let user_id = user_id!("@example:localhost"); - let master_key = response.master_keys.get(&user_id).unwrap(); - let user_signing = response.user_signing_keys.get(&user_id).unwrap(); - let self_signing = response.self_signing_keys.get(&user_id).unwrap(); + let master_key = response.master_keys.get(user_id).unwrap(); + let user_signing = response.user_signing_keys.get(user_id).unwrap(); + let self_signing = response.self_signing_keys.get(user_id).unwrap(); ReadOnlyOwnUserIdentity::new(master_key.into(), self_signing.into(), user_signing.into()) .unwrap() @@ -985,8 +980,8 @@ pub(crate) mod test { let user_id = user_id!("@example2:localhost"); let response = other_key_query(); - let master_key = response.master_keys.get(&user_id).unwrap(); - let self_signing = response.self_signing_keys.get(&user_id).unwrap(); + let master_key = response.master_keys.get(user_id).unwrap(); + let self_signing = response.self_signing_keys.get(user_id).unwrap(); ReadOnlyUserIdentity::new(master_key.into(), self_signing.into()).unwrap() } @@ -996,9 +991,9 @@ pub(crate) mod test { let user_id = user_id!("@example:localhost"); let response = own_key_query(); - let master_key = response.master_keys.get(&user_id).unwrap(); - let user_signing = response.user_signing_keys.get(&user_id).unwrap(); - let self_signing = response.self_signing_keys.get(&user_id).unwrap(); + let master_key = response.master_keys.get(user_id).unwrap(); + let user_signing = response.user_signing_keys.get(user_id).unwrap(); + let self_signing = response.self_signing_keys.get(user_id).unwrap(); ReadOnlyOwnUserIdentity::new(master_key.into(), self_signing.into(), user_signing.into()) .unwrap(); @@ -1019,7 +1014,7 @@ pub(crate) mod test { assert!(identity.is_device_signed(&second).is_ok()); let private_identity = - Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(second.user_id().clone()))); + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(second.user_id().to_owned()))); let verification_machine = VerificationMachine::new( ReadOnlyAccount::new(second.user_id(), second.device_id()), private_identity, diff --git a/crates/matrix-sdk-crypto/src/lib.rs b/crates/matrix-sdk-crypto/src/lib.rs index f00a599c4ae..f9a8ce3302b 100644 --- a/crates/matrix-sdk-crypto/src/lib.rs +++ b/crates/matrix-sdk-crypto/src/lib.rs @@ -55,14 +55,14 @@ pub struct RoomKeyImportResult { /// /// It's a map from room id to a map of the sender key to a set of session /// ids. - pub keys: BTreeMap>>, + pub keys: BTreeMap, BTreeMap>>, } impl RoomKeyImportResult { pub(crate) fn new( imported_count: usize, total_count: usize, - keys: BTreeMap>>, + keys: BTreeMap, BTreeMap>>, ) -> Self { Self { imported_count, total_count, keys } } diff --git a/crates/matrix-sdk-crypto/src/machine.rs b/crates/matrix-sdk-crypto/src/machine.rs index abf9f0b1833..aca4dc4c880 100644 --- a/crates/matrix-sdk-crypto/src/machine.rs +++ b/crates/matrix-sdk-crypto/src/machine.rs @@ -46,8 +46,7 @@ use ruma::{ secret::request::SecretName, AnyMessageEventContent, AnyRoomEvent, AnyToDeviceEvent, EventContent, }, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UInt, - UserId, + DeviceId, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UInt, UserId, }; use serde_json::Value; use tracing::{debug, error, info, trace, warn}; @@ -135,7 +134,7 @@ impl OlmMachine { /// * `device_id` - The unique id of the device that owns this machine. pub fn new(user_id: &UserId, device_id: &DeviceId) -> Self { let store: Box = Box::new(MemoryStore::new()); - let device_id: DeviceIdBox = device_id.into(); + let device_id: Box = device_id.into(); let account = ReadOnlyAccount::new(user_id, &device_id); OlmMachine::new_helper( @@ -149,12 +148,12 @@ impl OlmMachine { fn new_helper( user_id: &UserId, - device_id: DeviceIdBox, + device_id: Box, store: Box, account: ReadOnlyAccount, user_identity: PrivateCrossSigningIdentity, ) -> Self { - let user_id = Arc::new(user_id.clone()); + let user_id: Arc = user_id.into(); let user_identity = Arc::new(Mutex::new(user_identity)); let store: Arc = store.into(); @@ -225,8 +224,8 @@ impl OlmMachine { /// /// [`Cryptostore`]: trait.CryptoStore.html pub async fn new_with_store( - user_id: UserId, - device_id: DeviceIdBox, + user_id: Box, + device_id: Box, store: Box, ) -> StoreResult { let account = match store.load_account().await? { @@ -308,7 +307,7 @@ impl OlmMachine { } /// Get all the tracked users we know about - pub fn tracked_users(&self) -> HashSet { + pub fn tracked_users(&self) -> HashSet> { self.store.tracked_users() } @@ -455,8 +454,8 @@ impl OlmMachine { /// # use matrix_sdk_crypto::OlmMachine; /// # use ruma::UserId; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); - /// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// if machine.should_upload_keys().await { /// let request = machine @@ -1069,7 +1068,7 @@ impl OlmMachine { VerificationState::UnknownDevice }; - let sender = sender.clone(); + let sender = sender.to_owned(); let device_id = device_id.to_owned(); Ok(EncryptionInfo { @@ -1227,10 +1226,10 @@ impl OlmMachine { /// # use matrix_sdk_crypto::OlmMachine; /// # use ruma::UserId; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); - /// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { - /// let device = machine.get_device(&alice, "DEVICEID".into()).await; + /// let device = machine.get_device(&alice, device_id!("DEVICEID")).await; /// /// println!("{:?}", device); /// # }); @@ -1268,8 +1267,8 @@ impl OlmMachine { /// # use matrix_sdk_crypto::OlmMachine; /// # use ruma::UserId; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); - /// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let devices = machine.get_user_devices(&alice).await.unwrap(); /// @@ -1305,7 +1304,7 @@ impl OlmMachine { /// # use ruma::user_id; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); - /// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); + /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// # let export = Cursor::new("".to_owned()); /// let exported_keys = decrypt_key_export(export, "1234").unwrap(); @@ -1417,7 +1416,7 @@ impl OlmMachine { /// # use ruma::{user_id, room_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); - /// # let machine = OlmMachine::new(&alice, "DEVICEID".into()); + /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let room_id = room_id!("!test:localhost"); /// let exported_keys = machine.export_keys(|s| s.room_id() == &room_id).await.unwrap(); @@ -1489,7 +1488,7 @@ impl OlmMachine { async fn sign_account( &self, message: &str, - signatures: &mut BTreeMap>, + signatures: &mut BTreeMap, BTreeMap, String>>, ) { let device_key_id = DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, self.device_id()); let signature = self.account.sign(message).await; @@ -1500,11 +1499,11 @@ impl OlmMachine { async fn sign_master( &self, message: &str, - signatures: &mut BTreeMap>, + signatures: &mut BTreeMap, BTreeMap, String>>, ) -> Result<(), crate::SignatureError> { let identity = &*self.user_identity.lock().await; - let master_key: DeviceIdBox = identity + let master_key: Box = identity .master_public_key() .await .and_then(|m| m.get_first_key().map(|k| k.to_owned())) @@ -1521,7 +1520,10 @@ impl OlmMachine { /// Sign the given message using our device key and if available cross /// signing master key. - pub async fn sign(&self, message: &str) -> BTreeMap> { + pub async fn sign( + &self, + message: &str, + ) -> BTreeMap, BTreeMap, String>> { let mut signatures: BTreeMap<_, BTreeMap<_, _>> = BTreeMap::new(); self.sign_account(message, &mut signatures).await; @@ -1545,13 +1547,7 @@ impl OlmMachine { #[cfg(test)] pub(crate) mod test { - static USER_ID: &str = "@bob:example.org"; - - use std::{ - collections::BTreeMap, - convert::{TryFrom, TryInto}, - sync::Arc, - }; + use std::{collections::BTreeMap, convert::TryInto, iter, sync::Arc}; use http::Response; use matrix_sdk_test::test_json; @@ -1560,6 +1556,7 @@ pub(crate) mod test { client::r0::keys::{claim_keys, get_keys, upload_keys}, IncomingResponse, }, + device_id, encryption::OneTimeKey, event_id, events::{ @@ -1584,18 +1581,18 @@ pub(crate) mod test { }; /// These keys need to be periodically uploaded to the server. - type OneTimeKeys = BTreeMap; + type OneTimeKeys = BTreeMap, OneTimeKey>; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn user_id() -> UserId { - UserId::try_from(USER_ID).unwrap() + fn user_id() -> &'static UserId { + user_id!("@bob:example.com") } pub fn response_from_file(json: &serde_json::Value) -> Response> { @@ -1632,7 +1629,7 @@ pub(crate) mod test { } pub(crate) async fn get_prepared_machine() -> (OlmMachine, OneTimeKeys) { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); machine.account.inner.update_uploaded_key_count(0); let request = machine.keys_for_upload().await.expect("Can't prepare initial key upload"); let response = keys_upload_response(); @@ -1655,7 +1652,7 @@ pub(crate) mod test { let alice_id = alice_id(); let alice_device = alice_device_id(); - let alice = OlmMachine::new(&alice_id, &alice_device); + let alice = OlmMachine::new(alice_id, alice_device); let alice_device = ReadOnlyDevice::from_machine(&alice).await; let bob_device = ReadOnlyDevice::from_machine(&bob).await; @@ -1676,7 +1673,7 @@ pub(crate) mod test { bob_keys.insert(bob.device_id().into(), keys); let mut one_time_keys = BTreeMap::new(); - one_time_keys.insert(bob.user_id().clone(), bob_keys); + one_time_keys.insert(bob.user_id().to_owned(), bob_keys); let response = claim_keys::Response::new(one_time_keys); @@ -1696,7 +1693,7 @@ pub(crate) mod test { .unwrap(); alice.store.save_sessions(&[session]).await.unwrap(); - let event = ToDeviceEvent { sender: alice.user_id().clone(), content }; + let event = ToDeviceEvent { sender: alice.user_id().to_owned(), content }; let decrypted = bob.decrypt_to_device_event(&event).await.unwrap(); bob.store.save_sessions(&[decrypted.session.session()]).await.unwrap(); @@ -1706,13 +1703,13 @@ pub(crate) mod test { #[tokio::test] async fn create_olm_machine() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); assert!(machine.should_upload_keys().await); } #[tokio::test] async fn receive_keys_upload_response() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); let mut response = keys_upload_response(); response.one_time_key_counts.remove(&DeviceKeyAlgorithm::SignedCurve25519).unwrap(); @@ -1736,7 +1733,7 @@ pub(crate) mod test { #[tokio::test] async fn generate_one_time_keys() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); let mut response = keys_upload_response(); @@ -1753,7 +1750,7 @@ pub(crate) mod test { #[tokio::test] async fn test_device_key_signing() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); let mut device_keys = machine.account.device_keys().await; let identity_keys = machine.account.identity_keys(); @@ -1771,24 +1768,24 @@ pub(crate) mod test { #[tokio::test] async fn tests_session_invalidation() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); let room_id = room_id!("!test:example.org"); - machine.create_outbound_group_session_with_defaults(&room_id).await.unwrap(); - assert!(machine.group_session_manager.get_outbound_group_session(&room_id).is_some()); + machine.create_outbound_group_session_with_defaults(room_id).await.unwrap(); + assert!(machine.group_session_manager.get_outbound_group_session(room_id).is_some()); - machine.invalidate_group_session(&room_id).await.unwrap(); + machine.invalidate_group_session(room_id).await.unwrap(); assert!(machine .group_session_manager - .get_outbound_group_session(&room_id) + .get_outbound_group_session(room_id) .unwrap() .invalidated()); } #[tokio::test] async fn test_invalid_signature() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); let mut device_keys = machine.account.device_keys().await; @@ -1804,7 +1801,7 @@ pub(crate) mod test { #[tokio::test] async fn test_one_time_key_signing() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); machine.account.inner.update_uploaded_key_count(49); let mut one_time_keys = machine.account.signed_one_time_keys().await.unwrap(); @@ -1825,7 +1822,7 @@ pub(crate) mod test { #[tokio::test] async fn test_keys_for_upload() { - let machine = OlmMachine::new(&user_id(), &alice_device_id()); + let machine = OlmMachine::new(user_id(), alice_device_id()); machine.account.inner.update_uploaded_key_count(0); let identity_keys = machine.account.identity_keys(); @@ -1869,15 +1866,15 @@ pub(crate) mod test { let (machine, _) = get_prepared_machine().await; let response = keys_query_response(); let alice_id = user_id!("@alice:example.org"); - let alice_device_id: &DeviceId = "JLAFKJWSCS".into(); + let alice_device_id: &DeviceId = device_id!("JLAFKJWSCS"); - let alice_devices = machine.store.get_user_devices(&alice_id).await.unwrap(); + let alice_devices = machine.store.get_user_devices(alice_id).await.unwrap(); assert!(alice_devices.devices().peekable().peek().is_none()); machine.receive_keys_query_response(&response).await.unwrap(); - let device = machine.store.get_device(&alice_id, alice_device_id).await.unwrap().unwrap(); - assert_eq!(device.user_id(), &alice_id); + let device = machine.store.get_device(alice_id, alice_device_id).await.unwrap().unwrap(); + assert_eq!(device.user_id(), alice_id); assert_eq!(device.device_id(), alice_device_id); } @@ -1889,11 +1886,11 @@ pub(crate) mod test { let alice_device = alice_device_id(); let (_, missing_sessions) = - machine.get_missing_sessions(&mut [alice.clone()].iter()).await.unwrap().unwrap(); + machine.get_missing_sessions(iter::once(alice)).await.unwrap().unwrap(); - assert!(missing_sessions.one_time_keys.contains_key(&alice)); - let user_sessions = missing_sessions.one_time_keys.get(&alice).unwrap(); - assert!(user_sessions.contains_key(&alice_device)); + assert!(missing_sessions.one_time_keys.contains_key(alice)); + let user_sessions = missing_sessions.one_time_keys.get(alice).unwrap(); + assert!(user_sessions.contains_key(alice_device)); } #[tokio::test] @@ -1908,7 +1905,7 @@ pub(crate) mod test { bob_keys.insert(bob_machine.device_id().into(), keys); let mut one_time_keys = BTreeMap::new(); - one_time_keys.insert(bob_machine.user_id().clone(), bob_keys); + one_time_keys.insert(bob_machine.user_id().to_owned(), bob_keys); let response = claim_keys::Response::new(one_time_keys); @@ -1931,7 +1928,7 @@ pub(crate) mod test { let bob_device = alice.get_device(&bob.user_id, &bob.device_id).await.unwrap().unwrap(); let event = ToDeviceEvent { - sender: alice.user_id().clone(), + sender: alice.user_id().to_owned(), content: bob_device .encrypt(AnyToDeviceEventContent::Dummy(ToDeviceDummyEventContent::new())) .await @@ -1955,21 +1952,17 @@ pub(crate) mod test { let room_id = room_id!("!test:example.org"); let to_device_requests = alice - .share_group_session( - &room_id, - [bob.user_id().clone()].iter(), - EncryptionSettings::default(), - ) + .share_group_session(room_id, iter::once(bob.user_id()), EncryptionSettings::default()) .await .unwrap(); let event = ToDeviceEvent { - sender: alice.user_id().clone(), + sender: alice.user_id().to_owned(), content: to_device_requests_to_content(to_device_requests), }; let alice_session = - alice.group_session_manager.get_outbound_group_session(&room_id).unwrap(); + alice.group_session_manager.get_outbound_group_session(room_id).unwrap(); let decrypted = bob.decrypt_to_device_event(&event).await.unwrap(); @@ -1990,7 +1983,7 @@ pub(crate) mod test { let session = bob .store .get_inbound_group_session( - &room_id, + room_id, alice.account.identity_keys().curve25519(), alice_session.session_id(), ) @@ -2005,16 +1998,12 @@ pub(crate) mod test { let room_id = room_id!("!test:example.org"); let to_device_requests = alice - .share_group_session( - &room_id, - [bob.user_id().clone()].iter(), - EncryptionSettings::default(), - ) + .share_group_session(room_id, iter::once(bob.user_id()), EncryptionSettings::default()) .await .unwrap(); let event = ToDeviceEvent { - sender: alice.user_id().clone(), + sender: alice.user_id().to_owned(), content: to_device_requests_to_content(to_device_requests), }; @@ -2027,20 +2016,20 @@ pub(crate) mod test { let content = RoomMessageEventContent::text_plain(plaintext); let encrypted_content = alice - .encrypt(&room_id, AnyMessageEventContent::RoomMessage(content.clone())) + .encrypt(room_id, AnyMessageEventContent::RoomMessage(content.clone())) .await .unwrap(); let event = SyncMessageEvent { - event_id: event_id!("$xxxxx:example.org"), + event_id: event_id!("$xxxxx:example.org").to_owned(), origin_server_ts: MilliSecondsSinceUnixEpoch::now(), - sender: alice.user_id().clone(), + sender: alice.user_id().to_owned(), content: encrypted_content, unsigned: Unsigned::default(), }; let decrypted_event = - bob.decrypt_room_event(&event, &room_id).await.unwrap().event.deserialize().unwrap(); + bob.decrypt_room_event(&event, room_id).await.unwrap().event.deserialize().unwrap(); if let AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomMessage(SyncMessageEvent { sender, @@ -2067,8 +2056,8 @@ pub(crate) mod test { let tmpdir = tempdir().unwrap(); let machine = OlmMachine::new_with_default_store( - &user_id(), - &alice_device_id(), + user_id(), + alice_device_id(), tmpdir.as_ref(), Some("test"), ) @@ -2085,7 +2074,7 @@ pub(crate) mod test { let machine = OlmMachine::new_with_default_store( &user_id, - &alice_device_id(), + alice_device_id(), tmpdir.as_ref(), Some("test"), ) diff --git a/crates/matrix-sdk-crypto/src/olm/account.rs b/crates/matrix-sdk-crypto/src/olm/account.rs index f332f018d32..7949b822620 100644 --- a/crates/matrix-sdk-crypto/src/olm/account.rs +++ b/crates/matrix-sdk-crypto/src/olm/account.rs @@ -40,8 +40,7 @@ use ruma::{ AnyToDeviceEvent, OlmV1Keys, }, serde::{CanonicalJsonValue, Raw}, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UInt, - UserId, + DeviceId, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UInt, UserId, }; use serde::{Deserialize, Serialize}; use serde_json::{json, value::RawValue as RawJsonValue, Value}; @@ -85,7 +84,7 @@ impl SessionType { #[derive(Debug, Clone)] pub struct OlmDecryptionInfo { - pub sender: UserId, + pub sender: Box, pub session: SessionType, pub message_hash: OlmMessageHash, pub deserialized_event: Option, @@ -440,8 +439,8 @@ impl Account { ) -> OlmResult<(Raw, String)> { #[derive(Deserialize)] struct DecryptedEvent { - sender: UserId, - recipient: UserId, + sender: Box, + recipient: Box, recipient_keys: OlmV1Keys, keys: OlmV1Keys, } @@ -449,9 +448,9 @@ impl Account { let event: DecryptedEvent = serde_json::from_str(&plaintext)?; let identity_keys = self.inner.identity_keys(); - if &event.recipient != self.user_id() { + if event.recipient != self.user_id() { Err(EventError::MismatchedSender(event.recipient, self.user_id().to_owned()).into()) - } else if &event.sender != sender { + } else if event.sender != sender { Err(EventError::MismatchedSender(event.sender, sender.to_owned()).into()) } else if identity_keys.ed25519() != event.recipient_keys.ed25519 { Err(EventError::MismatchedKeys( @@ -508,9 +507,9 @@ impl From for AccountPickle { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PickledAccount { /// The user id of the account owner. - pub user_id: UserId, + pub user_id: Box, /// The device id of the account owner. - pub device_id: DeviceIdBox, + pub device_id: Box, /// The pickled version of the Olm account. pub pickle: AccountPickle, /// Was the account shared. @@ -542,8 +541,8 @@ impl ReadOnlyAccount { let identity_keys = account.parsed_identity_keys(); Self { - user_id: Arc::new(user_id.to_owned()), - device_id: device_id.to_owned().into(), + user_id: user_id.into(), + device_id: device_id.into(), inner: Arc::new(Mutex::new(account)), identity_keys: Arc::new(identity_keys), shared: Arc::new(AtomicBool::new(false)), @@ -662,7 +661,7 @@ impl ReadOnlyAccount { /// Returns None if no keys need to be uploaded. pub(crate) async fn keys_for_upload( &self, - ) -> Option<(Option, Option>)> { + ) -> Option<(Option, Option, OneTimeKey>>)> { if !self.should_upload_keys().await { return None; } @@ -735,7 +734,7 @@ impl ReadOnlyAccount { let identity_keys = account.parsed_identity_keys(); Ok(Self { - user_id: Arc::new(pickle.user_id), + user_id: pickle.user_id.into(), device_id: pickle.device_id.into(), inner: Arc::new(Mutex::new(account)), identity_keys: Arc::new(identity_keys), @@ -758,7 +757,7 @@ impl ReadOnlyAccount { ]); DeviceKeys::new( - (*self.user_id).clone(), + (*self.user_id).to_owned(), (*self.device_id).to_owned(), Self::ALGORITHMS.iter().map(|a| (&**a).clone()).collect(), keys, @@ -780,10 +779,14 @@ impl ReadOnlyAccount { "keys": device_keys.keys, }); - device_keys.signatures.entry(self.user_id().clone()).or_insert_with(BTreeMap::new).insert( - DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, &self.device_id), - self.sign_json(json_device_keys).await, - ); + device_keys + .signatures + .entry(self.user_id().to_owned()) + .or_insert_with(BTreeMap::new) + .insert( + DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, &self.device_id), + self.sign_json(json_device_keys).await, + ); device_keys } @@ -850,7 +853,7 @@ impl ReadOnlyAccount { pub(crate) async fn signed_one_time_keys_helper( &self, - ) -> Result, ()> { + ) -> Result, OneTimeKey>, ()> { let one_time_keys = self.one_time_keys().await; let mut one_time_key_map = BTreeMap::new(); @@ -869,7 +872,7 @@ impl ReadOnlyAccount { ); let mut signatures = BTreeMap::new(); - signatures.insert((*self.user_id).clone(), signature_map); + signatures.insert((*self.user_id).to_owned(), signature_map); let signed_key = SignedKey::new(key.to_owned(), signatures); @@ -890,7 +893,7 @@ impl ReadOnlyAccount { /// If no one-time keys need to be uploaded returns an empty error. pub(crate) async fn signed_one_time_keys( &self, - ) -> Result, ()> { + ) -> Result, OneTimeKey>, ()> { let _ = self.generate_one_time_keys().await?; self.signed_one_time_keys_helper().await } @@ -945,7 +948,7 @@ impl ReadOnlyAccount { pub(crate) async fn create_outbound_session( &self, device: ReadOnlyDevice, - key_map: &BTreeMap, + key_map: &BTreeMap, OneTimeKey>, ) -> Result { let one_time_key = key_map.values().next().ok_or_else(|| { SessionCreationError::OneTimeKeyMissing( @@ -1152,25 +1155,25 @@ impl PartialEq for ReadOnlyAccount { #[cfg(test)] mod test { - use std::collections::BTreeSet; + use std::{collections::BTreeSet, ops::Deref}; use matrix_sdk_test::async_test; - use ruma::{identifiers::DeviceIdBox, user_id, DeviceKeyId, UserId}; + use ruma::{device_id, identifiers::DeviceId, user_id, DeviceKeyId, UserId}; use super::ReadOnlyAccount; use crate::error::OlmResult as Result; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@alice:localhost") } - fn device_id() -> DeviceIdBox { - "DEVICEID".into() + fn device_id() -> &'static DeviceId { + device_id!("DEVICEID") } #[async_test] async fn one_time_key_creation() -> Result<()> { - let account = ReadOnlyAccount::new(&user_id(), &device_id()); + let account = ReadOnlyAccount::new(user_id(), device_id()); let one_time_keys = account .keys_for_upload() @@ -1184,8 +1187,10 @@ mod test { .and_then(|(_, k)| k) .expect("Second round of one-time keys isn't generated"); - let device_key_ids: BTreeSet<&DeviceKeyId> = one_time_keys.keys().collect(); - let second_device_key_ids: BTreeSet<&DeviceKeyId> = second_one_time_keys.keys().collect(); + let device_key_ids: BTreeSet<&DeviceKeyId> = + one_time_keys.keys().map(Deref::deref).collect(); + let second_device_key_ids: BTreeSet<&DeviceKeyId> = + second_one_time_keys.keys().map(Deref::deref).collect(); assert_eq!(device_key_ids, second_device_key_ids); @@ -1204,7 +1209,8 @@ mod test { .and_then(|(_, k)| k) .expect("Fourth round of one-time keys isn't generated"); - let fourth_device_key_ids: BTreeSet<&DeviceKeyId> = fourth_one_time_keys.keys().collect(); + let fourth_device_key_ids: BTreeSet<&DeviceKeyId> = + fourth_one_time_keys.keys().map(Deref::deref).collect(); assert_ne!(device_key_ids, fourth_device_key_ids); diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs index 8e1927c2126..f966649b472 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs @@ -110,7 +110,7 @@ impl InboundGroupSession { sender_key: sender_key.to_owned().into(), first_known_index, signing_keys: keys.into(), - room_id: room_id.clone().into(), + room_id: room_id.into(), forwarding_chains: Vec::new().into(), imported: false, backed_up: AtomicBool::new(false).into(), @@ -201,7 +201,7 @@ impl InboundGroupSession { pickle: InboundGroupSessionPickle::from(pickle), sender_key: self.sender_key.to_string(), signing_key: (&*self.signing_keys).clone(), - room_id: (&*self.room_id).clone(), + room_id: (&*self.room_id).to_owned(), forwarding_chains: self.forwarding_key_chain().to_vec(), imported: self.imported, backed_up: self.backed_up(), @@ -261,7 +261,7 @@ impl InboundGroupSession { ExportedRoomKey { algorithm: EventEncryptionAlgorithm::MegolmV1AesSha2, - room_id: (&*self.room_id).clone(), + room_id: (&*self.room_id).to_owned(), sender_key: (&*self.sender_key).to_owned(), session_id: self.session_id().to_owned(), forwarding_curve25519_key_chain: self.forwarding_key_chain().to_vec(), @@ -365,11 +365,11 @@ impl InboundGroupSession { let room_id = decrypted_object .get("room_id") - .and_then(|r| r.as_str().and_then(|r| RoomId::try_from(r).ok())); + .and_then(|r| r.as_str().and_then(|r| Box::::try_from(r).ok())); // Check that we have a room id and that the event wasn't forwarded from // another room. - if room_id.as_ref() != Some(self.room_id()) { + if room_id.as_deref() != Some(self.room_id()) { return Err(EventError::MismatchedRoom(self.room_id().to_owned(), room_id).into()); } @@ -419,7 +419,7 @@ pub struct PickledInboundGroupSession { /// The public ed25519 key of the account that sent us the session. pub signing_key: BTreeMap, /// The id of the room that the session is used in. - pub room_id: RoomId, + pub room_id: Box, /// The list of claimed ed25519 that forwarded us this key. Will be None if /// we directly received this session. #[serde(default)] diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs index 6f0ef00b541..05593e160f6 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs @@ -52,7 +52,7 @@ pub struct ExportedRoomKey { pub algorithm: EventEncryptionAlgorithm, /// The room where the session is used. - pub room_id: RoomId, + pub room_id: Box, /// The Curve25519 key of the device which initiated the session originally. pub sender_key: String, @@ -166,7 +166,7 @@ mod test { time::{Duration, Instant}, }; - use ruma::{events::room::message::RoomMessageEventContent, room_id, user_id}; + use ruma::{device_id, events::room::message::RoomMessageEventContent, room_id, user_id}; use super::EncryptionSettings; use crate::{MegolmError, ReadOnlyAccount}; @@ -176,9 +176,9 @@ mod test { async fn expiration() -> Result<(), MegolmError> { let settings = EncryptionSettings { rotation_period_msgs: 1, ..Default::default() }; - let account = ReadOnlyAccount::new(&user_id!("@alice:example.org"), "DEVICEID".into()); + let account = ReadOnlyAccount::new(user_id!("@alice:example.org"), device_id!("DEVICEID")); let (session, _) = account - .create_group_session_pair(&room_id!("!test_room:example.org"), settings) + .create_group_session_pair(room_id!("!test_room:example.org"), settings) .await .unwrap(); @@ -197,7 +197,7 @@ mod test { }; let (mut session, _) = account - .create_group_session_pair(&room_id!("!test_room:example.org"), settings) + .create_group_session_pair(room_id!("!test_room:example.org"), settings) .await .unwrap(); diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs index 5d0d8535616..b4be71fd1d1 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/outbound.rs @@ -45,7 +45,7 @@ use ruma::{ room_key::ToDeviceRoomKeyEventContent, AnyToDeviceEventContent, }, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, EventEncryptionAlgorithm, RoomId, UserId, + DeviceId, DeviceKeyAlgorithm, EventEncryptionAlgorithm, RoomId, UserId, }; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; @@ -128,7 +128,8 @@ pub struct OutboundGroupSession { shared: Arc, invalidated: Arc, settings: Arc, - pub(crate) shared_with_set: Arc>>, + #[allow(clippy::type_complexity)] + pub(crate) shared_with_set: Arc, DashMap, ShareInfo>>>, to_share_with_set: Arc, ShareInfoSet)>>, } @@ -136,7 +137,7 @@ pub struct OutboundGroupSession { /// /// Holds the `ShareInfo` for all the user/device pairs that will receive the /// room key. -pub type ShareInfoSet = BTreeMap>; +pub type ShareInfoSet = BTreeMap, BTreeMap, ShareInfo>>; /// Struct holding info about the share state of a outbound group session. #[derive(Clone, Debug, Serialize, Deserialize)] @@ -174,7 +175,7 @@ impl OutboundGroupSession { OutboundGroupSession { inner: Arc::new(Mutex::new(session)), - room_id: Arc::new(room_id.to_owned()), + room_id: room_id.into(), device_id, account_identity_keys: identity_keys, session_id: session_id.into(), @@ -214,7 +215,7 @@ impl OutboundGroupSession { pub fn mark_request_as_sent(&self, request_id: &Uuid) { if let Some((_, (_, r))) = self.to_share_with_set.remove(request_id) { let recipients: BTreeMap<&UserId, BTreeSet<&DeviceId>> = - r.iter().map(|(u, d)| (u, d.keys().map(|d| d.as_ref()).collect())).collect(); + r.iter().map(|(u, d)| (&**u, d.keys().map(|d| d.as_ref()).collect())).collect(); info!( ?request_id, @@ -589,7 +590,7 @@ pub struct PickledOutboundGroupSession { /// Has the session been invalidated. pub invalidated: bool, /// The set of users the session has been already shared with. - pub shared_with_set: BTreeMap>, + pub shared_with_set: BTreeMap, BTreeMap, ShareInfo>>, /// Requests that need to be sent out to share the session. pub requests: BTreeMap, ShareInfoSet)>, } diff --git a/crates/matrix-sdk-crypto/src/olm/mod.rs b/crates/matrix-sdk-crypto/src/olm/mod.rs index 577f5647957..94e689fd04d 100644 --- a/crates/matrix-sdk-crypto/src/olm/mod.rs +++ b/crates/matrix-sdk-crypto/src/olm/mod.rs @@ -64,6 +64,7 @@ pub(crate) mod test { use matches::assert_matches; use olm_rs::session::OlmMessage; use ruma::{ + device_id, encryption::SignedKey, event_id, events::{ @@ -80,25 +81,25 @@ pub(crate) mod test { MegolmError, }; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "ALICEDEVICE".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("ALICEDEVICE") } - fn bob_id() -> UserId { + fn bob_id() -> &'static UserId { user_id!("@bob:example.org") } - fn bob_device_id() -> Box { - "BOBDEVICE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVICE") } pub(crate) async fn get_account_and_session() -> (ReadOnlyAccount, Session) { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); bob.generate_one_time_keys_helper(1).await; let one_time_key = @@ -113,7 +114,7 @@ pub(crate) mod test { #[test] fn account_creation() { - let account = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let account = ReadOnlyAccount::new(alice_id(), alice_device_id()); let identity_keys = account.identity_keys(); assert!(!account.shared()); @@ -131,7 +132,7 @@ pub(crate) mod test { #[tokio::test] async fn one_time_keys_creation() { - let account = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let account = ReadOnlyAccount::new(alice_id(), alice_device_id()); let one_time_keys = account.one_time_keys().await; assert!(one_time_keys.curve25519().is_empty()); @@ -155,8 +156,8 @@ pub(crate) mod test { #[tokio::test] async fn session_creation() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let alice_keys = alice.identity_keys(); alice.generate_one_time_keys_helper(1).await; let one_time_keys = alice.one_time_keys().await; @@ -196,10 +197,10 @@ pub(crate) mod test { #[tokio::test] async fn group_session_creation() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let room_id = room_id!("!test:localhost"); - let (outbound, _) = alice.create_group_session_pair_with_defaults(&room_id).await.unwrap(); + let (outbound, _) = alice.create_group_session_pair_with_defaults(room_id).await.unwrap(); assert_eq!(0, outbound.message_index().await); assert!(!outbound.shared()); @@ -209,7 +210,7 @@ pub(crate) mod test { let inbound = InboundGroupSession::new( "test_key", "test_key", - &room_id, + room_id, outbound.session_key().await, None, ) @@ -227,11 +228,11 @@ pub(crate) mod test { #[tokio::test] async fn edit_decryption() -> Result<(), MegolmError> { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let room_id = room_id!("!test:localhost"); let event_id = event_id!("$1234adfad:asdf"); - let (outbound, _) = alice.create_group_session_pair_with_defaults(&room_id).await.unwrap(); + let (outbound, _) = alice.create_group_session_pair_with_defaults(room_id).await.unwrap(); assert_eq!(0, outbound.message_index().await); assert!(!outbound.shared()); @@ -240,14 +241,14 @@ pub(crate) mod test { let mut content = RoomMessageEventContent::text_plain("Hello"); content.relates_to = Some(Relation::Replacement(Replacement::new( - event_id.clone(), + event_id.to_owned(), RoomMessageEventContent::text_plain("Hello edit").into(), ))); let inbound = InboundGroupSession::new( "test_key", "test_key", - &room_id, + room_id, outbound.session_key().await, None, )?; @@ -293,10 +294,10 @@ pub(crate) mod test { #[tokio::test] async fn group_session_export() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let room_id = room_id!("!test:localhost"); - let (_, inbound) = alice.create_group_session_pair_with_defaults(&room_id).await.unwrap(); + let (_, inbound) = alice.create_group_session_pair_with_defaults(room_id).await.unwrap(); let export = inbound.export().await; let export: ToDeviceForwardedRoomKeyEventContent = export.try_into().unwrap(); diff --git a/crates/matrix-sdk-crypto/src/olm/signing/mod.rs b/crates/matrix-sdk-crypto/src/olm/signing/mod.rs index d903f9b7f47..c4c6b8297a4 100644 --- a/crates/matrix-sdk-crypto/src/olm/signing/mod.rs +++ b/crates/matrix-sdk-crypto/src/olm/signing/mod.rs @@ -87,7 +87,7 @@ impl ClearResult { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PickledCrossSigningIdentity { /// The user id of the identity owner. - pub user_id: UserId, + pub user_id: Box, /// Have the public keys of the identity been shared. pub shared: bool, /// The encrypted pickle of the identity. @@ -220,7 +220,7 @@ impl PrivateCrossSigningIdentity { let master = if let Some(master_key) = master_key { let seed = decode(master_key)?; - let master = MasterSigning::from_seed(self.user_id().clone(), seed); + let master = MasterSigning::from_seed(self.user_id().to_owned(), seed); if public_identity.master_key() == &master.public_key { Ok(Some(master)) @@ -233,7 +233,7 @@ impl PrivateCrossSigningIdentity { let user_signing = if let Some(user_signing_key) = user_signing_key { let seed = decode(user_signing_key)?; - let subkey = UserSigning::from_seed(self.user_id().clone(), seed); + let subkey = UserSigning::from_seed(self.user_id().to_owned(), seed); if public_identity.user_signing_key() == &subkey.public_key { Ok(Some(subkey)) @@ -246,7 +246,7 @@ impl PrivateCrossSigningIdentity { let self_signing = if let Some(self_signing_key) = self_signing_key { let seed = decode(self_signing_key)?; - let subkey = SelfSigning::from_seed(self.user_id().clone(), seed); + let subkey = SelfSigning::from_seed(self.user_id().to_owned(), seed); if public_identity.self_signing_key() == &subkey.public_key { Ok(Some(subkey)) @@ -344,9 +344,9 @@ impl PrivateCrossSigningIdentity { } /// Create a new empty identity. - pub(crate) fn empty(user_id: UserId) -> Self { + pub(crate) fn empty(user_id: Box) -> Self { Self { - user_id: Arc::new(user_id), + user_id: user_id.into(), shared: Arc::new(AtomicBool::new(false)), master_key: Arc::new(Mutex::new(None)), self_signing_key: Arc::new(Mutex::new(None)), @@ -521,7 +521,7 @@ impl PrivateCrossSigningIdentity { let self_signing = SelfSigning { inner: self_signing, public_key: public_key.into() }; Self { - user_id: Arc::new(user_id.to_owned()), + user_id: user_id.into(), shared: Arc::new(AtomicBool::new(false)), master_key: Arc::new(Mutex::new(Some(master))), self_signing_key: Arc::new(Mutex::new(Some(self_signing))), @@ -532,7 +532,7 @@ impl PrivateCrossSigningIdentity { /// Create a new cross signing identity without signing the device that /// created it. #[cfg(test)] - pub(crate) async fn new(user_id: UserId) -> Self { + pub(crate) async fn new(user_id: Box) -> Self { let master = Signing::new(); let public_key = master.cross_signing_key(user_id.clone(), KeyUsage::Master); @@ -628,7 +628,7 @@ impl PrivateCrossSigningIdentity { .transpose()?; Ok(Self { - user_id: Arc::new(pickle.user_id), + user_id: pickle.user_id.into(), shared: Arc::new(AtomicBool::from(pickle.shared)), master_key: Arc::new(Mutex::new(master)), self_signing_key: Arc::new(Mutex::new(self_signing)), @@ -655,7 +655,7 @@ impl PrivateCrossSigningIdentity { #[cfg(test)] mod test { use matrix_sdk_test::async_test; - use ruma::{user_id, UserId}; + use ruma::{device_id, user_id, UserId}; use super::{PrivateCrossSigningIdentity, Signing}; use crate::{ @@ -663,7 +663,7 @@ mod test { olm::ReadOnlyAccount, }; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } @@ -699,7 +699,7 @@ mod test { #[async_test] async fn private_identity_creation() { - let identity = PrivateCrossSigningIdentity::new(user_id()).await; + let identity = PrivateCrossSigningIdentity::new(user_id().to_owned()).await; let master_key = identity.master_key.lock().await; let master_key = master_key.as_ref().unwrap(); @@ -717,7 +717,7 @@ mod test { #[async_test] async fn identity_pickling() { - let identity = PrivateCrossSigningIdentity::new(user_id()).await; + let identity = PrivateCrossSigningIdentity::new(user_id().to_owned()).await; let pickled = identity.pickle(pickle_key()).await.unwrap(); @@ -738,7 +738,7 @@ mod test { #[async_test] async fn private_identity_signed_by_account() { - let account = ReadOnlyAccount::new(&user_id(), "DEVICEID".into()); + let account = ReadOnlyAccount::new(user_id(), device_id!("DEVICEID")); let (identity, _, _) = PrivateCrossSigningIdentity::new_with_account(&account).await; let master = identity.master_key.lock().await; let master = master.as_ref().unwrap(); @@ -748,7 +748,7 @@ mod test { #[async_test] async fn sign_device() { - let account = ReadOnlyAccount::new(&user_id(), "DEVICEID".into()); + let account = ReadOnlyAccount::new(user_id(), device_id!("DEVICEID")); let (identity, _, _) = PrivateCrossSigningIdentity::new_with_account(&account).await; let mut device = ReadOnlyDevice::from_account(&account).await; @@ -765,10 +765,10 @@ mod test { #[async_test] async fn sign_user_identity() { - let account = ReadOnlyAccount::new(&user_id(), "DEVICEID".into()); + let account = ReadOnlyAccount::new(user_id(), device_id!("DEVICEID")); let (identity, _, _) = PrivateCrossSigningIdentity::new_with_account(&account).await; - let bob_account = ReadOnlyAccount::new(&user_id!("@bob:localhost"), "DEVICEID".into()); + let bob_account = ReadOnlyAccount::new(user_id!("@bob:localhost"), device_id!("DEVICEID")); let (bob_private, _, _) = PrivateCrossSigningIdentity::new_with_account(&bob_account).await; let mut bob_public = ReadOnlyUserIdentity::from_private(&bob_private).await; diff --git a/crates/matrix-sdk-crypto/src/olm/signing/pk_signing.rs b/crates/matrix-sdk-crypto/src/olm/signing/pk_signing.rs index 51a05679cd8..f66750b3340 100644 --- a/crates/matrix-sdk-crypto/src/olm/signing/pk_signing.rs +++ b/crates/matrix-sdk-crypto/src/olm/signing/pk_signing.rs @@ -139,7 +139,7 @@ impl MasterSigning { encode(self.inner.seed.as_slice()) } - pub fn from_seed(user_id: UserId, seed: Vec) -> Self { + pub fn from_seed(user_id: Box, seed: Vec) -> Self { let inner = Signing::from_seed(seed); let public_key = inner.cross_signing_key(user_id, KeyUsage::Master).into(); @@ -196,7 +196,7 @@ impl UserSigning { encode(self.inner.seed.as_slice()) } - pub fn from_seed(user_id: UserId, seed: Vec) -> Self { + pub fn from_seed(user_id: Box, seed: Vec) -> Self { let inner = Signing::from_seed(seed); let public_key = inner.cross_signing_key(user_id, KeyUsage::UserSigning).into(); @@ -260,7 +260,7 @@ impl SelfSigning { encode(self.inner.seed.as_slice()) } - pub fn from_seed(user_id: UserId, seed: Vec) -> Self { + pub fn from_seed(user_id: Box, seed: Vec) -> Self { let inner = Signing::from_seed(seed); let public_key = inner.cross_signing_key(user_id, KeyUsage::SelfSigning).into(); @@ -387,7 +387,7 @@ impl Signing { &self.public_key } - pub fn cross_signing_key(&self, user_id: UserId, usage: KeyUsage) -> CrossSigningKey { + pub fn cross_signing_key(&self, user_id: Box, usage: KeyUsage) -> CrossSigningKey { let keys = BTreeMap::from([( DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, self.public_key().as_str().into()) .to_string(), diff --git a/crates/matrix-sdk-crypto/src/olm/utility.rs b/crates/matrix-sdk-crypto/src/olm/utility.rs index 32a76991935..b8232737c71 100644 --- a/crates/matrix-sdk-crypto/src/olm/utility.rs +++ b/crates/matrix-sdk-crypto/src/olm/utility.rs @@ -95,7 +95,7 @@ impl Utility { #[cfg(test)] mod test { - use ruma::{user_id, DeviceKeyAlgorithm, DeviceKeyId}; + use ruma::{device_id, user_id, DeviceKeyAlgorithm, DeviceKeyId}; use serde_json::json; use super::Utility; @@ -129,8 +129,8 @@ mod test { utility .verify_json( - &user_id!("@example:localhost"), - &DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, "GBEWHQOYGS".into()), + user_id!("@example:localhost"), + &DeviceKeyId::from_parts(DeviceKeyAlgorithm::Ed25519, device_id!("GBEWHQOYGS")), signing_key, &mut device_keys, ) diff --git a/crates/matrix-sdk-crypto/src/requests.rs b/crates/matrix-sdk-crypto/src/requests.rs index 0507a391e1f..ad778b5f025 100644 --- a/crates/matrix-sdk-crypto/src/requests.rs +++ b/crates/matrix-sdk-crypto/src/requests.rs @@ -34,7 +34,7 @@ use ruma::{ events::{AnyMessageEventContent, AnyToDeviceEventContent, EventContent, EventType}, serde::Raw, to_device::DeviceIdOrAllDevices, - DeviceIdBox, RoomId, UserId, + DeviceId, RoomId, UserId, }; use serde::{Deserialize, Serialize}; @@ -56,7 +56,8 @@ pub struct ToDeviceRequest { /// The content's type for this field will be updated in a future /// release, until then you can create a value using /// `serde_json::value::to_raw_value`. - pub messages: BTreeMap>>, + pub messages: + BTreeMap, BTreeMap>>, } impl ToDeviceRequest { @@ -81,7 +82,7 @@ impl ToDeviceRequest { pub(crate) fn new_for_recipients( recipient: &UserId, - recipient_devices: Vec, + recipient_devices: Vec>, content: AnyToDeviceEventContent, txn_id: Uuid, ) -> Self { @@ -113,7 +114,7 @@ impl ToDeviceRequest { let raw_content = Raw::new(&content).expect("Failed to serialize to-device event"); let user_messages = iter::once((recipient_device.into(), raw_content)).collect(); - let messages = iter::once((recipient.clone(), user_messages)).collect(); + let messages = iter::once((recipient.to_owned(), user_messages)).collect(); ToDeviceRequest { event_type, txn_id, messages } } @@ -160,7 +161,7 @@ pub struct KeysQueryRequest { /// The keys to be downloaded. An empty list indicates all devices for /// the corresponding user. - pub device_keys: BTreeMap>, + pub device_keys: BTreeMap, Vec>>, /// If the client is fetching keys as a result of a device update /// received in a sync request, this should be the 'since' token of that @@ -171,7 +172,7 @@ pub struct KeysQueryRequest { } impl KeysQueryRequest { - pub(crate) fn new(device_keys: BTreeMap>) -> Self { + pub(crate) fn new(device_keys: BTreeMap, Vec>>) -> Self { Self { timeout: None, device_keys, token: None } } } @@ -360,7 +361,7 @@ impl OutgoingRequest { #[derive(Clone, Debug)] pub struct RoomMessageRequest { /// The room to send the event to. - pub room_id: RoomId, + pub room_id: Box, /// The transaction ID for this event. /// @@ -380,7 +381,7 @@ pub struct KeysBackupRequest { pub version: String, /// The map from room id to a backed up room key that we're going to upload /// to the server. - pub rooms: BTreeMap, + pub rooms: BTreeMap, RoomKeyBackup>, } /// An enum over the different outgoing verification based requests. diff --git a/crates/matrix-sdk-crypto/src/session_manager/group_sessions.rs b/crates/matrix-sdk-crypto/src/session_manager/group_sessions.rs index c6620008c9c..2960be0ff64 100644 --- a/crates/matrix-sdk-crypto/src/session_manager/group_sessions.rs +++ b/crates/matrix-sdk-crypto/src/session_manager/group_sessions.rs @@ -14,6 +14,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap, HashSet}, + ops::Deref, sync::Arc, }; @@ -27,7 +28,7 @@ use ruma::{ }, serde::Raw, to_device::DeviceIdOrAllDevices, - DeviceId, DeviceIdBox, RoomId, UserId, + DeviceId, RoomId, UserId, }; use serde_json::Value; use tracing::{debug, info, trace}; @@ -42,7 +43,7 @@ use crate::{ #[derive(Clone, Debug)] pub(crate) struct GroupSessionCache { store: Store, - sessions: Arc>, + sessions: Arc, OutboundGroupSession>>, /// A map from the request id to the group session that the request belongs /// to. Used to mark requests belonging to the session as shared. sessions_being_shared: Arc>, @@ -73,7 +74,7 @@ impl GroupSessionCache { self.sessions_being_shared.insert(request_id, s.clone()); } - self.sessions.insert(room_id.clone(), s.clone()); + self.sessions.insert(room_id.to_owned(), s.clone()); Ok(Some(s)) } else { @@ -222,7 +223,7 @@ impl GroupSessionManager { ) -> OlmResult<( Uuid, ToDeviceRequest, - BTreeMap>, + BTreeMap, BTreeMap, ShareInfo>>, Vec, )> { let mut messages = BTreeMap::new(); @@ -312,9 +313,9 @@ impl GroupSessionManager { users: impl Iterator, history_visibility: HistoryVisibility, outbound: &OutboundGroupSession, - ) -> OlmResult<(bool, HashMap>)> { + ) -> OlmResult<(bool, HashMap, Vec>)> { let users: HashSet<&UserId> = users.collect(); - let mut devices: HashMap> = HashMap::new(); + let mut devices: HashMap, Vec> = HashMap::new(); trace!( users = ?users, @@ -324,10 +325,11 @@ impl GroupSessionManager { "Calculating group session recipients" ); - let users_shared_with: HashSet = + let users_shared_with: HashSet> = outbound.shared_with_set.iter().map(|k| k.key().clone()).collect(); - let users_shared_with: HashSet<&UserId> = users_shared_with.iter().collect(); + let users_shared_with: HashSet<&UserId> = + users_shared_with.iter().map(Deref::deref).collect(); // A user left if a user is missing from the set of users that should // get the session but is in the set of users that received the session. @@ -360,7 +362,7 @@ impl GroupSessionManager { if let Some(shared) = outbound.shared_with_set.get(user_id) { // Devices that received this session - let shared: HashSet = + let shared: HashSet> = shared.iter().map(|d| d.key().clone()).collect(); let shared: HashSet<&DeviceId> = shared.iter().map(|d| d.as_ref()).collect(); @@ -380,7 +382,10 @@ impl GroupSessionManager { }; } - devices.entry(user_id.clone()).or_insert_with(Vec::new).extend(non_blacklisted_devices); + devices + .entry(user_id.to_owned()) + .or_insert_with(Vec::new) + .extend(non_blacklisted_devices); } trace!( @@ -572,6 +577,8 @@ impl GroupSessionManager { #[cfg(test)] mod test { + use std::ops::Deref; + use matrix_sdk_common::uuid::Uuid; use matrix_sdk_test::response_from_file; use ruma::{ @@ -579,18 +586,18 @@ mod test { client::r0::keys::{claim_keys, get_keys}, IncomingResponse, }, - room_id, user_id, DeviceIdBox, UserId, + device_id, room_id, user_id, DeviceId, UserId, }; use serde_json::Value; use crate::{EncryptionSettings, OlmMachine}; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> DeviceIdBox { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } fn keys_query_response() -> get_keys::Response { @@ -614,7 +621,7 @@ mod test { let keys_claim = keys_claim_response(); let uuid = Uuid::new_v4(); - let machine = OlmMachine::new(&alice_id(), &alice_device_id()); + let machine = OlmMachine::new(alice_id(), alice_device_id()); machine.mark_request_as_sent(&uuid, &keys_query).await.unwrap(); machine.mark_request_as_sent(&uuid, &keys_claim).await.unwrap(); @@ -628,10 +635,10 @@ mod test { let room_id = room_id!("!test:localhost"); let keys_claim = keys_claim_response(); - let users: Vec<_> = keys_claim.one_time_keys.keys().collect(); + let users = keys_claim.one_time_keys.keys().map(Deref::deref); let requests = machine - .share_group_session(&room_id, users.clone().into_iter(), EncryptionSettings::default()) + .share_group_session(room_id, users, EncryptionSettings::default()) .await .unwrap(); diff --git a/crates/matrix-sdk-crypto/src/session_manager/sessions.rs b/crates/matrix-sdk-crypto/src/session_manager/sessions.rs index 21d6dd28ec6..cd3ad82a47a 100644 --- a/crates/matrix-sdk-crypto/src/session_manager/sessions.rs +++ b/crates/matrix-sdk-crypto/src/session_manager/sessions.rs @@ -26,7 +26,7 @@ use ruma::{ }, assign, events::{dummy::ToDeviceDummyEventContent, AnyToDeviceEventContent}, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, EventEncryptionAlgorithm, UserId, + DeviceId, DeviceKeyAlgorithm, EventEncryptionAlgorithm, UserId, }; use tracing::{debug, error, info, warn}; @@ -47,8 +47,8 @@ pub(crate) struct SessionManager { /// Submodules can insert user/device pairs into this map and the /// user/device paris will be added to the list of users when /// [`get_missing_sessions`](#method.get_missing_sessions) is called. - users_for_key_claim: Arc>>, - wedged_devices: Arc>>, + users_for_key_claim: Arc, DashSet>>>, + wedged_devices: Arc, DashSet>>>, key_request_machine: GossipMachine, outgoing_to_device_requests: Arc>, } @@ -59,7 +59,7 @@ impl SessionManager { pub fn new( account: Account, - users_for_key_claim: Arc>>, + users_for_key_claim: Arc, DashSet>>>, key_request_machine: GossipMachine, store: Store, ) -> Self { @@ -97,7 +97,7 @@ impl SessionManager { if session.creation_time.elapsed() > Self::UNWEDGING_INTERVAL { self.users_for_key_claim - .entry(device.user_id().clone()) + .entry(device.user_id().to_owned()) .or_insert_with(DashSet::new) .insert(device.device_id().into()); self.wedged_devices @@ -333,14 +333,14 @@ impl SessionManager { #[cfg(test)] mod test { - use std::{collections::BTreeMap, sync::Arc}; + use std::{collections::BTreeMap, iter, sync::Arc}; use dashmap::DashMap; use matrix_sdk_common::locks::Mutex; use matrix_sdk_test::async_test; use ruma::{ - api::client::r0::keys::claim_keys::Response as KeyClaimResponse, user_id, DeviceIdBox, - UserId, + api::client::r0::keys::claim_keys::Response as KeyClaimResponse, device_id, user_id, + DeviceId, UserId, }; use super::SessionManager; @@ -353,31 +353,31 @@ mod test { verification::VerificationMachine, }; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } - fn device_id() -> DeviceIdBox { - "DEVICEID".into() + fn device_id() -> &'static DeviceId { + device_id!("DEVICEID") } fn bob_account() -> ReadOnlyAccount { - ReadOnlyAccount::new(&user_id!("@bob:localhost"), "BOBDEVICE".into()) + ReadOnlyAccount::new(user_id!("@bob:localhost"), device_id!("BOBDEVICE")) } async fn session_manager() -> SessionManager { - let user_id = user_id(); + let user_id = user_id().to_owned(); let device_id = device_id(); let users_for_key_claim = Arc::new(DashMap::new()); - let account = ReadOnlyAccount::new(&user_id, &device_id); + let account = ReadOnlyAccount::new(&user_id, device_id); let store: Arc = Arc::new(MemoryStore::new()); store.save_account(account.clone()).await.unwrap(); let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(user_id.clone()))); let verification = VerificationMachine::new(account.clone(), identity.clone(), store.clone()); - let user_id = Arc::new(user_id); + let user_id: Arc = user_id.into(); let device_id = device_id.into(); let store = Store::new(user_id.clone(), identity, store, verification); @@ -406,11 +406,8 @@ mod test { manager.store.save_devices(&[bob_device]).await.unwrap(); - let (_, request) = manager - .get_missing_sessions(&mut [bob.user_id().clone()].iter()) - .await - .unwrap() - .unwrap(); + let (_, request) = + manager.get_missing_sessions(iter::once(bob.user_id())).await.unwrap().unwrap(); assert!(request.one_time_keys.contains_key(bob.user_id())); @@ -420,19 +417,15 @@ mod test { let mut one_time_keys = BTreeMap::new(); one_time_keys - .entry(bob.user_id().clone()) + .entry(bob.user_id().to_owned()) .or_insert_with(BTreeMap::new) - .insert(bob.device_id().into(), one_time); + .insert(bob.device_id().to_owned(), one_time); let response = KeyClaimResponse::new(one_time_keys); manager.receive_keys_claim_response(&response).await.unwrap(); - assert!(manager - .get_missing_sessions(&mut [bob.user_id().clone()].iter()) - .await - .unwrap() - .is_none()); + assert!(manager.get_missing_sessions(iter::once(bob.user_id())).await.unwrap().is_none()); } // This test doesn't run on macos because we're modifying the session @@ -453,11 +446,7 @@ mod test { manager.store.save_devices(&[bob_device.clone()]).await.unwrap(); manager.store.save_sessions(&[session]).await.unwrap(); - assert!(manager - .get_missing_sessions(&mut [bob.user_id().clone()].iter()) - .await - .unwrap() - .is_none()); + assert!(manager.get_missing_sessions(iter::once(bob.user_id())).await.unwrap().is_none()); let curve_key = bob_device.get_key(DeviceKeyAlgorithm::Curve25519).unwrap(); @@ -467,11 +456,8 @@ mod test { assert!(manager.is_device_wedged(&bob_device)); assert!(manager.users_for_key_claim.contains_key(bob.user_id())); - let (_, request) = manager - .get_missing_sessions(&mut [bob.user_id().clone()].iter()) - .await - .unwrap() - .unwrap(); + let (_, request) = + manager.get_missing_sessions(iter::once(bob.user_id())).await.unwrap().unwrap(); assert!(request.one_time_keys.contains_key(bob.user_id())); @@ -481,9 +467,9 @@ mod test { let mut one_time_keys = BTreeMap::new(); one_time_keys - .entry(bob.user_id().clone()) + .entry(bob.user_id().to_owned()) .or_insert_with(BTreeMap::new) - .insert(bob.device_id().into(), one_time); + .insert(bob.device_id().to_owned(), one_time); let response = KeyClaimResponse::new(one_time_keys); @@ -492,11 +478,7 @@ mod test { manager.receive_keys_claim_response(&response).await.unwrap(); assert!(!manager.is_device_wedged(&bob_device)); - assert!(manager - .get_missing_sessions(&mut [bob.user_id().clone()].iter()) - .await - .unwrap() - .is_none()); + assert!(manager.get_missing_sessions(iter::once(bob.user_id())).await.unwrap().is_none()); assert!(!manager.outgoing_to_device_requests.is_empty()) } } diff --git a/crates/matrix-sdk-crypto/src/store/caches.rs b/crates/matrix-sdk-crypto/src/store/caches.rs index 3dc565dd3e7..971b78eac27 100644 --- a/crates/matrix-sdk-crypto/src/store/caches.rs +++ b/crates/matrix-sdk-crypto/src/store/caches.rs @@ -21,7 +21,7 @@ use std::{collections::HashMap, sync::Arc}; use dashmap::DashMap; use matrix_sdk_common::locks::Mutex; -use ruma::{DeviceId, DeviceIdBox, RoomId, UserId}; +use ruma::{DeviceId, RoomId, UserId}; use crate::{ identities::ReadOnlyDevice, @@ -75,7 +75,7 @@ impl SessionStore { /// In-memory store that holds inbound group sessions. pub struct GroupSessionStore { #[allow(clippy::type_complexity)] - entries: Arc>>>, + entries: Arc, HashMap>>>, } impl GroupSessionStore { @@ -90,7 +90,7 @@ impl GroupSessionStore { /// already in the store. pub fn add(&self, session: InboundGroupSession) -> bool { self.entries - .entry((&*session.room_id).clone()) + .entry((&*session.room_id).to_owned()) .or_insert_with(HashMap::new) .entry(session.sender_key.to_string()) .or_insert_with(HashMap::new) @@ -139,7 +139,8 @@ impl GroupSessionStore { /// In-memory store holding the devices of users. #[derive(Clone, Debug, Default)] pub struct DeviceStore { - entries: Arc, ReadOnlyDevice>>>, + #[allow(clippy::type_complexity)] + entries: Arc, DashMap, ReadOnlyDevice>>>, } impl DeviceStore { @@ -174,9 +175,9 @@ impl DeviceStore { } /// Get a read-only view over all devices of the given user. - pub fn user_devices(&self, user_id: &UserId) -> HashMap { + pub fn user_devices(&self, user_id: &UserId) -> HashMap, ReadOnlyDevice> { self.entries - .entry(user_id.clone()) + .entry(user_id.to_owned()) .or_insert_with(DashMap::new) .iter() .map(|i| (i.key().to_owned(), i.value().clone())) @@ -231,8 +232,7 @@ mod test { let (account, _) = get_account_and_session().await; let room_id = room_id!("!test:localhost"); - let (outbound, _) = - account.create_group_session_pair_with_defaults(&room_id).await.unwrap(); + let (outbound, _) = account.create_group_session_pair_with_defaults(room_id).await.unwrap(); assert_eq!(0, outbound.message_index().await); assert!(!outbound.shared()); @@ -242,7 +242,7 @@ mod test { let inbound = InboundGroupSession::new( "test_key", "test_key", - &room_id, + room_id, outbound.session_key().await, None, ) @@ -251,7 +251,7 @@ mod test { let store = GroupSessionStore::new(); store.add(inbound.clone()); - let loaded_session = store.get(&room_id, "test_key", outbound.session_id()).unwrap(); + let loaded_session = store.get(room_id, "test_key", outbound.session_id()).unwrap(); assert_eq!(inbound, loaded_session); } diff --git a/crates/matrix-sdk-crypto/src/store/memorystore.rs b/crates/matrix-sdk-crypto/src/store/memorystore.rs index a05e40f16a3..5a820dfc49d 100644 --- a/crates/matrix-sdk-crypto/src/store/memorystore.rs +++ b/crates/matrix-sdk-crypto/src/store/memorystore.rs @@ -19,7 +19,7 @@ use std::{ use dashmap::{DashMap, DashSet}; use matrix_sdk_common::{async_trait, locks::Mutex, uuid::Uuid}; -use ruma::{DeviceId, DeviceIdBox, RoomId, UserId}; +use ruma::{DeviceId, RoomId, UserId}; use super::{ caches::{DeviceStore, GroupSessionStore, SessionStore}, @@ -46,11 +46,11 @@ fn encode_key_info(info: &SecretInfo) -> String { pub struct MemoryStore { sessions: SessionStore, inbound_group_sessions: GroupSessionStore, - tracked_users: Arc>, - users_for_key_query: Arc>, + tracked_users: Arc>>, + users_for_key_query: Arc>>, olm_hashes: Arc>>, devices: DeviceStore, - identities: Arc>, + identities: Arc, ReadOnlyUserIdentities>>, outgoing_key_requests: Arc>, key_requests_by_info: Arc>, } @@ -207,11 +207,11 @@ impl CryptoStore for MemoryStore { !self.users_for_key_query.is_empty() } - fn users_for_key_query(&self) -> HashSet { + fn users_for_key_query(&self) -> HashSet> { self.users_for_key_query.iter().map(|u| u.clone()).collect() } - fn tracked_users(&self) -> HashSet { + fn tracked_users(&self) -> HashSet> { self.tracked_users.iter().map(|u| u.to_owned()).collect() } @@ -229,12 +229,12 @@ impl CryptoStore for MemoryStore { // The counter would top out at 2 since there won't be a race between 3 // different key queries syncs. if dirty { - self.users_for_key_query.insert(user.clone()); + self.users_for_key_query.insert(user.to_owned()); } else { self.users_for_key_query.remove(user); } - Ok(self.tracked_users.insert(user.clone())) + Ok(self.tracked_users.insert(user.to_owned())) } async fn get_device( @@ -248,7 +248,7 @@ impl CryptoStore for MemoryStore { async fn get_user_devices( &self, user_id: &UserId, - ) -> Result> { + ) -> Result, ReadOnlyDevice>> { Ok(self.devices.user_devices(user_id)) } @@ -339,12 +339,11 @@ mod test { let (account, _) = get_account_and_session().await; let room_id = room_id!("!test:localhost"); - let (outbound, _) = - account.create_group_session_pair_with_defaults(&room_id).await.unwrap(); + let (outbound, _) = account.create_group_session_pair_with_defaults(room_id).await.unwrap(); let inbound = InboundGroupSession::new( "test_key", "test_key", - &room_id, + room_id, outbound.session_key().await, None, ) @@ -354,7 +353,7 @@ mod test { let _ = store.save_inbound_group_sessions(vec![inbound.clone()]).await; let loaded_session = store - .get_inbound_group_session(&room_id, "test_key", outbound.session_id()) + .get_inbound_group_session(room_id, "test_key", outbound.session_id()) .await .unwrap() .unwrap(); diff --git a/crates/matrix-sdk-crypto/src/store/mod.rs b/crates/matrix-sdk-crypto/src/store/mod.rs index 0b795b5294c..f91d7067f31 100644 --- a/crates/matrix-sdk-crypto/src/store/mod.rs +++ b/crates/matrix-sdk-crypto/src/store/mod.rs @@ -26,9 +26,9 @@ //! # OlmMachine, //! # store::MemoryStore, //! # }; -//! # use ruma::{user_id, DeviceIdBox}; +//! # use ruma::{user_id, DeviceId}; //! # let user_id = user_id!("@example:localhost"); -//! # let device_id: DeviceIdBox = "TEST".into(); +//! # let device_id: Box = device_id!("TEST"); //! let store = Box::new(MemoryStore::new()); //! //! let machine = OlmMachine::new_with_store(user_id, device_id, store); @@ -58,7 +58,7 @@ use olm_rs::errors::{OlmAccountError, OlmGroupSessionError, OlmSessionError}; pub use pickle_key::{EncryptedPickleKey, PickleKey}; use ruma::{ events::secret::request::SecretName, identifiers::Error as IdentifierValidationError, DeviceId, - DeviceIdBox, DeviceKeyAlgorithm, RoomId, UserId, + DeviceKeyAlgorithm, RoomId, UserId, }; use serde_json::Error as SerdeError; use thiserror::Error; @@ -309,7 +309,7 @@ impl Store { pub async fn get_readonly_devices_filtered( &self, user_id: &UserId, - ) -> Result> { + ) -> Result, ReadOnlyDevice>> { self.inner.get_user_devices(user_id).await.map(|mut d| { if user_id == self.user_id() { d.remove(self.device_id()); @@ -324,7 +324,7 @@ impl Store { pub async fn get_readonly_devices_unfiltered( &self, user_id: &UserId, - ) -> Result> { + ) -> Result, ReadOnlyDevice>> { self.inner.get_user_devices(user_id).await } @@ -648,10 +648,10 @@ pub trait CryptoStore: AsyncTraitDeps { /// Set of users that we need to query keys for. This is a subset of /// the tracked users. - fn users_for_key_query(&self) -> HashSet; + fn users_for_key_query(&self) -> HashSet>; /// Get all tracked users we know about. - fn tracked_users(&self) -> HashSet; + fn tracked_users(&self) -> HashSet>; /// Add an user for tracking. /// @@ -685,7 +685,7 @@ pub trait CryptoStore: AsyncTraitDeps { async fn get_user_devices( &self, user_id: &UserId, - ) -> Result>; + ) -> Result, ReadOnlyDevice>>; /// Get the user identity that is attached to the given user id. /// diff --git a/crates/matrix-sdk-crypto/src/store/sled.rs b/crates/matrix-sdk-crypto/src/store/sled.rs index 051f8096240..f29766fc617 100644 --- a/crates/matrix-sdk-crypto/src/store/sled.rs +++ b/crates/matrix-sdk-crypto/src/store/sled.rs @@ -25,7 +25,7 @@ use olm_rs::{account::IdentityKeys, PicklingMode}; use ruma::{ encryption::DeviceKeys, events::{room_key_request::RequestedKeyInfo, secret::request::SecretName}, - DeviceId, DeviceIdBox, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UserId, + DeviceId, DeviceKeyId, EventEncryptionAlgorithm, RoomId, UserId, }; use serde::{Deserialize, Serialize}; pub use sled::Error; @@ -154,8 +154,8 @@ pub struct SledStore { pickle_key: Arc, session_cache: SessionStore, - tracked_users_cache: Arc>, - users_for_key_query_cache: Arc>, + tracked_users_cache: Arc>>, + users_for_key_query_cache: Arc>>, account: Tree, private_identity: Tree, @@ -274,11 +274,11 @@ impl SledStore { if version <= 1 { #[derive(Serialize, Deserialize)] pub struct OldReadOnlyDevice { - user_id: UserId, - device_id: DeviceIdBox, + user_id: Box, + device_id: Box, algorithms: Vec, - keys: BTreeMap, - signatures: BTreeMap>, + keys: BTreeMap, String>, + signatures: BTreeMap, BTreeMap, String>>, display_name: Option, deleted: bool, trust_state: LocalTrust, @@ -424,10 +424,10 @@ impl SledStore { async fn load_tracked_users(&self) -> Result<()> { for value in self.tracked_users.iter() { let (user, dirty) = value?; - let user = UserId::try_from(String::from_utf8_lossy(&user).to_string())?; + let user = Box::::try_from(String::from_utf8_lossy(&user).to_string())?; let dirty = dirty.get(0).map(|d| *d == 1).unwrap_or(true); - self.tracked_users_cache.insert(user.clone()); + self.tracked_users_cache.insert(user.to_owned()); if dirty { self.users_for_key_query_cache.insert(user); @@ -507,7 +507,7 @@ impl SledStore { let room_id = session.room_id(); let pickle = session.pickle(self.get_pickle_mode()).await; - outbound_session_changes.insert(room_id.clone(), pickle); + outbound_session_changes.insert(room_id.to_owned(), pickle); } let identity_changes = changes.identities; @@ -611,7 +611,7 @@ impl SledStore { for (key, session) in &outbound_session_changes { outbound_sessions.insert( - key.encode(), + (&**key).encode(), serde_json::to_vec(&session) .map_err(ConflictableTransactionError::Abort)?, )?; @@ -853,19 +853,19 @@ impl CryptoStore for SledStore { !self.users_for_key_query_cache.is_empty() } - fn users_for_key_query(&self) -> HashSet { + fn users_for_key_query(&self) -> HashSet> { self.users_for_key_query_cache.iter().map(|u| u.clone()).collect() } - fn tracked_users(&self) -> HashSet { + fn tracked_users(&self) -> HashSet> { self.tracked_users_cache.to_owned().iter().map(|u| u.clone()).collect() } async fn update_tracked_user(&self, user: &UserId, dirty: bool) -> Result { - let already_added = self.tracked_users_cache.insert(user.clone()); + let already_added = self.tracked_users_cache.insert(user.to_owned()); if dirty { - self.users_for_key_query_cache.insert(user.clone()); + self.users_for_key_query_cache.insert(user.to_owned()); } else { self.users_for_key_query_cache.remove(user); } @@ -887,7 +887,7 @@ impl CryptoStore for SledStore { async fn get_user_devices( &self, user_id: &UserId, - ) -> Result> { + ) -> Result, ReadOnlyDevice>> { self.devices .scan_prefix(user_id.encode()) .map(|d| serde_json::from_slice(&d?.1).map_err(CryptoStoreError::Serialization)) @@ -1015,8 +1015,8 @@ mod test { use matrix_sdk_test::async_test; use olm_rs::outbound_group_session::OlmOutboundGroupSession; use ruma::{ - encryption::SignedKey, events::room_key_request::RequestedKeyInfo, room_id, user_id, - DeviceId, EventEncryptionAlgorithm, UserId, + device_id, encryption::SignedKey, events::room_key_request::RequestedKeyInfo, room_id, + user_id, DeviceId, EventEncryptionAlgorithm, UserId, }; use tempfile::tempdir; @@ -1034,20 +1034,20 @@ mod test { store::{Changes, DeviceChanges, IdentityChanges}, }; - fn alice_id() -> UserId { + fn alice_id() -> &'static UserId { user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "ALICEDEVICE".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("ALICEDEVICE") } - fn bob_id() -> UserId { + fn bob_id() -> &'static UserId { user_id!("@bob:example.org") } - fn bob_device_id() -> Box { - "BOBDEVICE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVICE") } async fn get_store(passphrase: Option<&str>) -> (SledStore, tempfile::TempDir) { @@ -1069,12 +1069,12 @@ mod test { } fn get_account() -> ReadOnlyAccount { - ReadOnlyAccount::new(&alice_id(), &alice_device_id()) + ReadOnlyAccount::new(alice_id(), alice_device_id()) } async fn get_account_and_session() -> (ReadOnlyAccount, Session) { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); bob.generate_one_time_keys_helper(1).await; let one_time_key = @@ -1206,7 +1206,7 @@ mod test { let session = InboundGroupSession::new( identity_keys.curve25519(), identity_keys.ed25519(), - &room_id!("!test:localhost"), + room_id!("!test:localhost"), GroupSessionKey(outbound_session.session_key()), None, ) @@ -1226,7 +1226,7 @@ mod test { let session = InboundGroupSession::new( identity_keys.curve25519(), identity_keys.ed25519(), - &room_id!("!test:localhost"), + room_id!("!test:localhost"), GroupSessionKey(outbound_session.session_key()), None, ) @@ -1360,11 +1360,11 @@ mod test { let tmpdir_path = dir.path().to_str().unwrap(); let user_id = user_id!("@example:localhost"); - let device_id: &DeviceId = "WSKKLTJZCL".into(); + let device_id: &DeviceId = device_id!("WSKKLTJZCL"); let store = SledStore::open_with_passphrase(tmpdir_path, None).expect("Can't create store"); - let account = ReadOnlyAccount::new(&user_id, device_id); + let account = ReadOnlyAccount::new(user_id, device_id); store.save_account(account.clone()).await.expect("Can't save account"); @@ -1421,7 +1421,7 @@ mod test { }; store.save_changes(changes).await.unwrap(); - let loaded_user = store.get_user_identity(&user_id).await.unwrap().unwrap(); + let loaded_user = store.get_user_identity(user_id).await.unwrap().unwrap(); assert!(loaded_user.own().unwrap().is_verified()) } @@ -1429,7 +1429,7 @@ mod test { async fn private_identity_saving() { let (_, store, _dir) = get_loaded_store().await; assert!(store.load_identity().await.unwrap().is_none()); - let identity = PrivateCrossSigningIdentity::new(alice_id()).await; + let identity = PrivateCrossSigningIdentity::new(alice_id().to_owned()).await; let changes = Changes { private_identity: Some(identity.clone()), ..Default::default() }; @@ -1460,7 +1460,7 @@ mod test { let id = Uuid::new_v4(); let info: SecretInfo = RequestedKeyInfo::new( EventEncryptionAlgorithm::MegolmV1AesSha2, - room_id!("!test:localhost"), + room_id!("!test:localhost").to_owned(), "test_sender_key".to_string(), "test_session_id".to_string(), ) diff --git a/crates/matrix-sdk-crypto/src/verification/cache.rs b/crates/matrix-sdk-crypto/src/verification/cache.rs index 596b55a57d3..712ac879a08 100644 --- a/crates/matrix-sdk-crypto/src/verification/cache.rs +++ b/crates/matrix-sdk-crypto/src/verification/cache.rs @@ -26,7 +26,7 @@ use crate::{OutgoingRequest, OutgoingVerificationRequest, RoomMessageRequest, To #[derive(Clone, Debug)] pub struct VerificationCache { - verification: Arc>>, + verification: Arc, DashMap>>, outgoing_requests: Arc>, } diff --git a/crates/matrix-sdk-crypto/src/verification/event_enums.rs b/crates/matrix-sdk-crypto/src/verification/event_enums.rs index 0d8e324ae67..721d9f9ab8c 100644 --- a/crates/matrix-sdk-crypto/src/verification/event_enums.rs +++ b/crates/matrix-sdk-crypto/src/verification/event_enums.rs @@ -188,26 +188,26 @@ impl TryFrom<&AnyMessageEvent> for FlowId { | AnyMessageEvent::RoomRedaction(_) | AnyMessageEvent::Sticker(_) => Err(()), AnyMessageEvent::KeyVerificationReady(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::RoomMessage(e) => Ok(FlowId::from((&e.room_id, &e.event_id))), + AnyMessageEvent::RoomMessage(e) => Ok(FlowId::from((&*e.room_id, &*e.event_id))), AnyMessageEvent::KeyVerificationStart(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } AnyMessageEvent::KeyVerificationCancel(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } AnyMessageEvent::KeyVerificationAccept(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } AnyMessageEvent::KeyVerificationKey(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } AnyMessageEvent::KeyVerificationMac(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } AnyMessageEvent::KeyVerificationDone(e) => { - Ok(FlowId::from((&e.room_id, &e.content.relates_to.event_id))) + Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } _ => Err(()), } @@ -589,7 +589,7 @@ impl CancelContent<'_> { #[derive(Clone, Debug)] pub enum OwnedStartContent { ToDevice(ToDeviceKeyVerificationStartEventContent), - Room(RoomId, KeyVerificationStartEventContent), + Room(Box, KeyVerificationStartEventContent), } impl OwnedStartContent { @@ -631,8 +631,8 @@ impl OwnedStartContent { } } -impl From<(RoomId, KeyVerificationStartEventContent)> for OwnedStartContent { - fn from(tuple: (RoomId, KeyVerificationStartEventContent)) -> Self { +impl From<(Box, KeyVerificationStartEventContent)> for OwnedStartContent { + fn from(tuple: (Box, KeyVerificationStartEventContent)) -> Self { Self::Room(tuple.0, tuple.1) } } @@ -646,7 +646,7 @@ impl From for OwnedStartContent { #[derive(Clone, Debug)] pub enum OwnedAcceptContent { ToDevice(ToDeviceKeyVerificationAcceptEventContent), - Room(RoomId, KeyVerificationAcceptEventContent), + Room(Box, KeyVerificationAcceptEventContent), } impl From for OwnedAcceptContent { @@ -655,8 +655,8 @@ impl From for OwnedAcceptContent { } } -impl From<(RoomId, KeyVerificationAcceptEventContent)> for OwnedAcceptContent { - fn from(content: (RoomId, KeyVerificationAcceptEventContent)) -> Self { +impl From<(Box, KeyVerificationAcceptEventContent)> for OwnedAcceptContent { + fn from(content: (Box, KeyVerificationAcceptEventContent)) -> Self { Self::Room(content.0, content.1) } } @@ -672,7 +672,7 @@ impl OwnedAcceptContent { #[derive(Clone, Debug)] pub enum OutgoingContent { - Room(RoomId, AnyMessageEventContent), + Room(Box, AnyMessageEventContent), ToDevice(AnyToDeviceEventContent), } @@ -695,8 +695,8 @@ impl From for OutgoingContent { } } -impl From<(RoomId, AnyMessageEventContent)> for OutgoingContent { - fn from(content: (RoomId, AnyMessageEventContent)) -> Self { +impl From<(Box, AnyMessageEventContent)> for OutgoingContent { + fn from(content: (Box, AnyMessageEventContent)) -> Self { OutgoingContent::Room(content.0, content.1) } } diff --git a/crates/matrix-sdk-crypto/src/verification/machine.rs b/crates/matrix-sdk-crypto/src/verification/machine.rs index 0d22659fdfa..6aa91f100d4 100644 --- a/crates/matrix-sdk-crypto/src/verification/machine.rs +++ b/crates/matrix-sdk-crypto/src/verification/machine.rs @@ -25,7 +25,7 @@ use ruma::{ ToDeviceEvent, }, serde::Raw, - DeviceId, DeviceIdBox, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, + DeviceId, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, }; use tracing::{info, trace, warn}; @@ -49,7 +49,7 @@ pub struct VerificationMachine { pub(crate) private_identity: Arc>, pub(crate) store: VerificationStore, verifications: VerificationCache, - requests: Arc>>, + requests: Arc, DashMap>>, } impl VerificationMachine { @@ -77,7 +77,7 @@ impl VerificationMachine { pub(crate) async fn request_to_device_verification( &self, user_id: &UserId, - recipient_devices: Vec, + recipient_devices: Vec>, methods: Option>, ) -> (VerificationRequest, OutgoingVerificationRequest) { let flow_id = FlowId::from(Uuid::new_v4().to_string()); @@ -523,7 +523,7 @@ mod test { }; use matrix_sdk_common::locks::Mutex; - use ruma::{DeviceId, UserId}; + use ruma::{device_id, user_id, DeviceId, UserId}; use super::{Sas, VerificationMachine}; use crate::{ @@ -537,25 +537,25 @@ mod test { ReadOnlyAccount, ReadOnlyDevice, }; - fn alice_id() -> UserId { - UserId::try_from("@alice:example.org").unwrap() + fn alice_id() -> &'static UserId { + user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn bob_id() -> UserId { - UserId::try_from("@bob:example.org").unwrap() + fn bob_id() -> &'static UserId { + user_id!("@bob:example.org") } - fn bob_device_id() -> Box { - "BOBDEVCIE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVCIE") } async fn setup_verification_machine() -> (VerificationMachine, Sas) { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let store = MemoryStore::new(); let bob_store = MemoryStore::new(); @@ -567,10 +567,11 @@ mod test { let bob_store = VerificationStore { account: bob, inner: Arc::new(bob_store) }; - let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id()))); + let identity = + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id().to_owned()))); let machine = VerificationMachine::new(alice, identity, Arc::new(store)); let (bob_sas, start_content) = Sas::start( - PrivateCrossSigningIdentity::empty(bob_id()), + PrivateCrossSigningIdentity::empty(bob_id().to_owned()), alice_device, bob_store, None, @@ -590,8 +591,9 @@ mod test { #[test] fn create() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); - let identity = Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id()))); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); + let identity = + Arc::new(Mutex::new(PrivateCrossSigningIdentity::empty(alice_id().to_owned()))); let store = MemoryStore::new(); let _ = VerificationMachine::new(alice, identity, Arc::new(store)); } diff --git a/crates/matrix-sdk-crypto/src/verification/mod.rs b/crates/matrix-sdk-crypto/src/verification/mod.rs index f006c983678..0d93347ed97 100644 --- a/crates/matrix-sdk-crypto/src/verification/mod.rs +++ b/crates/matrix-sdk-crypto/src/verification/mod.rs @@ -44,7 +44,7 @@ use ruma::{ }, AnyMessageEventContent, AnyToDeviceEventContent, }, - DeviceId, DeviceIdBox, DeviceKeyId, EventId, RoomId, UserId, + DeviceId, DeviceKeyId, EventId, RoomId, UserId, }; pub use sas::{AcceptSettings, Sas}; use tracing::{error, info, trace, warn}; @@ -104,7 +104,7 @@ impl VerificationStore { pub async fn get_user_devices( &self, user_id: &UserId, - ) -> Result, CryptoStoreError> { + ) -> Result, ReadOnlyDevice>, CryptoStoreError> { self.inner.get_user_devices(user_id).await } @@ -118,7 +118,8 @@ impl VerificationStore { /// Get the signatures that have signed our own device. pub async fn device_signatures( &self, - ) -> Result>>, CryptoStoreError> { + ) -> Result, BTreeMap, String>>>, CryptoStoreError> + { Ok(self .inner .get_device(self.account.user_id(), self.account.device_id()) @@ -351,7 +352,7 @@ impl Cancelled { #[derive(Clone, Debug, Hash, PartialEq, PartialOrd)] pub enum FlowId { ToDevice(String), - InRoom(RoomId, EventId), + InRoom(Box, Box), } impl FlowId { @@ -377,8 +378,8 @@ impl From for FlowId { } } -impl From<(RoomId, EventId)> for FlowId { - fn from(ids: (RoomId, EventId)) -> Self { +impl From<(Box, Box)> for FlowId { + fn from(ids: (Box, Box)) -> Self { FlowId::InRoom(ids.0, ids.1) } } @@ -711,31 +712,20 @@ pub(crate) mod test { content: OutgoingContent, ) -> AnyToDeviceEvent { let content = if let OutgoingContent::ToDevice(c) = content { c } else { unreachable!() }; + let sender = sender.to_owned(); match content { AnyToDeviceEventContent::KeyVerificationKey(c) => { - AnyToDeviceEvent::KeyVerificationKey(ToDeviceEvent { - sender: sender.clone(), - content: c, - }) + AnyToDeviceEvent::KeyVerificationKey(ToDeviceEvent { sender, content: c }) } AnyToDeviceEventContent::KeyVerificationStart(c) => { - AnyToDeviceEvent::KeyVerificationStart(ToDeviceEvent { - sender: sender.clone(), - content: c, - }) + AnyToDeviceEvent::KeyVerificationStart(ToDeviceEvent { sender, content: c }) } AnyToDeviceEventContent::KeyVerificationAccept(c) => { - AnyToDeviceEvent::KeyVerificationAccept(ToDeviceEvent { - sender: sender.clone(), - content: c, - }) + AnyToDeviceEvent::KeyVerificationAccept(ToDeviceEvent { sender, content: c }) } AnyToDeviceEventContent::KeyVerificationMac(c) => { - AnyToDeviceEvent::KeyVerificationMac(ToDeviceEvent { - sender: sender.clone(), - content: c, - }) + AnyToDeviceEvent::KeyVerificationMac(ToDeviceEvent { sender, content: c }) } _ => unreachable!(), diff --git a/crates/matrix-sdk-crypto/src/verification/qrcode.rs b/crates/matrix-sdk-crypto/src/verification/qrcode.rs index f32662adf16..122a2b8d3d7 100644 --- a/crates/matrix-sdk-crypto/src/verification/qrcode.rs +++ b/crates/matrix-sdk-crypto/src/verification/qrcode.rs @@ -33,7 +33,7 @@ use ruma::{ }, AnyMessageEventContent, AnyToDeviceEventContent, }, - DeviceId, DeviceIdBox, DeviceKeyAlgorithm, RoomId, UserId, + DeviceId, DeviceKeyAlgorithm, RoomId, UserId, }; use thiserror::Error; use tracing::trace; @@ -70,11 +70,11 @@ pub enum ScanError { /// One of the users that is participating in this verification doesn't have /// a valid cross signing identity. #[error("The user {0} is missing a valid cross signing identity")] - MissingCrossSigningIdentity(UserId), + MissingCrossSigningIdentity(Box), /// The device of the user that is participating in this verification /// doesn't have a valid device key. #[error("The user's {0} device {1} is not E2E capable")] - MissingDeviceKeys(UserId, DeviceIdBox), + MissingDeviceKeys(Box, Box), /// The ID uniquely identifying this verification flow didn't match to the /// one that has been scanned. #[error("The unique verification flow id did not match (expected {expected}, found {found})")] @@ -505,8 +505,8 @@ impl QrVerification { pub(crate) async fn from_scan( store: VerificationStore, private_identity: PrivateCrossSigningIdentity, - other_user_id: UserId, - other_device_id: DeviceIdBox, + other_user_id: Box, + other_device_id: Box, flow_id: FlowId, qr_code: QrVerificationData, we_started: bool, @@ -534,7 +534,7 @@ impl QrVerification { let check_master_key = |key, identity: &ReadOnlyUserIdentities| { let master_key = identity.master_key().get_first_key().ok_or_else(|| { - ScanError::MissingCrossSigningIdentity(identity.user_id().clone()) + ScanError::MissingCrossSigningIdentity(identity.user_id().to_owned()) })?; if key != master_key { @@ -658,7 +658,7 @@ struct Confirmed {} #[derive(Clone, Debug)] struct Reciprocated { - own_device_id: DeviceIdBox, + own_device_id: Box, secret: String, } @@ -798,7 +798,7 @@ mod test { use matrix_qrcode::QrVerificationData; use matrix_sdk_test::async_test; - use ruma::{event_id, room_id, user_id, DeviceIdBox, UserId}; + use ruma::{device_id, event_id, room_id, user_id, DeviceId, UserId}; use crate::{ olm::{PrivateCrossSigningIdentity, ReadOnlyAccount}, @@ -810,7 +810,7 @@ mod test { QrVerification, ReadOnlyDevice, }; - fn user_id() -> UserId { + fn user_id() -> &'static UserId { user_id!("@example:localhost") } @@ -818,18 +818,18 @@ mod test { Arc::new(MemoryStore::new()) } - fn device_id() -> DeviceIdBox { - "DEVICEID".into() + fn device_id() -> &'static DeviceId { + device_id!("DEVICEID") } #[async_test] async fn test_verification_creation() { let store = memory_store(); - let account = ReadOnlyAccount::new(&user_id(), &device_id()); + let account = ReadOnlyAccount::new(user_id(), device_id()); let store = VerificationStore { account: account.clone(), inner: store }; - let private_identity = PrivateCrossSigningIdentity::new(user_id()).await; + let private_identity = PrivateCrossSigningIdentity::new(user_id().to_owned()).await; let flow_id = FlowId::ToDevice("test_transaction".to_owned()); let device_key = account.identity_keys().ed25519().to_owned(); @@ -869,11 +869,13 @@ mod test { assert_eq!(verification.inner.first_key(), &master_key); assert_eq!(verification.inner.second_key(), &device_key); - let bob_identity = PrivateCrossSigningIdentity::new(user_id!("@bob:example")).await; + let bob_identity = + PrivateCrossSigningIdentity::new(user_id!("@bob:example").to_owned()).await; let bob_master_key = bob_identity.master_public_key().await.unwrap(); let bob_master_key = bob_master_key.get_first_key().unwrap().to_owned(); - let flow_id = FlowId::InRoom(room_id!("!test:example"), event_id!("$EVENTID")); + let flow_id = + FlowId::InRoom(room_id!("!test:example").to_owned(), event_id!("$EVENTID").to_owned()); let verification = QrVerification::new_cross( flow_id, @@ -891,14 +893,15 @@ mod test { #[async_test] async fn test_reciprocate_receival() { let test = |flow_id: FlowId| async move { - let alice_account = ReadOnlyAccount::new(&user_id(), &device_id()); + let alice_account = ReadOnlyAccount::new(user_id(), device_id()); let store = memory_store(); let store = VerificationStore { account: alice_account.clone(), inner: store }; - let bob_account = ReadOnlyAccount::new(alice_account.user_id(), "BOBDEVICE".into()); + let bob_account = + ReadOnlyAccount::new(alice_account.user_id(), device_id!("BOBDEVICE")); - let private_identity = PrivateCrossSigningIdentity::new(user_id()).await; + let private_identity = PrivateCrossSigningIdentity::new(user_id().to_owned()).await; let identity = private_identity.to_public_identity().await.unwrap(); let master_key = private_identity.master_public_key().await.unwrap(); @@ -994,7 +997,8 @@ mod test { let flow_id = FlowId::ToDevice("test_transaction".to_owned()); test(flow_id).await; - let flow_id = FlowId::InRoom(room_id!("!test:example"), event_id!("$EVENTID")); + let flow_id = + FlowId::InRoom(room_id!("!test:example").to_owned(), event_id!("$EVENTID").to_owned()); test(flow_id).await; } } diff --git a/crates/matrix-sdk-crypto/src/verification/requests.rs b/crates/matrix-sdk-crypto/src/verification/requests.rs index b6d27f882a9..7b4d850ef19 100644 --- a/crates/matrix-sdk-crypto/src/verification/requests.rs +++ b/crates/matrix-sdk-crypto/src/verification/requests.rs @@ -35,7 +35,7 @@ use ruma::{ AnyMessageEventContent, AnyToDeviceEventContent, }, to_device::DeviceIdOrAllDevices, - DeviceId, DeviceIdBox, MilliSecondsSinceUnixEpoch, RoomId, UserId, + DeviceId, MilliSecondsSinceUnixEpoch, RoomId, UserId, }; use tracing::{info, trace, warn}; @@ -82,7 +82,7 @@ pub struct VerificationRequest { inner: Arc>, creation_time: Arc, we_started: bool, - recipient_devices: Arc>, + recipient_devices: Arc>>, } /// A handle to a request so child verification flows can cancel the request. @@ -118,7 +118,7 @@ impl VerificationRequest { store: VerificationStore, flow_id: FlowId, other_user: &UserId, - recipient_devices: Vec, + recipient_devices: Vec>, methods: Option>, ) -> Self { let account = store.account.clone(); @@ -207,7 +207,7 @@ impl VerificationRequest { } /// The id of the other device that is participating in this verification. - pub fn other_device_id(&self) -> Option { + pub fn other_device_id(&self) -> Option> { match &*self.inner.lock().unwrap() { InnerRequest::Requested(r) => Some(r.state.other_device_id.clone()), InnerRequest::Ready(r) => Some(r.state.other_device_id.clone()), @@ -523,7 +523,7 @@ impl VerificationRequest { let cancel_content = cancelled.as_content(self.flow_id()); if let OutgoingContent::ToDevice(c) = cancel_content { - let recipients: Vec = self + let recipients: Vec> = self .recipient_devices .to_vec() .into_iter() @@ -767,7 +767,7 @@ struct RequestState { flow_id: Arc, /// The id of the user which is participating in this verification request. - pub other_user_id: UserId, + pub other_user_id: Box, /// The verification request state we are in. state: S, @@ -851,7 +851,7 @@ struct Requested { pub their_methods: Vec, /// The device id of the device that responded to the verification request. - pub other_device_id: DeviceIdBox, + pub other_device_id: Box, } impl RequestState { @@ -869,7 +869,7 @@ impl RequestState { store, verification_cache: cache, flow_id: flow_id.to_owned().into(), - other_user_id: sender.clone(), + other_user_id: sender.to_owned(), state: Requested { their_methods: content.methods().to_owned(), other_device_id: content.from_device().into(), @@ -937,7 +937,7 @@ struct Ready { pub our_methods: Vec, /// The device id of the device that responded to the verification request. - pub other_device_id: DeviceIdBox, + pub other_device_id: Box, } impl RequestState { @@ -1258,7 +1258,7 @@ impl RequestState { struct Passive { /// The device id of the device that responded to the verification request. #[allow(dead_code)] - pub other_device_id: DeviceIdBox, + pub other_device_id: Box, } #[derive(Clone, Debug)] @@ -1269,7 +1269,7 @@ mod test { use std::convert::{TryFrom, TryInto}; use matrix_sdk_test::async_test; - use ruma::{event_id, room_id, DeviceIdBox, UserId}; + use ruma::{device_id, event_id, room_id, user_id, DeviceId, UserId}; use super::VerificationRequest; use crate::{ @@ -1283,41 +1283,41 @@ mod test { ReadOnlyDevice, }; - fn alice_id() -> UserId { - UserId::try_from("@alice:example.org").unwrap() + fn alice_id() -> &'static UserId { + user_id!("@alice:example.org") } - fn alice_device_id() -> DeviceIdBox { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn bob_id() -> UserId { - UserId::try_from("@bob:example.org").unwrap() + fn bob_id() -> &'static UserId { + user_id!("@bob:example.org") } - fn bob_device_id() -> DeviceIdBox { - "BOBDEVCIE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVCIE") } #[async_test] async fn test_request_accepting() { - let event_id = event_id!("$1234localhost"); - let room_id = room_id!("!test:localhost"); + let event_id = event_id!("$1234localhost").to_owned(); + let room_id = room_id!("!test:localhost").to_owned(); - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_store: Box = Box::new(MemoryStore::new()); - let alice_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let alice_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let alice_store = VerificationStore { account: alice, inner: alice_store.into() }; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_store: Box = Box::new(MemoryStore::new()); - let bob_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let bob_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let bob_store = VerificationStore { account: bob.clone(), inner: bob_store.into() }; let content = - VerificationRequest::request(bob.user_id(), bob.device_id(), &alice_id(), None); + VerificationRequest::request(bob.user_id(), bob.device_id(), alice_id(), None); let flow_id = FlowId::InRoom(room_id, event_id); @@ -1326,7 +1326,7 @@ mod test { bob_identity, bob_store, flow_id.clone(), - &alice_id(), + alice_id(), vec![], None, ); @@ -1335,7 +1335,7 @@ mod test { VerificationCache::new(), alice_identity, alice_store, - &bob_id(), + bob_id(), flow_id, &(&content).into(), ); @@ -1343,7 +1343,7 @@ mod test { let content: OutgoingContent = alice_request.accept().unwrap().try_into().unwrap(); let content = ReadyContent::try_from(&content).unwrap(); - bob_request.receive_ready(&alice_id(), &content); + bob_request.receive_ready(alice_id(), &content); assert!(bob_request.is_ready()); assert!(alice_request.is_ready()); @@ -1354,18 +1354,18 @@ mod test { let event_id = event_id!("$1234localhost"); let room_id = room_id!("!test:localhost"); - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_device = ReadOnlyDevice::from_account(&alice).await; let alice_store: Box = Box::new(MemoryStore::new()); - let alice_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let alice_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let alice_store = VerificationStore { account: alice.clone(), inner: alice_store.into() }; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_device = ReadOnlyDevice::from_account(&bob).await; let bob_store: Box = Box::new(MemoryStore::new()); - let bob_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let bob_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let bob_store = VerificationStore { account: bob.clone(), inner: bob_store.into() }; @@ -1378,7 +1378,7 @@ mod test { bob_store.save_changes(changes).await.unwrap(); let content = - VerificationRequest::request(bob.user_id(), bob.device_id(), &alice_id(), None); + VerificationRequest::request(bob.user_id(), bob.device_id(), alice_id(), None); let flow_id = FlowId::from((room_id, event_id)); let bob_request = VerificationRequest::new( @@ -1386,7 +1386,7 @@ mod test { bob_identity, bob_store, flow_id.clone(), - &alice_id(), + alice_id(), vec![], None, ); @@ -1395,7 +1395,7 @@ mod test { VerificationCache::new(), alice_identity, alice_store, - &bob_id(), + bob_id(), flow_id, &(&content).into(), ); @@ -1403,7 +1403,7 @@ mod test { let content: OutgoingContent = alice_request.accept().unwrap().try_into().unwrap(); let content = ReadyContent::try_from(&content).unwrap(); - bob_request.receive_ready(&alice_id(), &content); + bob_request.receive_ready(alice_id(), &content); assert!(bob_request.is_ready()); assert!(alice_request.is_ready()); @@ -1423,18 +1423,18 @@ mod test { #[async_test] async fn test_requesting_until_sas_to_device() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_device = ReadOnlyDevice::from_account(&alice).await; let alice_store: Box = Box::new(MemoryStore::new()); - let alice_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let alice_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let alice_store = VerificationStore { account: alice.clone(), inner: alice_store.into() }; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_device = ReadOnlyDevice::from_account(&bob).await; let bob_store: Box = Box::new(MemoryStore::new()); - let bob_identity = PrivateCrossSigningIdentity::empty(alice_id()); + let bob_identity = PrivateCrossSigningIdentity::empty(alice_id().to_owned()); let mut changes = Changes::default(); changes.devices.new.push(bob_device.clone()); @@ -1453,7 +1453,7 @@ mod test { bob_identity, bob_store, flow_id, - &alice_id(), + alice_id(), vec![], None, ); @@ -1467,7 +1467,7 @@ mod test { VerificationCache::new(), alice_identity, alice_store, - &bob_id(), + bob_id(), flow_id, &content, ); @@ -1475,7 +1475,7 @@ mod test { let content: OutgoingContent = alice_request.accept().unwrap().try_into().unwrap(); let content = ReadyContent::try_from(&content).unwrap(); - bob_request.receive_ready(&alice_id(), &content); + bob_request.receive_ready(alice_id(), &content); assert!(bob_request.is_ready()); assert!(alice_request.is_ready()); diff --git a/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs b/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs index eadaa60fe22..c7df219c1fb 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs @@ -214,7 +214,7 @@ pub fn receive_mac_event( ids.other_device.device_id() ); - let key_id: DeviceKeyId = match key_id.as_str().try_into() { + let key_id: Box = match key_id.as_str().try_into() { Ok(id) => id, Err(_) => continue, }; diff --git a/crates/matrix-sdk-crypto/src/verification/sas/inner_sas.rs b/crates/matrix-sdk-crypto/src/verification/sas/inner_sas.rs index af0c806f291..de0f23a8753 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/inner_sas.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/inner_sas.rs @@ -134,8 +134,8 @@ impl InnerSas { } pub fn start_in_room( - event_id: EventId, - room_id: RoomId, + event_id: Box, + room_id: Box, account: ReadOnlyAccount, other_device: ReadOnlyDevice, own_identity: Option, diff --git a/crates/matrix-sdk-crypto/src/verification/sas/mod.rs b/crates/matrix-sdk-crypto/src/verification/sas/mod.rs index b3c12805658..f8391f80d50 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/mod.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/mod.rs @@ -228,8 +228,8 @@ impl Sas { /// sent out through the server to the other device. #[allow(clippy::too_many_arguments)] pub(crate) fn start_in_room( - flow_id: EventId, - room_id: RoomId, + flow_id: Box, + room_id: Box, private_identity: PrivateCrossSigningIdentity, other_device: ReadOnlyDevice, store: VerificationStore, @@ -557,7 +557,7 @@ impl AcceptSettings { mod test { use std::{convert::TryFrom, sync::Arc}; - use ruma::{DeviceId, UserId}; + use ruma::{device_id, user_id, DeviceId, UserId}; use super::Sas; use crate::{ @@ -570,28 +570,28 @@ mod test { ReadOnlyAccount, ReadOnlyDevice, }; - fn alice_id() -> UserId { - UserId::try_from("@alice:example.org").unwrap() + fn alice_id() -> &'static UserId { + user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn bob_id() -> UserId { - UserId::try_from("@bob:example.org").unwrap() + fn bob_id() -> &'static UserId { + user_id!("@bob:example.org") } - fn bob_device_id() -> Box { - "BOBDEVCIE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVCIE") } #[tokio::test] async fn sas_wrapper_full() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_device = ReadOnlyDevice::from_account(&alice).await; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_device = ReadOnlyDevice::from_account(&bob).await; let alice_store = @@ -603,7 +603,7 @@ mod test { let bob_store = VerificationStore { account: bob.clone(), inner: Arc::new(bob_store) }; let (alice, content) = Sas::start( - PrivateCrossSigningIdentity::empty(alice_id()), + PrivateCrossSigningIdentity::empty(alice_id().to_owned()), bob_device, alice_store, None, @@ -620,7 +620,7 @@ mod test { flow_id, &content, bob_store, - PrivateCrossSigningIdentity::empty(bob_id()), + PrivateCrossSigningIdentity::empty(bob_id().to_owned()), alice_device, None, None, diff --git a/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs b/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs index 2e6de5f4f24..0909d9f2a80 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs @@ -392,8 +392,8 @@ impl SasState { /// /// * `other_identity` - The identity of the other user if one exists. pub fn new_in_room( - room_id: RoomId, - event_id: EventId, + room_id: Box, + event_id: Box, account: ReadOnlyAccount, other_device: ReadOnlyDevice, own_identity: Option, @@ -1138,12 +1138,13 @@ mod test { use std::convert::TryFrom; use ruma::{ + device_id, events::key::verification::{ accept::{AcceptMethod, ToDeviceKeyVerificationAcceptEventContent}, start::{StartMethod, ToDeviceKeyVerificationStartEventContent}, ShortAuthenticationString, }, - DeviceId, UserId, + user_id, DeviceId, UserId, }; use serde_json::json; @@ -1153,27 +1154,27 @@ mod test { ReadOnlyAccount, ReadOnlyDevice, }; - fn alice_id() -> UserId { - UserId::try_from("@alice:example.org").unwrap() + fn alice_id() -> &'static UserId { + user_id!("@alice:example.org") } - fn alice_device_id() -> Box { - "JLAFKJWSCS".into() + fn alice_device_id() -> &'static DeviceId { + device_id!("JLAFKJWSCS") } - fn bob_id() -> UserId { - UserId::try_from("@bob:example.org").unwrap() + fn bob_id() -> &'static UserId { + user_id!("@bob:example.org") } - fn bob_device_id() -> Box { - "BOBDEVCIE".into() + fn bob_device_id() -> &'static DeviceId { + device_id!("BOBDEVCIE") } async fn get_sas_pair() -> (SasState, SasState) { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_device = ReadOnlyDevice::from_account(&alice).await; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_device = ReadOnlyDevice::from_account(&bob).await; let alice_sas = SasState::::new(alice.clone(), bob_device, None, None, None); @@ -1307,7 +1308,7 @@ mod test { let content = bob.as_content(); let content = AcceptContent::from(&content); - let sender = UserId::try_from("@malory:example.org").unwrap(); + let sender = Box::::try_from("@malory:example.org").unwrap(); alice.into_accepted(&sender, &content).expect_err("Didn't cancel on a invalid sender"); } @@ -1353,10 +1354,10 @@ mod test { #[tokio::test] async fn sas_from_start_unknown_method() { - let alice = ReadOnlyAccount::new(&alice_id(), &alice_device_id()); + let alice = ReadOnlyAccount::new(alice_id(), alice_device_id()); let alice_device = ReadOnlyDevice::from_account(&alice).await; - let bob = ReadOnlyAccount::new(&bob_id(), &bob_device_id()); + let bob = ReadOnlyAccount::new(bob_id(), bob_device_id()); let bob_device = ReadOnlyDevice::from_account(&bob).await; let alice_sas = SasState::::new(alice.clone(), bob_device, None, None, None); diff --git a/crates/matrix-sdk-test/Cargo.toml b/crates/matrix-sdk-test/Cargo.toml index 52fc3601b5a..1d813a8fd9c 100644 --- a/crates/matrix-sdk-test/Cargo.toml +++ b/crates/matrix-sdk-test/Cargo.toml @@ -18,6 +18,6 @@ appservice = [] http = "0.2.4" lazy_static = "1.4.0" matrix-sdk-test-macros = { version = "0.1.0", path = "../matrix-sdk-test-macros" } -ruma = { git = "https://github.com/ruma/ruma", rev = "ac6ecc3e5", features = ["client-api-c"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "6c4892664", features = ["client-api-c"] } serde = "1.0.126" serde_json = "1.0.64" diff --git a/crates/matrix-sdk-test/src/lib.rs b/crates/matrix-sdk-test/src/lib.rs index c559085fdc0..de3b329428b 100644 --- a/crates/matrix-sdk-test/src/lib.rs +++ b/crates/matrix-sdk-test/src/lib.rs @@ -81,11 +81,11 @@ pub enum EventsJson { #[derive(Default)] pub struct EventBuilder { /// The events that determine the state of a `Room`. - joined_room_events: HashMap>, + joined_room_events: HashMap, Vec>, /// The events that determine the state of a `Room`. - invited_room_events: HashMap>, + invited_room_events: HashMap, Vec>, /// The events that determine the state of a `Room`. - left_room_events: HashMap>, + left_room_events: HashMap, Vec>, /// The presence events that determine the presence state of a `RoomMember`. presence_events: Vec, /// The state events that determine the state of a `Room`. @@ -140,7 +140,7 @@ impl EventBuilder { let event = serde_json::from_value::(val.clone()).unwrap(); - self.add_joined_event(&room_id!("!SVkFJHzfwvuaIEawgC:localhost"), event); + self.add_joined_event(room_id!("!SVkFJHzfwvuaIEawgC:localhost"), event); self } @@ -155,7 +155,7 @@ impl EventBuilder { } fn add_joined_event(&mut self, room_id: &RoomId, event: AnySyncRoomEvent) { - self.joined_room_events.entry(room_id.clone()).or_insert_with(Vec::new).push(event); + self.joined_room_events.entry(room_id.to_owned()).or_insert_with(Vec::new).push(event); } pub fn add_custom_invited_event( @@ -164,7 +164,7 @@ impl EventBuilder { event: serde_json::Value, ) -> &mut Self { let event = serde_json::from_value::(event).unwrap(); - self.invited_room_events.entry(room_id.clone()).or_insert_with(Vec::new).push(event); + self.invited_room_events.entry(room_id.to_owned()).or_insert_with(Vec::new).push(event); self } @@ -174,7 +174,7 @@ impl EventBuilder { event: serde_json::Value, ) -> &mut Self { let event = serde_json::from_value::(event).unwrap(); - self.left_room_events.entry(room_id.clone()).or_insert_with(Vec::new).push(event); + self.left_room_events.entry(room_id.to_owned()).or_insert_with(Vec::new).push(event); self } @@ -238,7 +238,7 @@ impl EventBuilder { "events": self.state_events }, "timeline": { - "events": self.joined_room_events.remove(&main_room_id).unwrap_or_default(), + "events": self.joined_room_events.remove(main_room_id).unwrap_or_default(), "limited": true, "prev_batch": prev_batch }, @@ -248,9 +248,9 @@ impl EventBuilder { } }); - let mut joined_rooms: HashMap = HashMap::new(); + let mut joined_rooms: HashMap, serde_json::Value> = HashMap::new(); - joined_rooms.insert(main_room_id, joined_room); + joined_rooms.insert(main_room_id.to_owned(), joined_room); for (room_id, events) in self.joined_room_events.drain() { let joined_room = serde_json::json!({ @@ -277,7 +277,7 @@ impl EventBuilder { joined_rooms.insert(room_id, joined_room); } - let mut left_rooms: HashMap = HashMap::new(); + let mut left_rooms: HashMap, serde_json::Value> = HashMap::new(); for (room_id, events) in self.left_room_events.drain() { let room = serde_json::json!({ @@ -293,7 +293,7 @@ impl EventBuilder { left_rooms.insert(room_id, room); } - let mut invited_rooms: HashMap = HashMap::new(); + let mut invited_rooms: HashMap, serde_json::Value> = HashMap::new(); for (room_id, events) in self.invited_room_events.drain() { let room = serde_json::json!({ diff --git a/crates/matrix-sdk/Cargo.toml b/crates/matrix-sdk/Cargo.toml index f448e440b9d..04ab676890c 100644 --- a/crates/matrix-sdk/Cargo.toml +++ b/crates/matrix-sdk/Cargo.toml @@ -76,7 +76,7 @@ default_features = false [dependencies.ruma] git = "https://github.com/ruma/ruma" -rev = "ac6ecc3e5" +rev = "6c4892664" features = ["client-api-c", "compat", "unstable-pre-spec"] [dependencies.tokio-stream] diff --git a/crates/matrix-sdk/README.md b/crates/matrix-sdk/README.md index 0e5596fb053..9c50b024eac 100644 --- a/crates/matrix-sdk/README.md +++ b/crates/matrix-sdk/README.md @@ -33,7 +33,7 @@ use matrix_sdk::{ #[tokio::main] async fn main() -> Result<()> { - let alice = UserId::try_from("@alice:example.org")?; + let alice = Box::::try_from("@alice:example.org")?; let client = Client::new_from_user_id(&alice).await?; // First we need to log in. diff --git a/crates/matrix-sdk/examples/cross_signing_bootstrap.rs b/crates/matrix-sdk/examples/cross_signing_bootstrap.rs index 9585924b5f7..a1ea9edb047 100644 --- a/crates/matrix-sdk/examples/cross_signing_bootstrap.rs +++ b/crates/matrix-sdk/examples/cross_signing_bootstrap.rs @@ -7,7 +7,7 @@ use std::{ use matrix_sdk::{config::SyncSettings, ruma::UserId, Client, LoopCtrl}; use url::Url; -async fn bootstrap(client: Client, user_id: UserId, password: String) { +async fn bootstrap(client: Client, user_id: Box, password: String) { println!("Bootstrapping a new cross signing identity, press enter to continue."); let mut input = String::new(); diff --git a/crates/matrix-sdk/examples/get_profiles.rs b/crates/matrix-sdk/examples/get_profiles.rs index e2612371bd2..ad3865659bb 100644 --- a/crates/matrix-sdk/examples/get_profiles.rs +++ b/crates/matrix-sdk/examples/get_profiles.rs @@ -9,7 +9,7 @@ use url::Url; #[derive(Debug)] #[allow(dead_code)] struct UserProfile { - avatar_url: Option, + avatar_url: Option>, displayname: Option, } @@ -62,7 +62,7 @@ async fn main() -> Result<(), matrix_sdk::Error> { let client = login(homeserver_url, &username, &password).await?; - let user_id = UserId::try_from(username).expect("Couldn't parse the MXID"); + let user_id = Box::::try_from(username).expect("Couldn't parse the MXID"); let profile = get_profile(client, &user_id).await?; println!("{:#?}", profile); Ok(()) diff --git a/crates/matrix-sdk/src/client.rs b/crates/matrix-sdk/src/client.rs index 786df5643f1..43e90a91932 100644 --- a/crates/matrix-sdk/src/client.rs +++ b/crates/matrix-sdk/src/client.rs @@ -60,7 +60,7 @@ use ruma::{ }, assign, presence::PresenceState, - DeviceIdBox, MxcUri, RoomId, RoomIdOrAliasId, ServerName, UInt, UserId, + DeviceId, MxcUri, RoomId, RoomOrAliasId, ServerName, UInt, UserId, }; use serde::de::DeserializeOwned; use tracing::{error, info, instrument, warn}; @@ -121,12 +121,12 @@ pub(crate) struct ClientInner { /// Locks making sure we only have one group session sharing request in /// flight per room. #[cfg(feature = "encryption")] - pub(crate) group_session_locks: DashMap>>, + pub(crate) group_session_locks: DashMap, Arc>>, #[cfg(feature = "encryption")] /// Lock making sure we're only doing one key claim request at a time. pub(crate) key_claim_lock: Mutex<()>, - pub(crate) members_request_locks: DashMap>>, - pub(crate) typing_notice_times: DashMap, + pub(crate) members_request_locks: DashMap, Arc>>, + pub(crate) typing_notice_times: DashMap, Instant>, /// Event handlers. See `register_event_handler`. event_handlers: RwLock, /// Custom event handler context. See `register_event_handler_context`. @@ -229,7 +229,7 @@ impl Client { /// use matrix_sdk::{Client, ruma::UserId}; /// /// // First let's try to construct an user id, presumably from user input. - /// let alice = UserId::try_from("@alice:example.org")?; + /// let alice = Box::::try_from("@alice:example.org")?; /// /// // Now let's try to discover the homeserver and create a client object. /// let client = Client::new_from_user_id(&alice).await?; @@ -356,13 +356,13 @@ impl Client { } /// Get the user id of the current owner of the client. - pub async fn user_id(&self) -> Option { + pub async fn user_id(&self) -> Option> { let session = self.inner.base_client.session().read().await; session.as_ref().cloned().map(|s| s.user_id) } /// Get the device id that identifies the current session. - pub async fn device_id(&self) -> Option { + pub async fn device_id(&self) -> Option> { let session = self.inner.base_client.session().read().await; session.as_ref().map(|s| s.device_id.clone()) } @@ -443,7 +443,7 @@ impl Client { /// } /// # }) /// ``` - pub async fn avatar_url(&self) -> Result> { + pub async fn avatar_url(&self) -> Result>> { let user_id = self.user_id().await.ok_or(Error::AuthenticationRequired)?; let request = get_avatar_url::Request::new(&user_id); @@ -1241,7 +1241,7 @@ impl Client { /// # Examples /// /// ```no_run - /// use matrix_sdk::{Client, Session, ruma::{DeviceIdBox, user_id}}; + /// use matrix_sdk::{Client, Session, ruma::{device_id, user_id}}; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { @@ -1251,8 +1251,8 @@ impl Client { /// /// let session = Session { /// access_token: "My-Token".to_owned(), - /// user_id: user_id!("@example:localhost"), - /// device_id: DeviceIdBox::from("MYDEVICEID"), + /// user_id: user_id!("@example:localhost").to_owned(), + /// device_id: device_id!("MYDEVICEID").to_owned(), /// }; /// /// client.restore_login(session).await?; @@ -1263,7 +1263,7 @@ impl Client { /// [`Client::login()`] method returns: /// /// ```no_run - /// use matrix_sdk::{Client, Session, ruma::{DeviceIdBox, user_id}}; + /// use matrix_sdk::{Client, Session}; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { @@ -1433,7 +1433,7 @@ impl Client { /// An alias looks like `#name:example.com`. pub async fn join_room_by_id_or_alias( &self, - alias: &RoomIdOrAliasId, + alias: &RoomOrAliasId, server_names: &[Box], ) -> HttpResult { let request = assign!(join_room_by_id_or_alias::Request::new(alias), { @@ -1720,7 +1720,7 @@ impl Client { /// # client::r0::uiaa, /// # error::{FromHttpResponseError, ServerError}, /// # }, - /// # assign, + /// # assign, device_id, /// # }, /// # Client, Error, config::SyncSettings, /// # }; @@ -1731,7 +1731,7 @@ impl Client { /// # block_on(async { /// # let homeserver = Url::parse("http://localhost:8080")?; /// # let mut client = Client::new(homeserver)?; - /// let devices = &["DEVICEID".into()]; + /// let devices = &[device_id!("DEVICEID").to_owned()]; /// /// if let Err(e) = client.delete_devices(devices, None).await { /// if let Some(info) = e.uiaa_response() { @@ -1748,7 +1748,7 @@ impl Client { /// # Result::<_, matrix_sdk::Error>::Ok(()) }); pub async fn delete_devices( &self, - devices: &[DeviceIdBox], + devices: &[Box], auth_data: Option>, ) -> HttpResult { let mut request = delete_devices::Request::new(devices); @@ -2371,7 +2371,7 @@ pub(crate) mod test { }, error::{FromHttpResponseError, ServerError}, }, - assign, + assign, device_id, directory::Filter, event_id, events::{ @@ -2394,8 +2394,8 @@ pub(crate) mod test { pub(crate) async fn logged_in_client() -> Client { let session = Session { access_token: "1234".to_owned(), - user_id: user_id!("@example:localhost"), - device_id: "DEVICEID".into(), + user_id: user_id!("@example:localhost").to_owned(), + device_id: device_id!("DEVICEID").to_owned(), }; let homeserver = url::Url::parse(&mockito::server_url()).unwrap(); let config = ClientConfig::new().request_config(RequestConfig::new().disable_retry()); @@ -2422,7 +2422,7 @@ pub(crate) mod test { async fn successful_discovery() { let server_url = mockito::server_url(); let domain = server_url.strip_prefix("http://").unwrap(); - let alice = UserId::try_from("@alice:".to_string() + domain).unwrap(); + let alice = Box::::try_from("@alice:".to_string() + domain).unwrap(); let _m_well_known = mock("GET", "/.well-known/matrix/client") .with_status(200) @@ -2444,7 +2444,7 @@ pub(crate) mod test { async fn discovery_broken_server() { let server_url = mockito::server_url(); let domain = server_url.strip_prefix("http://").unwrap(); - let alice = UserId::try_from("@alice:".to_string() + domain).unwrap(); + let alice = Box::::try_from("@alice:".to_string() + domain).unwrap(); let _m = mock("GET", "/.well-known/matrix/client") .with_status(200) @@ -2630,15 +2630,15 @@ pub(crate) mod test { let client = logged_in_client().await; let session = client.session().await.unwrap(); - let room = client.get_joined_room(&room_id); + let room = client.get_joined_room(room_id); assert!(room.is_none()); client.sync_once(SyncSettings::default()).await.unwrap(); - let room = client.get_left_room(&room_id); + let room = client.get_left_room(room_id); assert!(room.is_none()); - let room = client.get_joined_room(&room_id); + let room = client.get_joined_room(room_id); assert!(room.is_some()); // test store reloads with correct room state from the sled store @@ -2651,7 +2651,7 @@ pub(crate) mod test { // joined room reloaded from state store joined_client.sync_once(SyncSettings::default()).await.unwrap(); - let room = joined_client.get_joined_room(&room_id); + let room = joined_client.get_joined_room(room_id); assert!(room.is_some()); let _m = mock("GET", Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string())) @@ -2661,10 +2661,10 @@ pub(crate) mod test { joined_client.sync_once(SyncSettings::default()).await.unwrap(); - let room = joined_client.get_joined_room(&room_id); + let room = joined_client.get_joined_room(room_id); assert!(room.is_none()); - let room = joined_client.get_left_room(&room_id); + let room = joined_client.get_left_room(room_id); assert!(room.is_some()); } @@ -2700,7 +2700,7 @@ pub(crate) mod test { assert_eq!(client.homeserver().await, Url::parse(&mockito::server_url()).unwrap()); - let room = client.get_joined_room(&room_id); + let room = client.get_joined_room(room_id); assert!(room.is_some()); } @@ -2787,7 +2787,7 @@ pub(crate) mod test { assert_eq!( // this is the `join_by_room_id::Response` but since no PartialEq we check the RoomId // field - client.join_room_by_id(&room_id).await.unwrap().room_id, + client.join_room_by_id(room_id).await.unwrap().room_id, room_id ); } @@ -2808,7 +2808,7 @@ pub(crate) mod test { // this is the `join_by_room_id::Response` but since no PartialEq we check the RoomId // field client - .join_room_by_id_or_alias(&room_id, &["server.com".try_into().unwrap()]) + .join_room_by_id_or_alias(room_id, &["server.com".try_into().unwrap()]) .await .unwrap() .room_id, @@ -2837,9 +2837,9 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); let user = user_id!("@example:localhost"); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); - room.invite_user_by_id(&user).await.unwrap(); + room.invite_user_by_id(user).await.unwrap(); } #[tokio::test] @@ -2863,7 +2863,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); room.invite_user_by_3pid( Invite3pidInit { @@ -2933,7 +2933,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); room.leave().await.unwrap(); } @@ -2960,9 +2960,9 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); let user = user_id!("@example:localhost"); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); - room.ban_user(&user, None).await.unwrap(); + room.ban_user(user, None).await.unwrap(); } #[tokio::test] @@ -2987,9 +2987,9 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); let user = user_id!("@example:localhost"); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); - room.kick_user(&user, None).await.unwrap(); + room.kick_user(user, None).await.unwrap(); } #[tokio::test] @@ -3013,7 +3013,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_left_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_left_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); room.forget().await.unwrap(); } @@ -3040,9 +3040,9 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); let event_id = event_id!("$xxxxxx:example.org"); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); - room.read_receipt(&event_id).await.unwrap(); + room.read_receipt(event_id).await.unwrap(); } #[tokio::test] @@ -3068,9 +3068,9 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); let event_id = event_id!("$xxxxxx:example.org"); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); - room.read_marker(&event_id, None).await.unwrap(); + room.read_marker(event_id, None).await.unwrap(); } #[tokio::test] @@ -3094,7 +3094,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); room.typing_notice(true).await.unwrap(); } @@ -3123,11 +3123,11 @@ pub(crate) mod test { let room_id = room_id!("!SVkFJHzfwvuaIEawgC:localhost"); - let room = client.get_joined_room(&room_id).unwrap(); + let room = client.get_joined_room(room_id).unwrap(); let avatar_url = mxc_uri!("mxc://example.org/avA7ar"); let member_event = assign!(RoomMemberEventContent::new(MembershipState::Join), { - avatar_url: Some(avatar_url) + avatar_url: Some(avatar_url.to_owned()) }); let response = room.send_state_event(member_event, "").await.unwrap(); assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id); @@ -3155,7 +3155,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); let content = RoomMessageEventContent::text_plain("Hello world"); let txn_id = Uuid::new_v4(); @@ -3195,7 +3195,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); let mut media = Cursor::new("Hello world"); @@ -3228,13 +3228,13 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); let event_id = event_id!("$xxxxxxxx:example.com"); let txn_id = Uuid::new_v4(); let reason = Some("Indecent material"); - let response = room.redact(&event_id, reason, Some(txn_id)).await.unwrap(); + let response = room.redact(event_id, reason, Some(txn_id)).await.unwrap(); assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) } @@ -3259,7 +3259,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); let members: Vec = room.active_members().await.unwrap(); assert_eq!(1, members.len()); @@ -3278,7 +3278,7 @@ pub(crate) mod test { let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); assert_eq!("example2", room.display_name().await.unwrap()); } @@ -3299,7 +3299,7 @@ pub(crate) mod test { assert!(client.left_rooms().is_empty()); assert!(!client.invited_rooms().is_empty()); - assert!(client.get_invited_room(&room_id!("!696r7674:example.com")).is_some()); + assert!(client.get_invited_room(room_id!("!696r7674:example.com")).is_some()); } #[tokio::test] @@ -3318,7 +3318,7 @@ pub(crate) mod test { assert!(!client.left_rooms().is_empty()); assert!(client.invited_rooms().is_empty()); - assert!(client.get_left_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).is_some()) + assert!(client.get_left_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).is_some()) } #[tokio::test] @@ -3355,7 +3355,7 @@ pub(crate) mod test { let _response = client.sync_once(sync_settings).await.unwrap(); - let room = client.get_joined_room(&room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); + let room = client.get_joined_room(room_id!("!SVkFJHzfwvuaIEawgC:localhost")).unwrap(); assert_eq!("tutorial".to_string(), room.display_name().await.unwrap()); @@ -3368,7 +3368,7 @@ pub(crate) mod test { let _response = client.sync_once(SyncSettings::new()).await.unwrap(); - let invited_room = client.get_invited_room(&room_id!("!696r7674:example.com")).unwrap(); + let invited_room = client.get_invited_room(room_id!("!696r7674:example.com")).unwrap(); assert_eq!("My Room Name".to_string(), invited_room.display_name().await.unwrap()); } @@ -3403,7 +3403,7 @@ pub(crate) mod test { .with_body(test_json::LOGOUT.to_string()) .create(); - let devices = &["DEVICEID".into()]; + let devices = &[device_id!("DEVICEID").to_owned()]; if let Err(e) = client.delete_devices(devices, None).await { if let Some(info) = e.uiaa_response() { @@ -3483,7 +3483,7 @@ pub(crate) mod test { let client = logged_in_client().await; let request = MediaRequest { - media_type: MediaType::Uri(mxc_uri!("mxc://localhost/textfile")), + media_type: MediaType::Uri(mxc_uri!("mxc://localhost/textfile").to_owned()), format: MediaFormat::File, }; @@ -3508,7 +3508,7 @@ pub(crate) mod test { let event_content = ImageMessageEventContent::plain( "filename.jpg".into(), - mxc_uri!("mxc://example.org/image"), + mxc_uri!("mxc://example.org/image").to_owned(), Some(Box::new(assign!(ImageInfo::new(), { height: Some(uint!(398)), width: Some(uint!(394)), @@ -3570,8 +3570,8 @@ pub(crate) mod test { let session = Session { access_token: "1234".to_owned(), - user_id: user_id!("@example:localhost"), - device_id: "DEVICEID".into(), + user_id: user_id!("@example:localhost").to_owned(), + device_id: device_id!("DEVICEID").to_owned(), }; let sync = json!({ @@ -3638,12 +3638,12 @@ pub(crate) mod test { let client = Client::new_with_config(homeserver.clone(), config).unwrap(); client.restore_login(session.clone()).await.unwrap(); - let room = client.get_joined_room(&room_id); + let room = client.get_joined_room(room_id); assert!(room.is_none()); client.sync_once(SyncSettings::default()).await.unwrap(); - let room = client.get_joined_room(&room_id).unwrap(); + let room = client.get_joined_room(room_id).unwrap(); let state_events = room.get_state_events(EventType::RoomEncryption).await.unwrap(); assert_eq!(state_events.len(), 1); diff --git a/crates/matrix-sdk/src/encryption/identities/devices.rs b/crates/matrix-sdk/src/encryption/identities/devices.rs index 904b855d483..e697ba6b8ab 100644 --- a/crates/matrix-sdk/src/encryption/identities/devices.rs +++ b/crates/matrix-sdk/src/encryption/identities/devices.rs @@ -18,7 +18,7 @@ use matrix_sdk_base::crypto::{ store::CryptoStoreError, Device as BaseDevice, LocalTrust, ReadOnlyDevice, UserDevices as BaseUserDevices, }; -use ruma::{events::key::verification::VerificationMethod, DeviceId, DeviceIdBox}; +use ruma::{events::key::verification::VerificationMethod, DeviceId}; use super::ManualVerifyError; use crate::{ @@ -82,14 +82,14 @@ impl Device { /// /// ```no_run /// # use std::convert::TryFrom; - /// # use matrix_sdk::{Client, ruma::UserId}; + /// # use matrix_sdk::{Client, ruma::{device_id, UserId}}; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// let device = client.get_device(&alice, "DEVICEID".into()).await?; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await?; /// /// if let Some(device) = device { /// let verification = device.request_verification().await?; @@ -127,17 +127,17 @@ impl Device { /// # use matrix_sdk::{ /// # Client, /// # ruma::{ - /// # UserId, + /// # device_id, UserId, /// # events::key::verification::VerificationMethod, /// # } /// # }; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// let device = client.get_device(&alice, "DEVICEID".into()).await?; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await?; /// /// // We don't want to support showing a QR code, we only support SAS /// // verification @@ -172,14 +172,14 @@ impl Device { /// /// ```no_run /// # use std::convert::TryFrom; - /// # use matrix_sdk::{Client, ruma::UserId}; + /// # use matrix_sdk::{Client, ruma::{device_id, UserId}}; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// let device = client.get_device(&alice, "DEVICEID".into()).await?; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await?; /// /// if let Some(device) = device { /// let verification = device.start_verification().await?; @@ -233,17 +233,17 @@ impl Device { /// # use matrix_sdk::{ /// # Client, /// # ruma::{ - /// # UserId, + /// # device_id, UserId, /// # events::key::verification::VerificationMethod, /// # } /// # }; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// let device = client.get_device(&alice, "DEVICEID".into()).await?; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await?; /// /// if let Some(device) = device { /// device.verify().await?; @@ -348,17 +348,17 @@ impl Device { /// # use matrix_sdk::{ /// # Client, /// # ruma::{ - /// # UserId, + /// # device_id, UserId, /// # events::key::verification::VerificationMethod, /// # } /// # }; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// let device = client.get_device(&alice, "DEVICEID".into()).await?; + /// let device = client.get_device(&alice, device_id!("DEVICEID")).await?; /// /// if let Some(device) = device { /// if device.verified() { @@ -410,7 +410,7 @@ impl UserDevices { } /// Iterator over all the device ids of the user devices. - pub fn keys(&self) -> impl Iterator { + pub fn keys(&self) -> impl Iterator> { self.inner.keys() } diff --git a/crates/matrix-sdk/src/encryption/identities/mod.rs b/crates/matrix-sdk/src/encryption/identities/mod.rs index 4f3e35707a2..77f629c8b09 100644 --- a/crates/matrix-sdk/src/encryption/identities/mod.rs +++ b/crates/matrix-sdk/src/encryption/identities/mod.rs @@ -36,14 +36,14 @@ //! //! ```no_run //! # use std::convert::TryFrom; -//! # use matrix_sdk::{Client, ruma::UserId}; +//! # use matrix_sdk::{Client, ruma::{device_id, UserId}}; //! # use url::Url; //! # use futures::executor::block_on; -//! # let alice = UserId::try_from("@alice:example.org").unwrap(); +//! # let alice = Box::::try_from("@alice:example.org").unwrap(); //! # let homeserver = Url::parse("http://example.com").unwrap(); //! # let client = Client::new(homeserver).unwrap(); //! # block_on(async { -//! let device = client.get_device(&alice, "DEVICEID".into()).await?; +//! let device = client.get_device(&alice, device_id!("DEVICEID")).await?; //! //! if let Some(device) = device { //! // Let's request the device to be verified. @@ -65,7 +65,7 @@ //! # use matrix_sdk::{Client, ruma::UserId}; //! # use url::Url; //! # use futures::executor::block_on; -//! # let alice = UserId::try_from("@alice:example.org").unwrap(); +//! # let alice = Box::::try_from("@alice:example.org").unwrap(); //! # let homeserver = Url::parse("http://example.com").unwrap(); //! # let client = Client::new(homeserver).unwrap(); //! # block_on(async { @@ -116,5 +116,5 @@ pub enum RequestVerificationError { /// Verifying other users requires having a DM open with them, this error /// signals that we didn't have a DM and that we failed to create one. #[error("Couldn't create a DM with user {0} where the verification should take place")] - RoomCreation(ruma::UserId), + RoomCreation(Box), } diff --git a/crates/matrix-sdk/src/encryption/identities/users.rs b/crates/matrix-sdk/src/encryption/identities/users.rs index 3c5fe30cfc4..9efd0375a6b 100644 --- a/crates/matrix-sdk/src/encryption/identities/users.rs +++ b/crates/matrix-sdk/src/encryption/identities/users.rs @@ -93,7 +93,7 @@ impl UserIdentity { /// # use std::convert::TryFrom; /// # use matrix_sdk::{Client, ruma::UserId}; /// # use url::Url; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # futures::executor::block_on(async { @@ -145,7 +145,7 @@ impl UserIdentity { /// # use std::convert::TryFrom; /// # use matrix_sdk::{Client, ruma::UserId}; /// # use url::Url; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # futures::executor::block_on(async { @@ -204,7 +204,7 @@ impl UserIdentity { /// # }; /// # use url::Url; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # block_on(async { @@ -283,7 +283,7 @@ impl UserIdentity { /// # }; /// # use url::Url; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # block_on(async { @@ -326,7 +326,7 @@ impl UserIdentity { /// # }; /// # use url::Url; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # block_on(async { @@ -366,7 +366,7 @@ impl UserIdentity { /// # }; /// # use url::Url; /// # use futures::executor::block_on; - /// # let alice = UserId::try_from("@alice:example.org").unwrap(); + /// # let alice = Box::::try_from("@alice:example.org").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let client = Client::new(homeserver).unwrap(); /// # block_on(async { diff --git a/crates/matrix-sdk/src/encryption/mod.rs b/crates/matrix-sdk/src/encryption/mod.rs index e1a5d3e9892..cead36d1e93 100644 --- a/crates/matrix-sdk/src/encryption/mod.rs +++ b/crates/matrix-sdk/src/encryption/mod.rs @@ -251,7 +251,7 @@ use std::{ collections::{BTreeMap, HashSet}, io::{Read,Write}, path::PathBuf, - result::Result as StdResult, + result::Result as StdResult, iter, }; use futures_util::stream::{self, StreamExt}; @@ -277,7 +277,7 @@ use ruma::{ assign, events::{AnyMessageEvent, AnyRoomEvent, AnySyncMessageEvent, EventType}, serde::Raw, - DeviceId, DeviceIdBox, UserId, + DeviceId, UserId, }; use tracing::{debug, instrument, trace, warn}; @@ -316,7 +316,7 @@ impl Client { /// Tracked users are users for which we keep the device list of E2EE /// capable devices up to date. #[cfg(feature = "encryption")] - pub async fn tracked_users(&self) -> HashSet { + pub async fn tracked_users(&self) -> HashSet> { self.olm_machine().await.map(|o| o.tracked_users()).unwrap_or_default() } @@ -366,14 +366,14 @@ impl Client { /// /// ```no_run /// # use std::convert::TryFrom; - /// # use matrix_sdk::{Client, ruma::UserId}; + /// # use matrix_sdk::{Client, ruma::{device_id, UserId}}; /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; - /// if let Some(device) = client.get_device(&alice, "DEVICEID".into()).await? { + /// if let Some(device) = client.get_device(&alice, device_id!("DEVICEID")).await? { /// println!("{:?}", device.verified()); /// /// if !device.verified() { @@ -410,7 +410,7 @@ impl Client { /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; /// let devices = client.get_user_devices(&alice).await?; @@ -449,7 +449,7 @@ impl Client { /// # use url::Url; /// # use futures::executor::block_on; /// # block_on(async { - /// # let alice = UserId::try_from("@alice:example.org")?; + /// # let alice = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; /// let user = client.get_user_identity(&alice).await?; @@ -505,7 +505,7 @@ impl Client { /// # use futures::executor::block_on; /// # use serde_json::json; /// # block_on(async { - /// # let user_id = UserId::try_from("@alice:example.org")?; + /// # let user_id = Box::::try_from("@alice:example.org")?; /// # let homeserver = Url::parse("http://example.com")?; /// # let client = Client::new(homeserver)?; /// if let Err(e) = client.bootstrap_cross_signing(None).await { @@ -590,7 +590,7 @@ impl Client { /// let room_id = room_id!("!test:localhost"); /// /// client - /// .export_keys(path, "secret-passphrase", |s| s.room_id() == &room_id) + /// .export_keys(path, "secret-passphrase", |s| s.room_id() == room_id) /// .await?; /// # anyhow::Result::<()>::Ok(()) }); /// ``` @@ -722,7 +722,7 @@ impl Client { pub(crate) async fn keys_query( &self, request_id: &Uuid, - device_keys: BTreeMap>, + device_keys: BTreeMap, Vec>>, ) -> Result { let request = assign!(get_keys::Request::new(), { device_keys }); @@ -791,7 +791,7 @@ impl Client { } #[cfg(feature = "encryption")] - pub(crate) async fn create_dm_room(&self, user_id: UserId) -> Result> { + pub(crate) async fn create_dm_room(&self, user_id: Box) -> Result> { use ruma::{ api::client::r0::room::create_room::RoomPreset, events::AnyGlobalAccountDataEventContent, @@ -953,7 +953,7 @@ impl Client { rooms.iter().map(|r| (r.room_id().to_owned(), r.direct_target())).collect(); trace!(rooms =? room_pairs, "Finding direct room"); - let room = rooms.into_iter().find(|r| r.direct_target().as_ref() == Some(user_id)); + let room = rooms.into_iter().find(|r| r.direct_target().as_deref() == Some(user_id)); trace!(room =? room, "Found room"); room @@ -1011,7 +1011,7 @@ impl Client { // This is needed because sometimes we need to automatically // claim some one-time keys to unwedge an existing Olm session. - if let Err(e) = self.claim_one_time_keys([].iter()).await { + if let Err(e) = self.claim_one_time_keys(iter::empty()).await { warn!("Error while claiming one-time keys {:?}", e); } diff --git a/crates/matrix-sdk/src/event_handler.rs b/crates/matrix-sdk/src/event_handler.rs index 97993eed7e3..410401f571d 100644 --- a/crates/matrix-sdk/src/event_handler.rs +++ b/crates/matrix-sdk/src/event_handler.rs @@ -547,7 +547,7 @@ mod test { .add_ephemeral(EventsJson::Typing) .add_state_event(EventsJson::PowerLevels) .add_custom_invited_event( - &room_id!("!test_invited:example.org"), + room_id!("!test_invited:example.org"), json!({ "content": { "avatar_url": "mxc://example.org/SEsfnsuifSDFSSEF", diff --git a/crates/matrix-sdk/src/http_client.rs b/crates/matrix-sdk/src/http_client.rs index ee3173436ba..d25039b002a 100644 --- a/crates/matrix-sdk/src/http_client.rs +++ b/crates/matrix-sdk/src/http_client.rs @@ -193,7 +193,7 @@ impl HttpClient { .try_into_http_request_with_user_id::( &self.homeserver.read().await.to_string(), access_token, - user_id, + &user_id, )? .map(|body| body.freeze()); diff --git a/crates/matrix-sdk/src/room/common.rs b/crates/matrix-sdk/src/room/common.rs index f3622186101..2593e2bba5c 100644 --- a/crates/matrix-sdk/src/room/common.rs +++ b/crates/matrix-sdk/src/room/common.rs @@ -178,7 +178,7 @@ impl Common { self.client .inner .members_request_locks - .insert(self.inner.room_id().clone(), mutex.clone()); + .insert(self.inner.room_id().to_owned(), mutex.clone()); let _guard = mutex.lock().await; diff --git a/crates/matrix-sdk/src/room/joined.rs b/crates/matrix-sdk/src/room/joined.rs index 8ae09561c48..2583818b19b 100644 --- a/crates/matrix-sdk/src/room/joined.rs +++ b/crates/matrix-sdk/src/room/joined.rs @@ -199,7 +199,7 @@ impl Joined { self.client .inner .typing_notice_times - .insert(self.inner.room_id().clone(), Instant::now()); + .insert(self.inner.room_id().to_owned(), Instant::now()); Typing::Yes(TYPING_NOTICE_TIMEOUT) } else { self.client.inner.typing_notice_times.remove(self.inner.room_id()); @@ -325,7 +325,7 @@ impl Joined { self.client .inner .group_session_locks - .insert(self.inner.room_id().clone(), mutex.clone()); + .insert(self.inner.room_id().to_owned(), mutex.clone()); let _guard = mutex.lock().await; @@ -333,7 +333,7 @@ impl Joined { let joined = self.client.store().get_joined_user_ids(self.inner.room_id()).await?; let invited = self.client.store().get_invited_user_ids(self.inner.room_id()).await?; - let members = joined.iter().chain(&invited); + let members = joined.iter().chain(&invited).map(Deref::deref); self.client.claim_one_time_keys(members).await?; }; @@ -684,7 +684,7 @@ impl Joined { /// # let mut client = matrix_sdk::Client::new(homeserver)?; /// # let room_id = matrix_sdk::ruma::room_id!("!test:localhost"); /// - /// let avatar_url = mxc_uri!("mxc://example.org/avatar"); + /// let avatar_url = mxc_uri!("mxc://example.org/avatar").to_owned(); /// let content = assign!(RoomMemberEventContent::new(MembershipState::Join), { /// avatar_url: Some(avatar_url), /// }); diff --git a/crates/matrix-sdk/src/room_member.rs b/crates/matrix-sdk/src/room_member.rs index 488ffee8aa6..1d5c80aa50e 100644 --- a/crates/matrix-sdk/src/room_member.rs +++ b/crates/matrix-sdk/src/room_member.rs @@ -61,7 +61,7 @@ impl RoomMember { /// ``` pub async fn avatar(&self, format: MediaFormat) -> Result>> { if let Some(url) = self.avatar_url() { - let request = MediaRequest { media_type: MediaType::Uri(url.clone()), format }; + let request = MediaRequest { media_type: MediaType::Uri(url.to_owned()), format }; Ok(Some(self.client.get_media_content(&request, true).await?)) } else { Ok(None) From 557e038869ee9f72d289186ae30a61f8a9e1c64d Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 29 Nov 2021 13:27:38 +0100 Subject: [PATCH 2/4] Minimal style improvements --- crates/matrix-sdk-appservice/tests/tests.rs | 2 +- crates/matrix-sdk-base/src/client.rs | 2 +- crates/matrix-sdk-crypto/src/machine.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/matrix-sdk-appservice/tests/tests.rs b/crates/matrix-sdk-appservice/tests/tests.rs index 40bf54e4236..41529c5c543 100644 --- a/crates/matrix-sdk-appservice/tests/tests.rs +++ b/crates/matrix-sdk-appservice/tests/tests.rs @@ -294,7 +294,7 @@ async fn test_appservice_on_sub_path() -> Result<()> { let members = appservice .get_cached_client(None)? - .get_room(&room_id) + .get_room(room_id) .expect("Expected room to be available") .members_no_sync() .await?; diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index 2882a7fe44c..ae2617ecdfb 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -755,7 +755,7 @@ impl BaseClient { o.update_tracked_users(user_ids).await } - o.update_tracked_users(user_ids.iter().map(|x| &**x)).await + o.update_tracked_users(user_ids.iter().map(|x| &**x)).await; } } diff --git a/crates/matrix-sdk-crypto/src/machine.rs b/crates/matrix-sdk-crypto/src/machine.rs index aca4dc4c880..150b018ddb9 100644 --- a/crates/matrix-sdk-crypto/src/machine.rs +++ b/crates/matrix-sdk-crypto/src/machine.rs @@ -1205,7 +1205,7 @@ impl OlmMachine { /// If the user is already known to the Olm machine it will not be /// considered for a key query. pub async fn update_tracked_users(&self, users: impl IntoIterator) { - self.identity_manager.update_tracked_users(users).await + self.identity_manager.update_tracked_users(users).await; } /// Get a specific device of a user. From dfd59f42a98f9d483fa742f35fb77ecc0fd87eae Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 29 Nov 2021 13:36:05 +0100 Subject: [PATCH 3/4] Fix warp build error --- crates/matrix-sdk-base/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index ae2617ecdfb..b5022a196c2 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -755,7 +755,7 @@ impl BaseClient { o.update_tracked_users(user_ids).await } - o.update_tracked_users(user_ids.iter().map(|x| &**x)).await; + o.update_tracked_users(user_ids.iter().map(Deref::deref)).await; } } From 5824cb649e9a0f5d9d6e4effee2b79eadb53dbb4 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 29 Nov 2021 14:30:45 +0100 Subject: [PATCH 4/4] Update tests --- crates/matrix-sdk-base/src/client.rs | 4 ++-- crates/matrix-sdk-crypto/README.md | 5 ++++- .../src/file_encryption/key_export.rs | 6 +++--- crates/matrix-sdk-crypto/src/machine.rs | 14 +++++++------- crates/matrix-sdk-crypto/src/store/mod.rs | 6 +++--- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index b5022a196c2..b05647a9cc7 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -1146,9 +1146,9 @@ impl BaseClient { /// ``` /// # use std::convert::TryFrom; /// # use matrix_sdk_base::BaseClient; - /// # use ruma::UserId; + /// # use ruma::{device_id, user_id}; /// # use futures::executor::block_on; - /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let alice = user_id!("@alice:example.org").to_owned(); /// # let client = BaseClient::new().unwrap(); /// # block_on(async { /// let device = client.get_device(&alice, device_id!("DEVICEID")).await; diff --git a/crates/matrix-sdk-crypto/README.md b/crates/matrix-sdk-crypto/README.md index 66f95e791ef..f48d9b8bfe4 100644 --- a/crates/matrix-sdk-crypto/README.md +++ b/crates/matrix-sdk-crypto/README.md @@ -20,7 +20,10 @@ The state machine works in a push/pull manner: use std::{collections::BTreeMap, convert::TryFrom}; use matrix_sdk_crypto::{OlmMachine, OlmError}; -use ruma::{UserId, api::client::r0::sync::sync_events::{ToDevice, DeviceLists}}; +use ruma::{ + api::client::r0::sync::sync_events::{ToDevice, DeviceLists}, + device_id, UserId, +}; #[tokio::main] async fn main() -> Result<(), OlmError> { diff --git a/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs b/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs index 750b96c4c99..39a97d20370 100644 --- a/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs +++ b/crates/matrix-sdk-crypto/src/file_encryption/key_export.rs @@ -76,7 +76,7 @@ pub enum KeyExportError { /// ```no_run /// # use std::io::Cursor; /// # use matrix_sdk_crypto::{OlmMachine, decrypt_key_export}; -/// # use ruma::user_id; +/// # use ruma::{device_id, user_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); @@ -127,13 +127,13 @@ pub fn decrypt_key_export( /// # Examples /// ```no_run /// # use matrix_sdk_crypto::{OlmMachine, encrypt_key_export}; -/// # use ruma::{user_id, room_id}; +/// # use ruma::{device_id, user_id, room_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let room_id = room_id!("!test:localhost"); -/// let exported_keys = machine.export_keys(|s| s.room_id() == &room_id).await.unwrap(); +/// let exported_keys = machine.export_keys(|s| s.room_id() == room_id).await.unwrap(); /// let encrypted_export = encrypt_key_export(&exported_keys, "1234", 1); /// # }); /// ``` diff --git a/crates/matrix-sdk-crypto/src/machine.rs b/crates/matrix-sdk-crypto/src/machine.rs index 150b018ddb9..f51ff442956 100644 --- a/crates/matrix-sdk-crypto/src/machine.rs +++ b/crates/matrix-sdk-crypto/src/machine.rs @@ -1224,9 +1224,9 @@ impl OlmMachine { /// ``` /// # use std::convert::TryFrom; /// # use matrix_sdk_crypto::OlmMachine; - /// # use ruma::UserId; + /// # use ruma::{device_id, user_id}; /// # use futures::executor::block_on; - /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let alice = user_id!("@alice:example.org").to_owned(); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let device = machine.get_device(&alice, device_id!("DEVICEID")).await; @@ -1265,9 +1265,9 @@ impl OlmMachine { /// ``` /// # use std::convert::TryFrom; /// # use matrix_sdk_crypto::OlmMachine; - /// # use ruma::UserId; + /// # use ruma::{device_id, user_id}; /// # use futures::executor::block_on; - /// # let alice = Box::::try_from("@alice:example.org").unwrap(); + /// # let alice = user_id!("@alice:example.org").to_owned(); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let devices = machine.get_user_devices(&alice).await.unwrap(); @@ -1301,7 +1301,7 @@ impl OlmMachine { /// ```no_run /// # use std::io::Cursor; /// # use matrix_sdk_crypto::{OlmMachine, decrypt_key_export}; - /// # use ruma::user_id; + /// # use ruma::{device_id, user_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); @@ -1413,13 +1413,13 @@ impl OlmMachine { /// /// ```no_run /// # use matrix_sdk_crypto::{OlmMachine, encrypt_key_export}; - /// # use ruma::{user_id, room_id}; + /// # use ruma::{device_id, user_id, room_id}; /// # use futures::executor::block_on; /// # let alice = user_id!("@alice:example.org"); /// # let machine = OlmMachine::new(&alice, device_id!("DEVICEID")); /// # block_on(async { /// let room_id = room_id!("!test:localhost"); - /// let exported_keys = machine.export_keys(|s| s.room_id() == &room_id).await.unwrap(); + /// let exported_keys = machine.export_keys(|s| s.room_id() == room_id).await.unwrap(); /// let encrypted_export = encrypt_key_export(&exported_keys, "1234", 1); /// # }); /// ``` diff --git a/crates/matrix-sdk-crypto/src/store/mod.rs b/crates/matrix-sdk-crypto/src/store/mod.rs index f91d7067f31..371ba4a11b6 100644 --- a/crates/matrix-sdk-crypto/src/store/mod.rs +++ b/crates/matrix-sdk-crypto/src/store/mod.rs @@ -26,9 +26,9 @@ //! # OlmMachine, //! # store::MemoryStore, //! # }; -//! # use ruma::{user_id, DeviceId}; -//! # let user_id = user_id!("@example:localhost"); -//! # let device_id: Box = device_id!("TEST"); +//! # use ruma::{device_id, user_id}; +//! # let user_id = user_id!("@example:localhost").to_owned(); +//! # let device_id = device_id!("TEST").to_owned(); //! let store = Box::new(MemoryStore::new()); //! //! let machine = OlmMachine::new_with_store(user_id, device_id, store);