From db9b3febd3f81e72964544aa96357a1dec4a6d6c Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 25 Mar 2022 13:53:53 +0100 Subject: [PATCH] Upgrade Ruma --- crates/matrix-qrcode/Cargo.toml | 3 +- crates/matrix-qrcode/src/error.rs | 2 +- crates/matrix-qrcode/src/types.rs | 3 +- crates/matrix-qrcode/src/utils.rs | 2 +- crates/matrix-sdk-appservice/Cargo.toml | 2 +- crates/matrix-sdk-appservice/src/error.rs | 2 +- crates/matrix-sdk-appservice/src/lib.rs | 6 +- crates/matrix-sdk-base/Cargo.toml | 2 +- crates/matrix-sdk-base/src/client.rs | 22 +- crates/matrix-sdk-base/src/media.rs | 196 +++--------------- crates/matrix-sdk-base/src/rooms/normal.rs | 8 +- .../src/store/integration_tests.rs | 21 +- .../matrix-sdk-base/src/store/memory_store.rs | 45 ++-- crates/matrix-sdk-base/src/store/mod.rs | 25 ++- crates/matrix-sdk-common/Cargo.toml | 2 +- .../src/deserialized_responses.rs | 32 ++- crates/matrix-sdk-crypto/Cargo.toml | 3 +- crates/matrix-sdk-crypto/src/error.rs | 4 +- crates/matrix-sdk-crypto/src/machine.rs | 27 +-- crates/matrix-sdk-crypto/src/olm/mod.rs | 8 +- crates/matrix-sdk-crypto/src/requests.rs | 10 +- crates/matrix-sdk-crypto/src/store/mod.rs | 5 +- .../src/verification/event_enums.rs | 96 +++++---- .../matrix-sdk-crypto/src/verification/mod.rs | 10 +- .../src/verification/qrcode.rs | 8 +- .../src/verification/requests.rs | 4 +- .../src/verification/sas/helpers.rs | 20 +- .../src/verification/sas/mod.rs | 4 +- .../src/verification/sas/sas_state.rs | 28 +-- .../matrix-sdk-indexeddb/src/safe_encode.rs | 10 +- .../matrix-sdk-indexeddb/src/state_store.rs | 20 +- crates/matrix-sdk-sled/src/state_store.rs | 46 ++-- crates/matrix-sdk-test/Cargo.toml | 2 +- crates/matrix-sdk/Cargo.toml | 5 +- .../matrix-sdk/examples/emoji_verification.rs | 10 +- .../examples/wasm_command_bot/src/lib.rs | 10 +- crates/matrix-sdk/src/account.rs | 5 +- crates/matrix-sdk/src/attachment.rs | 10 +- crates/matrix-sdk/src/client/builder.rs | 2 +- crates/matrix-sdk/src/client/mod.rs | 54 ++--- crates/matrix-sdk/src/encryption/mod.rs | 39 ++-- crates/matrix-sdk/src/error.rs | 12 +- crates/matrix-sdk/src/event_handler.rs | 30 +-- crates/matrix-sdk/src/room/common.rs | 12 +- crates/matrix-sdk/src/room/joined.rs | 38 ++-- crates/matrix-sdk/src/room_member.rs | 6 +- 46 files changed, 407 insertions(+), 504 deletions(-) diff --git a/crates/matrix-qrcode/Cargo.toml b/crates/matrix-qrcode/Cargo.toml index 94ff40c8a..9b522140d 100644 --- a/crates/matrix-qrcode/Cargo.toml +++ b/crates/matrix-qrcode/Cargo.toml @@ -24,8 +24,7 @@ base64 = "0.13.0" byteorder = "1.4.3" image = { version = "0.23.14", optional = true } qrcode = { version = "0.12.0", default-features = false } -ruma-identifiers = "0.22.0" -ruma-serde = "0.6.0" +ruma-common = { git = "https://github.com/ruma/ruma", rev = "deea762b8" } rqrr = { version = "0.4.0", optional = true } thiserror = "1.0.25" diff --git a/crates/matrix-qrcode/src/error.rs b/crates/matrix-qrcode/src/error.rs index 307038af1..92f1159a9 100644 --- a/crates/matrix-qrcode/src/error.rs +++ b/crates/matrix-qrcode/src/error.rs @@ -32,7 +32,7 @@ pub enum DecodingError { Mode(u8), /// The flow id is not a valid event ID. #[error(transparent)] - Identifier(#[from] ruma_identifiers::Error), + Identifier(#[from] ruma_common::IdParseError), #[error(transparent)] /// The QR code data does not contain all the necessary fields. Read(#[from] std::io::Error), diff --git a/crates/matrix-qrcode/src/types.rs b/crates/matrix-qrcode/src/types.rs index 0f0609978..c07a051b4 100644 --- a/crates/matrix-qrcode/src/types.rs +++ b/crates/matrix-qrcode/src/types.rs @@ -21,8 +21,7 @@ use byteorder::{BigEndian, ReadBytesExt}; #[cfg(feature = "decode_image")] use image::{DynamicImage, GenericImage, GenericImageView, ImageBuffer, Luma}; use qrcode::QrCode; -use ruma_identifiers::EventId; -use ruma_serde::Base64; +use ruma_common::{serde::Base64, EventId}; use vodozemac::Ed25519PublicKey; #[cfg(feature = "decode_image")] diff --git a/crates/matrix-qrcode/src/utils.rs b/crates/matrix-qrcode/src/utils.rs index b2468cbc6..14812cabc 100644 --- a/crates/matrix-qrcode/src/utils.rs +++ b/crates/matrix-qrcode/src/utils.rs @@ -17,7 +17,7 @@ use std::convert::TryInto; #[cfg(feature = "decode_image")] use image::{GenericImage, GenericImageView, Luma}; use qrcode::{bits::Bits, EcLevel, QrCode, Version}; -use ruma_serde::Base64; +use ruma_common::serde::Base64; use vodozemac::Ed25519PublicKey; #[cfg(feature = "decode_image")] diff --git a/crates/matrix-sdk-appservice/Cargo.toml b/crates/matrix-sdk-appservice/Cargo.toml index a1649ea5e..c96c506d2 100644 --- a/crates/matrix-sdk-appservice/Cargo.toml +++ b/crates/matrix-sdk-appservice/Cargo.toml @@ -29,7 +29,7 @@ http = "0.2" matrix-sdk = { version = "0.4", path = "../matrix-sdk", default-features = false, features = ["appservice"] } percent-encoding = "2.1.0" regex = "1" -ruma = { version = "0.5.0", features = ["client-api-c", "appservice-api-s"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "deea762b8", features = ["client-api-c", "appservice-api-s"] } serde = "1" serde_json = "1" serde_yaml = "0.8" diff --git a/crates/matrix-sdk-appservice/src/error.rs b/crates/matrix-sdk-appservice/src/error.rs index ccdc0f0c5..de3d15ed2 100644 --- a/crates/matrix-sdk-appservice/src/error.rs +++ b/crates/matrix-sdk-appservice/src/error.rs @@ -45,7 +45,7 @@ pub enum Error { HttpRequest(#[from] ruma::api::error::FromHttpRequestError), #[error(transparent)] - Identifier(#[from] ruma::identifiers::Error), + Identifier(#[from] ruma::IdParseError), #[error(transparent)] Http(#[from] http::Error), diff --git a/crates/matrix-sdk-appservice/src/lib.rs b/crates/matrix-sdk-appservice/src/lib.rs index b16d6b3ef..b62278e4a 100644 --- a/crates/matrix-sdk-appservice/src/lib.rs +++ b/crates/matrix-sdk-appservice/src/lib.rs @@ -103,7 +103,7 @@ use ruma::{ }, client::account::register, }, - assign, identifiers, DeviceId, ServerName, UserId, + assign, DeviceId, IdParseError, ServerName, UserId, }; use serde::de::DeserializeOwned; use tracing::info; @@ -223,7 +223,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, Error = identifiers::Error>, + server_name: impl TryInto, Error = IdParseError>, registration: AppServiceRegistration, ) -> Result { let appservice = @@ -237,7 +237,7 @@ impl AppService { /// for the [`Client`] pub async fn with_client_builder( homeserver_url: impl TryInto, - server_name: impl TryInto, Error = identifiers::Error>, + server_name: impl TryInto, Error = IdParseError>, registration: AppServiceRegistration, builder: ClientBuilder, ) -> Result { diff --git a/crates/matrix-sdk-base/Cargo.toml b/crates/matrix-sdk-base/Cargo.toml index ed7ed3552..d786c5550 100644 --- a/crates/matrix-sdk-base/Cargo.toml +++ b/crates/matrix-sdk-base/Cargo.toml @@ -44,7 +44,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.10.0", default-features = false, optional = true } rand = { version = "0.8.4", optional = true } -ruma = { version = "0.5.0", features = ["client-api-c", "signatures", "unstable-pre-spec"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "deea762b8", features = ["client-api-c", "signatures"] } serde = { version = "1.0.126", features = ["rc"] } serde_json = "1.0.64" sha2 = { version = "0.10.1", optional = true } diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index 994ea9925..5d7e3516c 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -45,7 +45,7 @@ use ruma::{ api::client::keys::claim_keys::v3::Request as KeysClaimRequest, events::{ room::{encrypted::RoomEncryptedEventContent, history_visibility::HistoryVisibility}, - AnySyncMessageEvent, MessageEventContent, + AnySyncMessageLikeEvent, EventContent, MessageLikeEventType, }, DeviceId, TransactionId, }; @@ -54,7 +54,7 @@ use ruma::{ events::{ room::member::MembershipState, AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnyStrippedStateEvent, AnySyncEphemeralRoomEvent, AnySyncRoomEvent, AnySyncStateEvent, - EventContent, GlobalAccountDataEventType, StateEventType, + GlobalAccountDataEventType, StateEventType, }, push::{Action, PushConditionRoomCtx, Ruleset}, serde::Raw, @@ -300,7 +300,7 @@ impl BaseClient { }, #[cfg(feature = "encryption")] - AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomEncrypted( + AnySyncRoomEvent::MessageLike(AnySyncMessageLikeEvent::RoomEncrypted( encrypted, )) => { if let Some(olm) = self.olm_machine().await { @@ -367,7 +367,7 @@ impl BaseClient { room_info: &mut RoomInfo, ) -> ( BTreeMap, StrippedMemberEvent>, - BTreeMap>>, + BTreeMap>>, ) { events.iter().fold( (BTreeMap::new(), BTreeMap::new()), @@ -387,7 +387,7 @@ impl BaseClient { Ok(e) => { room_info.handle_state_event(&e.content()); state_events - .entry(e.content().event_type().to_owned()) + .entry(e.event_type()) .or_insert_with(BTreeMap::new) .insert(e.state_key().to_owned(), raw_event.clone()); } @@ -460,7 +460,7 @@ impl BaseClient { } } else { state_events - .entry(event.content().event_type().to_owned()) + .entry(event.event_type()) .or_insert_with(BTreeMap::new) .insert(event.state_key().to_owned(), raw_event.clone()); } @@ -522,7 +522,7 @@ impl BaseClient { } } - account_data.insert(event.content().event_type().to_owned(), raw_event.clone()); + account_data.insert(event.event_type(), raw_event.clone()); } changes.account_data = account_data; @@ -1020,7 +1020,7 @@ impl BaseClient { pub async fn encrypt( &self, room_id: &RoomId, - content: impl MessageEventContent, + content: impl EventContent, ) -> Result { match self.olm_machine().await { Some(o) => Ok(o.encrypt(room_id, content).await?), @@ -1156,7 +1156,7 @@ impl BaseClient { pub async fn get_push_rules(&self, changes: &StateChanges) -> Result { if let Some(AnyGlobalAccountDataEvent::PushRules(event)) = changes .account_data - .get(GlobalAccountDataEventType::PushRules.as_str()) + .get(&GlobalAccountDataEventType::PushRules) .and_then(|e| e.deserialize().ok()) { Ok(event.content.global) @@ -1205,7 +1205,7 @@ impl BaseClient { let room_power_levels = if let Some(AnySyncStateEvent::RoomPowerLevels(event)) = changes .state .get(room_id) - .and_then(|types| types.get(StateEventType::RoomPowerLevels.as_str())) + .and_then(|types| types.get(&StateEventType::RoomPowerLevels)) .and_then(|events| events.get("")) .and_then(|e| e.deserialize().ok()) { @@ -1255,7 +1255,7 @@ impl BaseClient { if let Some(AnySyncStateEvent::RoomPowerLevels(event)) = changes .state .get(&**room_id) - .and_then(|types| types.get(StateEventType::RoomPowerLevels.as_str())) + .and_then(|types| types.get(&StateEventType::RoomPowerLevels)) .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 a8e12ceb3..c2018e89a 100644 --- a/crates/matrix-sdk-base/src/media.rs +++ b/crates/matrix-sdk-base/src/media.rs @@ -8,11 +8,11 @@ use ruma::{ AudioMessageEventContent, FileMessageEventContent, ImageMessageEventContent, LocationMessageEventContent, VideoMessageEventContent, }, - EncryptedFile, + MediaSource, }, sticker::StickerEventContent, }, - MxcUri, UInt, + UInt, }; const UNIQUE_SEPARATOR: &str = "_"; @@ -64,20 +64,10 @@ impl UniqueKey for MediaThumbnailSize { } } -/// A request for media data. -#[derive(Clone, Debug)] -pub enum MediaType { - /// A media content URI. - Uri(Box), - - /// An encrypted media content. - Encrypted(Box), -} - -impl UniqueKey for MediaType { +impl UniqueKey for MediaSource { fn unique_key(&self) -> String { match self { - Self::Uri(uri) => uri.to_string(), + Self::Plain(uri) => uri.to_string(), Self::Encrypted(file) => file.url.to_string(), } } @@ -86,8 +76,8 @@ impl UniqueKey for MediaType { /// A request for media data. #[derive(Clone, Debug)] pub struct MediaRequest { - /// The type of the media file. - pub media_type: MediaType, + /// The source of the media file. + pub source: MediaSource, /// The requested format of the media data. pub format: MediaFormat, @@ -95,202 +85,84 @@ pub struct MediaRequest { impl UniqueKey for MediaRequest { fn unique_key(&self) -> String { - format!("{}{}{}", self.media_type.unique_key(), UNIQUE_SEPARATOR, self.format.unique_key()) + format!("{}{}{}", self.source.unique_key(), UNIQUE_SEPARATOR, self.format.unique_key()) } } - /// Trait for media event content. pub trait MediaEventContent { - /// Get the type of the file for `Self`. + /// Get the source of the file for `Self`. /// /// Returns `None` if `Self` has no file. - fn file(&self) -> Option; + fn source(&self) -> Option; - /// Get the type of the thumbnail for `Self`. + /// Get the source of the thumbnail for `Self`. /// /// Returns `None` if `Self` has no thumbnail. - fn thumbnail(&self) -> Option; + fn thumbnail_source(&self) -> Option; } impl MediaEventContent for StickerEventContent { - fn file(&self) -> Option { - Some(MediaType::Uri(self.url.clone())) + fn source(&self) -> Option { + Some(MediaSource::Plain(self.url.clone())) } - fn thumbnail(&self) -> Option { + fn thumbnail_source(&self) -> Option { None } } impl MediaEventContent for AudioMessageEventContent { - fn file(&self) -> Option { - self.file - .as_ref() - .map(|e| MediaType::Encrypted(e.clone())) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + fn source(&self) -> Option { + Some(self.source.clone()) } - fn thumbnail(&self) -> Option { + fn thumbnail_source(&self) -> Option { None } } impl MediaEventContent for FileMessageEventContent { - fn file(&self) -> Option { - self.file - .as_ref() - .map(|e| MediaType::Encrypted(e.clone())) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + fn source(&self) -> Option { + Some(self.source.clone()) } - fn thumbnail(&self) -> Option { - self.info.as_ref().and_then(|info| { - info.thumbnail_file - .as_ref() - .map(|file| MediaType::Encrypted(file.clone())) - .or_else(|| info.thumbnail_url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) - }) + fn thumbnail_source(&self) -> Option { + self.info.as_ref()?.thumbnail_source.clone() } } impl MediaEventContent for ImageMessageEventContent { - fn file(&self) -> Option { - self.file - .as_ref() - .map(|e| MediaType::Encrypted(e.clone())) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + fn source(&self) -> Option { + Some(self.source.clone()) } - fn thumbnail(&self) -> Option { + fn thumbnail_source(&self) -> Option { self.info .as_ref() - .and_then(|info| { - info.thumbnail_file - .as_ref() - .map(|file| MediaType::Encrypted(file.clone())) - .or_else(|| info.thumbnail_url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) - }) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + .and_then(|info| info.thumbnail_source.clone()) + .or_else(|| Some(self.source.clone())) } } impl MediaEventContent for VideoMessageEventContent { - fn file(&self) -> Option { - self.file - .as_ref() - .map(|e| MediaType::Encrypted(e.clone())) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + fn source(&self) -> Option { + Some(self.source.clone()) } - fn thumbnail(&self) -> Option { + fn thumbnail_source(&self) -> Option { self.info .as_ref() - .and_then(|info| { - info.thumbnail_file - .as_ref() - .map(|file| MediaType::Encrypted(file.clone())) - .or_else(|| info.thumbnail_url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) - }) - .or_else(|| self.url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) + .and_then(|info| info.thumbnail_source.clone()) + .or_else(|| Some(self.source.clone())) } } impl MediaEventContent for LocationMessageEventContent { - fn file(&self) -> Option { + fn source(&self) -> Option { None } - fn thumbnail(&self) -> Option { - self.info.as_ref().and_then(|info| { - info.thumbnail_file - .as_ref() - .map(|file| MediaType::Encrypted(file.clone())) - .or_else(|| info.thumbnail_url.as_ref().map(|uri| MediaType::Uri(uri.clone()))) - }) - } -} - -#[cfg(all(feature = "encryption", test))] -pub(crate) mod test { - use ruma::events::room::{ - message::{FileInfo, LocationInfo, VideoInfo}, - ImageInfo, - }; - - use super::*; - - fn encrypted_test_data() -> (Box, EncryptedFile) { - let c = &mut std::io::Cursor::new("some content"); - let reader = crate::crypto::AttachmentEncryptor::new(c); - - let keys = reader.finish(); - let file: EncryptedFile = ruma::events::room::EncryptedFileInit { - url: "foobar".into(), - key: keys.web_key, - iv: keys.iv, - hashes: keys.hashes, - v: keys.version, - } - .into(); - let url = file.url.clone(); - (url, file) - } - - #[test] - fn test_audio_content_prefer_crypt_type() { - let (u, f) = encrypted_test_data(); - let mut c = AudioMessageEventContent::encrypted("foo".to_owned(), f); - c.url = Some(u); - assert!(matches!(c.file(), Some(MediaType::Encrypted(_)))); - } - - #[test] - fn test_file_content_prefer_crypt_type() { - let (u, f) = encrypted_test_data(); - let mut c = FileMessageEventContent::encrypted("foo".to_owned(), f.clone()); - c.url = Some(u.clone()); - let mut info = FileInfo::default(); - info.thumbnail_url = Some(u); - info.thumbnail_file = Some(Box::new(f)); - c.info = Some(Box::new(info)); - assert!(matches!(c.file(), Some(MediaType::Encrypted(_)))); - assert!(matches!(c.thumbnail(), Some(MediaType::Encrypted(_)))); - } - - #[test] - fn test_image_content_prefer_crypt_type() { - let (u, f) = encrypted_test_data(); - let mut c = ImageMessageEventContent::encrypted("foo".to_owned(), f.clone()); - c.url = Some(u.clone()); - let mut info = ImageInfo::default(); - info.thumbnail_url = Some(u); - info.thumbnail_file = Some(Box::new(f)); - c.info = Some(Box::new(info)); - assert!(matches!(c.file(), Some(MediaType::Encrypted(_)))); - assert!(matches!(c.thumbnail(), Some(MediaType::Encrypted(_)))); - } - - #[test] - fn test_video_content_prefer_crypt_type() { - let (u, f) = encrypted_test_data(); - let mut c = VideoMessageEventContent::encrypted("foo".to_owned(), f.clone()); - c.url = Some(u.clone()); - let mut info = VideoInfo::default(); - info.thumbnail_url = Some(u); - info.thumbnail_file = Some(Box::new(f)); - c.info = Some(Box::new(info)); - assert!(matches!(c.file(), Some(MediaType::Encrypted(_)))); - assert!(matches!(c.thumbnail(), Some(MediaType::Encrypted(_)))); - } - - #[test] - fn test_location_content_prefer_crypt_type() { - let (u, f) = encrypted_test_data(); - let mut c = LocationMessageEventContent::new("foo".to_owned(), "27,37".to_owned()); - let mut info = LocationInfo::default(); - info.thumbnail_url = Some(u); - info.thumbnail_file = Some(Box::new(f)); - c.info = Some(Box::new(info)); - assert!(matches!(c.thumbnail(), Some(MediaType::Encrypted(_)))); + fn thumbnail_source(&self) -> Option { + self.info.as_ref()?.thumbnail_source.clone() } } diff --git a/crates/matrix-sdk-base/src/rooms/normal.rs b/crates/matrix-sdk-base/src/rooms/normal.rs index b759546dc..efb1375a1 100644 --- a/crates/matrix-sdk-base/src/rooms/normal.rs +++ b/crates/matrix-sdk-base/src/rooms/normal.rs @@ -24,11 +24,8 @@ use ruma::{ events::{ receipt::Receipt, room::{ - create::{RoomCreateEventContent, RoomType as CreateRoomType}, - encryption::RoomEncryptionEventContent, - guest_access::GuestAccess, - history_visibility::HistoryVisibility, - join_rules::JoinRule, + create::RoomCreateEventContent, encryption::RoomEncryptionEventContent, + guest_access::GuestAccess, history_visibility::HistoryVisibility, join_rules::JoinRule, tombstone::RoomTombstoneEventContent, }, tag::Tags, @@ -36,6 +33,7 @@ use ruma::{ StateEventType, }, receipt::ReceiptType, + room::RoomType as CreateRoomType, EventId, MxcUri, RoomAliasId, RoomId, UserId, }; use serde::{Deserialize, Serialize}; diff --git a/crates/matrix-sdk-base/src/store/integration_tests.rs b/crates/matrix-sdk-base/src/store/integration_tests.rs index 5ab49d835..1d6062018 100644 --- a/crates/matrix-sdk-base/src/store/integration_tests.rs +++ b/crates/matrix-sdk-base/src/store/integration_tests.rs @@ -46,15 +46,16 @@ macro_rules! statestore_integration_tests { }, device_id, event_id, events::{ - presence::PresenceEvent, EventContent, + presence::PresenceEvent, room::{ member::{MembershipState, RoomMemberEventContent}, power_levels::RoomPowerLevelsEventContent, + MediaSource, }, AnyEphemeralRoomEventContent, AnySyncEphemeralRoomEvent, AnyStrippedStateEvent, AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, - StateEventType, Unsigned, + StateEventType, StateUnsigned, }, mxc_uri, receipt::ReceiptType, @@ -70,7 +71,7 @@ macro_rules! statestore_integration_tests { http::Response, RoomType, Session, deserialized_responses::{MemberEvent, StrippedMemberEvent, RoomEvent, SyncRoomEvent, TimelineSlice}, - media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType}, + media::{MediaFormat, MediaRequest, MediaThumbnailSize}, store::{ Store, StateStore, @@ -216,7 +217,7 @@ macro_rules! statestore_integration_tests { changes.stripped_state.insert( stripped_room_id.to_owned(), BTreeMap::from([( - stripped_name_event.content().event_type().to_owned(), + stripped_name_event.event_type(), BTreeMap::from([( stripped_name_event.state_key().to_owned(), stripped_name_raw.clone(), @@ -245,7 +246,6 @@ macro_rules! statestore_integration_tests { "type": "m.room.power_levels", "origin_server_ts": 0u64, "state_key": "", - "unsigned": Unsigned::default(), }); serde_json::from_value(event).unwrap() @@ -262,8 +262,7 @@ macro_rules! statestore_integration_tests { sender: user_id.to_owned(), origin_server_ts: MilliSecondsSinceUnixEpoch(198u32.into()), state_key: user_id.to_owned(), - prev_content: None, - unsigned: Unsigned::default(), + unsigned: StateUnsigned::default(), } } @@ -454,11 +453,13 @@ macro_rules! statestore_integration_tests { let uri = mxc_uri!("mxc://localhost/media"); let content: Vec = "somebinarydata".into(); - let request_file = - MediaRequest { media_type: MediaType::Uri(uri.to_owned()), format: MediaFormat::File }; + let request_file = MediaRequest { + source: MediaSource::Plain(uri.to_owned()), + format: MediaFormat::File, + }; let request_thumbnail = MediaRequest { - media_type: MediaType::Uri(uri.to_owned()), + source: MediaSource::Plain(uri.to_owned()), format: MediaFormat::Thumbnail(MediaThumbnailSize { method: Method::Crop, width: uint!(100), diff --git a/crates/matrix-sdk-base/src/store/memory_store.rs b/crates/matrix-sdk-base/src/store/memory_store.rs index ea251a1c6..9c466d6f3 100644 --- a/crates/matrix-sdk-base/src/store/memory_store.rs +++ b/crates/matrix-sdk-base/src/store/memory_store.rs @@ -28,7 +28,7 @@ use ruma::{ receipt::Receipt, room::member::{MembershipState, RoomMemberEventContent}, AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnyStrippedStateEvent, - AnySyncMessageEvent, AnySyncRoomEvent, AnySyncStateEvent, GlobalAccountDataEventType, + AnySyncMessageLikeEvent, AnySyncRoomEvent, AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, }, receipt::ReceiptType, @@ -54,18 +54,21 @@ use crate::{ pub struct MemoryStore { sync_token: Arc>>, filters: Arc>, - account_data: Arc>>, + account_data: Arc>>, 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>>>, + room_state: + Arc, DashMap>>>>, + room_account_data: + Arc, DashMap>>>, stripped_room_infos: Arc, RoomInfo>>, - stripped_room_state: - Arc, DashMap>>>>, + stripped_room_state: Arc< + DashMap, DashMap>>>, + >, stripped_members: Arc, DashMap, StrippedMemberEvent>>>, presence: Arc, Raw>>, room_user_receipts: @@ -194,7 +197,7 @@ impl MemoryStore { } for (event_type, event) in &changes.account_data { - self.account_data.insert(event_type.to_string(), event.clone()); + self.account_data.insert(event_type.clone(), event.clone()); } for (room, events) in &changes.room_account_data { @@ -202,7 +205,7 @@ impl MemoryStore { self.room_account_data .entry(room.clone()) .or_insert_with(DashMap::new) - .insert(event_type.to_string(), event.clone()); + .insert(event_type.clone(), event.clone()); } } @@ -212,7 +215,7 @@ impl MemoryStore { self.room_state .entry(room.clone()) .or_insert_with(DashMap::new) - .entry(event_type.to_owned()) + .entry(event_type.clone()) .or_insert_with(DashMap::new) .insert(state_key.to_owned(), event.clone()); } @@ -246,7 +249,7 @@ impl MemoryStore { self.stripped_room_state .entry(room.clone()) .or_insert_with(DashMap::new) - .entry(event_type.to_owned()) + .entry(event_type.clone()) .or_insert_with(DashMap::new) .insert(state_key.to_owned(), event.clone()); } @@ -357,9 +360,9 @@ impl MemoryStore { let mut room_version = None; for event in &timeline.events { // Redact events already in store only on sync response - if let Ok(AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomRedaction( - redaction, - ))) = event.event.deserialize() + if let Ok(AnySyncRoomEvent::MessageLike( + AnySyncMessageLikeEvent::RoomRedaction(redaction), + )) = event.event.deserialize() { let pos = data.event_id_to_position.get(&redaction.redacts).copied(); @@ -412,9 +415,10 @@ impl MemoryStore { event_type: StateEventType, state_key: &str, ) -> Result>> { - Ok(self.room_state.get(room_id).and_then(|e| { - e.get(event_type.as_ref()).and_then(|s| s.get(state_key).map(|e| e.clone())) - })) + Ok(self + .room_state + .get(room_id) + .and_then(|e| e.get(&event_type).and_then(|s| s.get(state_key).map(|e| e.clone())))) } async fn get_state_events( @@ -426,7 +430,7 @@ impl MemoryStore { .room_state .get(room_id) .and_then(|e| { - e.get(event_type.as_ref()).map(|s| s.iter().map(|e| e.clone()).collect::>()) + e.get(&event_type).map(|s| s.iter().map(|e| e.clone()).collect::>()) }) .unwrap_or_default()) } @@ -480,7 +484,7 @@ impl MemoryStore { &self, event_type: GlobalAccountDataEventType, ) -> Result>> { - Ok(self.account_data.get(event_type.as_ref()).map(|e| e.clone())) + Ok(self.account_data.get(&event_type).map(|e| e.clone())) } async fn get_room_account_data_event( @@ -488,10 +492,7 @@ impl MemoryStore { room_id: &RoomId, event_type: RoomAccountDataEventType, ) -> Result>> { - Ok(self - .room_account_data - .get(room_id) - .and_then(|m| m.get(event_type.as_ref()).map(|e| e.clone()))) + Ok(self.room_account_data.get(room_id).and_then(|m| m.get(&event_type).map(|e| e.clone()))) } async fn get_user_room_receipt_event( diff --git a/crates/matrix-sdk-base/src/store/mod.rs b/crates/matrix-sdk-base/src/store/mod.rs index 7fb043cf6..50dd0e36f 100644 --- a/crates/matrix-sdk-base/src/store/mod.rs +++ b/crates/matrix-sdk-base/src/store/mod.rs @@ -43,8 +43,7 @@ use ruma::{ receipt::{Receipt, ReceiptEventContent}, room::member::RoomMemberEventContent, AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnyStrippedStateEvent, - AnySyncStateEvent, EventContent, GlobalAccountDataEventType, RoomAccountDataEventType, - StateEventType, + AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, }, receipt::ReceiptType, serde::Raw, @@ -81,7 +80,7 @@ pub enum StoreError { /// An error happened while deserializing a Matrix identifier, e.g. an user /// id. #[error(transparent)] - Identifier(#[from] ruma::identifiers::Error), + Identifier(#[from] ruma::IdParseError), /// The store is locked with a passphrase and an incorrect passphrase was /// given. #[error("The store failed to be unlocked")] @@ -479,7 +478,7 @@ pub struct StateChanges { /// associated user account. pub session: Option, /// A mapping of event type string to `AnyBasicEvent`. - pub account_data: BTreeMap>, + pub account_data: BTreeMap>, /// A mapping of `UserId` to `PresenceEvent`. pub presence: BTreeMap, Raw>, @@ -492,9 +491,11 @@ pub struct StateChanges { /// A mapping of `RoomId` to a map of event type string to a state key and /// `AnySyncStateEvent`. #[allow(clippy::type_complexity)] - pub state: BTreeMap, BTreeMap>>>, + pub state: + BTreeMap, BTreeMap>>>, /// A mapping of `RoomId` to a map of event type string to `AnyBasicEvent`. - pub room_account_data: BTreeMap, BTreeMap>>, + pub room_account_data: + BTreeMap, BTreeMap>>, /// A map of `RoomId` to `RoomInfo`. pub room_infos: BTreeMap, RoomInfo>, /// A map of `RoomId` to `ReceiptEventContent`. @@ -503,8 +504,10 @@ pub struct StateChanges { /// 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>>>, + pub stripped_state: BTreeMap< + Box, + BTreeMap>>, + >, /// A mapping of `RoomId` to a map of users and their `StrippedMemberEvent`. pub stripped_members: BTreeMap, BTreeMap, StrippedMemberEvent>>, /// A map of `RoomId` to `RoomInfo` for stripped rooms (e.g. for invites or @@ -547,7 +550,7 @@ impl StateChanges { event: AnyGlobalAccountDataEvent, raw_event: Raw, ) { - self.account_data.insert(event.content().event_type().to_owned(), raw_event); + self.account_data.insert(event.event_type(), raw_event); } /// Update the `StateChanges` struct with the given room with a new @@ -561,7 +564,7 @@ impl StateChanges { self.room_account_data .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) - .insert(event.content().event_type().to_owned(), raw_event); + .insert(event.event_type(), raw_event); } /// Update the `StateChanges` struct with the given room with a new @@ -586,7 +589,7 @@ impl StateChanges { self.state .entry(room_id.to_owned()) .or_insert_with(BTreeMap::new) - .entry(event.content().event_type().to_owned()) + .entry(event.event_type()) .or_insert_with(BTreeMap::new) .insert(event.state_key().to_owned(), raw_event); } diff --git a/crates/matrix-sdk-common/Cargo.toml b/crates/matrix-sdk-common/Cargo.toml index 85bd553f5..246622959 100644 --- a/crates/matrix-sdk-common/Cargo.toml +++ b/crates/matrix-sdk-common/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"] [dependencies] async-trait = "0.1.50" -ruma = { version = "0.5.0", features = ["client-api-c"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "deea762b8", 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 38d39d590..29dab4c49 100644 --- a/crates/matrix-sdk-common/src/deserialized_responses.rs +++ b/crates/matrix-sdk-common/src/deserialized_responses.rs @@ -12,7 +12,7 @@ use ruma::{ room::member::{ RoomMemberEvent, RoomMemberEventContent, StrippedRoomMemberEvent, SyncRoomMemberEvent, }, - AnyRoomEvent, AnySyncRoomEvent, Unsigned, + AnyRoomEvent, AnySyncRoomEvent, StateUnsigned, }, serde::Raw, DeviceId, DeviceKeyAlgorithm, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, @@ -301,21 +301,19 @@ pub struct MemberEvent { pub content: RoomMemberEventContent, pub event_id: Box, pub origin_server_ts: MilliSecondsSinceUnixEpoch, - pub prev_content: Option, pub sender: Box, pub state_key: Box, - pub unsigned: Unsigned, + pub unsigned: StateUnsigned, } impl TryFrom for MemberEvent { - type Error = ruma::identifiers::Error; + type Error = ruma::IdParseError; fn try_from(event: SyncRoomMemberEvent) -> Result { Ok(MemberEvent { content: event.content, event_id: event.event_id, origin_server_ts: event.origin_server_ts, - prev_content: event.prev_content, sender: event.sender, state_key: event.state_key.try_into()?, unsigned: event.unsigned, @@ -324,14 +322,13 @@ impl TryFrom for MemberEvent { } impl TryFrom for MemberEvent { - type Error = ruma::identifiers::Error; + type Error = ruma::IdParseError; fn try_from(event: RoomMemberEvent) -> Result { Ok(MemberEvent { content: event.content, event_id: event.event_id, origin_server_ts: event.origin_server_ts, - prev_content: event.prev_content, sender: event.sender, state_key: event.state_key.try_into()?, unsigned: event.unsigned, @@ -347,7 +344,6 @@ impl From for SyncRoomMemberEvent { sender: other.sender, origin_server_ts: other.origin_server_ts, state_key: other.state_key.to_string(), - prev_content: other.prev_content, unsigned: other.unsigned, } } @@ -362,7 +358,7 @@ pub struct StrippedMemberEvent { } impl TryFrom for StrippedMemberEvent { - type Error = ruma::identifiers::Error; + type Error = ruma::IdParseError; fn try_from(event: StrippedRoomMemberEvent) -> Result { Ok(StrippedMemberEvent { @@ -399,25 +395,27 @@ mod test { use ruma::{ event_id, events::{ - room::message::RoomMessageEventContent, AnyMessageEvent, AnySyncMessageEvent, - AnySyncRoomEvent, MessageEvent, + room::message::RoomMessageEventContent, AnyMessageLikeEvent, AnySyncMessageLikeEvent, + AnySyncRoomEvent, MessageLikeEvent, MessageLikeUnsigned, }, - room_id, user_id, MilliSecondsSinceUnixEpoch, + room_id, + serde::Raw, + user_id, MilliSecondsSinceUnixEpoch, }; - use super::{Raw, RoomEvent, SyncRoomEvent, Unsigned}; + use super::{RoomEvent, SyncRoomEvent}; #[test] fn room_event_to_sync_room_event() { let content = RoomMessageEventContent::text_plain("foobar"); - let event = MessageEvent { + let event = MessageLikeEvent { content, event_id: event_id!("$xxxxx:example.org").to_owned(), room_id: room_id!("!someroom:example.com").to_owned(), origin_server_ts: MilliSecondsSinceUnixEpoch::now(), sender: user_id!("@carl:example.com").to_owned(), - unsigned: Unsigned::default(), + unsigned: MessageLikeUnsigned::default(), }; let room_event = @@ -427,8 +425,8 @@ mod test { let converted_event: AnySyncRoomEvent = converted_room_event.event.deserialize().unwrap(); - let event: AnyMessageEvent = event.into(); - let sync_event: AnySyncMessageEvent = event.into(); + let event: AnyMessageLikeEvent = event.into(); + let sync_event: AnySyncMessageLikeEvent = event.into(); let sync_event: AnySyncRoomEvent = sync_event.into(); // There is no PartialEq implementation for AnySyncRoomEvent, so we diff --git a/crates/matrix-sdk-crypto/Cargo.toml b/crates/matrix-sdk-crypto/Cargo.toml index 8fabae419..b123923e0 100644 --- a/crates/matrix-sdk-crypto/Cargo.toml +++ b/crates/matrix-sdk-crypto/Cargo.toml @@ -60,7 +60,8 @@ rev = "16fb254aa3325c61ef949314c81c35f91d0664e1" features = ["js"] [dependencies.ruma] -version = "0.5.0" +git = "https://github.com/ruma/ruma" +rev = "deea762b8" features = ["client-api-c", "rand", "unstable-msc2676", "unstable-msc2677"] [dev-dependencies] diff --git a/crates/matrix-sdk-crypto/src/error.rs b/crates/matrix-sdk-crypto/src/error.rs index 5a5ea706a..8b91dece5 100644 --- a/crates/matrix-sdk-crypto/src/error.rs +++ b/crates/matrix-sdk-crypto/src/error.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use ruma::{identifiers::Error as IdentifierError, DeviceId, RoomId, UserId}; +use ruma::{DeviceId, IdParseError, RoomId, UserId}; use serde_json::Error as SerdeError; use thiserror::Error; @@ -150,7 +150,7 @@ pub enum SignatureError { /// The ID of the signing key isn't a valid key ID. #[error("the ID of the signing key is invalid")] - InvalidKeyId(#[from] IdentifierError), + InvalidKeyId(#[from] IdParseError), /// The signing key that should create or check a signature is missing. #[error("the signing key is missing from the object that signed the message")] diff --git a/crates/matrix-sdk-crypto/src/machine.rs b/crates/matrix-sdk-crypto/src/machine.rs index ef73b127b..c4c51598f 100644 --- a/crates/matrix-sdk-crypto/src/machine.rs +++ b/crates/matrix-sdk-crypto/src/machine.rs @@ -41,7 +41,7 @@ use ruma::{ }, room_key::ToDeviceRoomKeyEvent, secret::request::SecretName, - AnyRoomEvent, AnyToDeviceEvent, MessageEventContent, + AnyRoomEvent, AnyToDeviceEvent, EventContent, MessageLikeEventType, }, DeviceId, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, RoomId, TransactionId, UInt, UserId, @@ -682,12 +682,12 @@ impl OlmMachine { pub async fn encrypt( &self, room_id: &RoomId, - content: impl MessageEventContent, + content: impl EventContent, ) -> MegolmResult { - let event_type = content.event_type(); + let event_type = content.event_type().to_string(); let content = serde_json::to_value(&content)?; - self.group_session_manager.encrypt(room_id, content, event_type).await + self.group_session_manager.encrypt(room_id, content, &event_type).await } /// Encrypt a json [`Value`] content for the given room. @@ -774,7 +774,7 @@ impl OlmMachine { trace!( sender = decrypted.sender.as_str(), sender_key = decrypted.sender_key.as_str(), - event_type = event.event_type(), + event_type = %event.event_type(), "Received a decrypted to-device event" ); @@ -923,7 +923,7 @@ impl OlmMachine { trace!( sender = event.sender().as_str(), - event_type = event.event_type(), + event_type = %event.event_type(), "Received a to-device event" ); @@ -1085,7 +1085,7 @@ impl OlmMachine { "Successfully decrypted a room event" ); - if let AnyRoomEvent::Message(e) = e { + if let AnyRoomEvent::MessageLike(e) = e { self.verification_machine.receive_any_event(&e).await?; } } @@ -1558,8 +1558,9 @@ pub(crate) mod test { encrypted::ToDeviceRoomEncryptedEventContent, message::{MessageType, RoomMessageEventContent}, }, - AnyMessageEvent, AnyMessageEventContent, AnyRoomEvent, AnyToDeviceEvent, - AnyToDeviceEventContent, MessageEvent, SyncMessageEvent, ToDeviceEvent, Unsigned, + AnyMessageLikeEvent, AnyMessageLikeEventContent, AnyRoomEvent, AnyToDeviceEvent, + AnyToDeviceEventContent, MessageLikeEvent, MessageLikeUnsigned, SyncMessageLikeEvent, + ToDeviceEvent, }, room_id, serde::Raw, @@ -1975,22 +1976,22 @@ pub(crate) mod test { let content = RoomMessageEventContent::text_plain(plaintext); let encrypted_content = alice - .encrypt(room_id, AnyMessageEventContent::RoomMessage(content.clone())) + .encrypt(room_id, AnyMessageLikeEventContent::RoomMessage(content.clone())) .await .unwrap(); - let event = SyncMessageEvent { + let event = SyncMessageLikeEvent { event_id: event_id!("$xxxxx:example.org").to_owned(), origin_server_ts: milli_seconds_since_unix_epoch(), sender: alice.user_id().to_owned(), content: encrypted_content, - unsigned: Unsigned::default(), + unsigned: MessageLikeUnsigned::default(), }; let decrypted_event = bob.decrypt_room_event(&event, room_id).await.unwrap().event.deserialize().unwrap(); - if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(MessageEvent { + if let AnyRoomEvent::MessageLike(AnyMessageLikeEvent::RoomMessage(MessageLikeEvent { sender, content, .. diff --git a/crates/matrix-sdk-crypto/src/olm/mod.rs b/crates/matrix-sdk-crypto/src/olm/mod.rs index e7aafc876..9ecb79991 100644 --- a/crates/matrix-sdk-crypto/src/olm/mod.rs +++ b/crates/matrix-sdk-crypto/src/olm/mod.rs @@ -66,7 +66,7 @@ pub(crate) mod test { events::{ forwarded_room_key::ToDeviceForwardedRoomKeyEventContent, room::message::{Relation, Replacement, RoomMessageEventContent}, - AnyMessageEvent, AnyRoomEvent, AnySyncMessageEvent, AnySyncRoomEvent, + AnyMessageLikeEvent, AnyRoomEvent, AnySyncMessageLikeEvent, AnySyncRoomEvent, }, room_id, user_id, DeviceId, UserId, }; @@ -246,7 +246,9 @@ pub(crate) mod test { let event: AnySyncRoomEvent = serde_json::from_str(&event).unwrap(); let event = - if let AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomEncrypted(event)) = event { + if let AnySyncRoomEvent::MessageLike(AnySyncMessageLikeEvent::RoomEncrypted(event)) = + event + { event } else { panic!("Invalid event type") @@ -254,7 +256,7 @@ pub(crate) mod test { let decrypted = inbound.decrypt(&event).await.unwrap().0; - if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(e)) = + if let AnyRoomEvent::MessageLike(AnyMessageLikeEvent::RoomMessage(e)) = decrypted.deserialize().unwrap() { assert_matches!(e.content.relates_to, Some(Relation::Replacement(_))); diff --git a/crates/matrix-sdk-crypto/src/requests.rs b/crates/matrix-sdk-crypto/src/requests.rs index aac6fff36..f4aefafd7 100644 --- a/crates/matrix-sdk-crypto/src/requests.rs +++ b/crates/matrix-sdk-crypto/src/requests.rs @@ -29,7 +29,9 @@ use ruma::{ message::send_message_event::v3::Response as RoomMessageResponse, to_device::send_event_to_device::v3::Response as ToDeviceResponse, }, - events::{AnyMessageEventContent, AnyToDeviceEventContent, EventContent, ToDeviceEventType}, + events::{ + AnyMessageLikeEventContent, AnyToDeviceEventContent, EventContent, ToDeviceEventType, + }, serde::Raw, to_device::DeviceIdOrAllDevices, DeviceId, RoomId, TransactionId, UserId, @@ -88,7 +90,7 @@ impl ToDeviceRequest { if recipient_devices.is_empty() { Self::new(recipient, DeviceIdOrAllDevices::AllDevices, content) } else { - let event_type = content.event_type().into(); + let event_type = content.event_type(); let device_messages = recipient_devices .into_iter() .map(|d| { @@ -109,7 +111,7 @@ impl ToDeviceRequest { content: AnyToDeviceEventContent, txn_id: Box, ) -> Self { - let event_type = ToDeviceEventType::from(content.event_type()); + let event_type = content.event_type(); let raw_content = Raw::new(&content).expect("Failed to serialize to-device event"); let user_messages = iter::once((recipient_device.into(), raw_content)).collect(); @@ -365,7 +367,7 @@ pub struct RoomMessageRequest { pub txn_id: Box, /// The event content to send. - pub content: AnyMessageEventContent, + pub content: AnyMessageLikeEventContent, } /// A request that will back up a batch of room keys to the server. diff --git a/crates/matrix-sdk-crypto/src/store/mod.rs b/crates/matrix-sdk-crypto/src/store/mod.rs index 1b5943e21..70681e7b9 100644 --- a/crates/matrix-sdk-crypto/src/store/mod.rs +++ b/crates/matrix-sdk-crypto/src/store/mod.rs @@ -58,8 +58,7 @@ use matrix_sdk_common::{async_trait, locks::Mutex, AsyncTraitDeps}; pub use memorystore::MemoryStore; pub use pickle_key::{EncryptedPickleKey, PickleKey}; use ruma::{ - events::secret::request::SecretName, identifiers::Error as IdentifierValidationError, DeviceId, - RoomId, TransactionId, UserId, + events::secret::request::SecretName, DeviceId, IdParseError, RoomId, TransactionId, UserId, }; use serde::{Deserialize, Serialize}; use serde_json::Error as SerdeError; @@ -595,7 +594,7 @@ pub enum CryptoStoreError { /// A Matrix identifier failed to be validated. #[error(transparent)] - IdentifierValidation(#[from] IdentifierValidationError), + IdentifierValidation(#[from] IdParseError), /// The store failed to (de)serialize a data type. #[error(transparent)] diff --git a/crates/matrix-sdk-crypto/src/verification/event_enums.rs b/crates/matrix-sdk-crypto/src/verification/event_enums.rs index 7b3a36ee5..660386120 100644 --- a/crates/matrix-sdk-crypto/src/verification/event_enums.rs +++ b/crates/matrix-sdk-crypto/src/verification/event_enums.rs @@ -40,7 +40,7 @@ use ruma::{ VerificationMethod, }, room::message::{KeyVerificationRequestEventContent, MessageType}, - AnyMessageEvent, AnyMessageEventContent, AnyToDeviceEvent, AnyToDeviceEventContent, + AnyMessageLikeEvent, AnyMessageLikeEventContent, AnyToDeviceEvent, AnyToDeviceEventContent, }, serde::{Base64, CanonicalJsonValue}, DeviceId, MilliSecondsSinceUnixEpoch, RoomId, UserId, @@ -50,7 +50,7 @@ use super::FlowId; #[derive(Debug)] pub enum AnyEvent<'a> { - Room(&'a AnyMessageEvent), + Room(&'a AnyMessageLikeEvent), ToDevice(&'a AnyToDeviceEvent), } @@ -79,37 +79,41 @@ impl AnyEvent<'_> { pub fn verification_content(&self) -> Option> { match self { AnyEvent::Room(e) => match e { - AnyMessageEvent::CallAnswer(_) - | AnyMessageEvent::CallInvite(_) - | AnyMessageEvent::CallHangup(_) - | AnyMessageEvent::CallCandidates(_) - | AnyMessageEvent::Reaction(_) - | AnyMessageEvent::RoomEncrypted(_) - | AnyMessageEvent::RoomMessageFeedback(_) - | AnyMessageEvent::RoomRedaction(_) - | AnyMessageEvent::Sticker(_) => None, - AnyMessageEvent::RoomMessage(m) => { + AnyMessageLikeEvent::CallAnswer(_) + | AnyMessageLikeEvent::CallInvite(_) + | AnyMessageLikeEvent::CallHangup(_) + | AnyMessageLikeEvent::CallCandidates(_) + | AnyMessageLikeEvent::Reaction(_) + | AnyMessageLikeEvent::RoomEncrypted(_) + | AnyMessageLikeEvent::RoomMessageFeedback(_) + | AnyMessageLikeEvent::RoomRedaction(_) + | AnyMessageLikeEvent::Sticker(_) => None, + AnyMessageLikeEvent::RoomMessage(m) => { if let MessageType::VerificationRequest(v) = &m.content.msgtype { Some(RequestContent::from(v).into()) } else { None } } - AnyMessageEvent::KeyVerificationReady(e) => { + AnyMessageLikeEvent::KeyVerificationReady(e) => { Some(ReadyContent::from(&e.content).into()) } - AnyMessageEvent::KeyVerificationStart(e) => { + AnyMessageLikeEvent::KeyVerificationStart(e) => { Some(StartContent::from(&e.content).into()) } - AnyMessageEvent::KeyVerificationCancel(e) => { + AnyMessageLikeEvent::KeyVerificationCancel(e) => { Some(CancelContent::from(&e.content).into()) } - AnyMessageEvent::KeyVerificationAccept(e) => { + AnyMessageLikeEvent::KeyVerificationAccept(e) => { Some(AcceptContent::from(&e.content).into()) } - AnyMessageEvent::KeyVerificationKey(e) => Some(KeyContent::from(&e.content).into()), - AnyMessageEvent::KeyVerificationMac(e) => Some(MacContent::from(&e.content).into()), - AnyMessageEvent::KeyVerificationDone(e) => { + AnyMessageLikeEvent::KeyVerificationKey(e) => { + Some(KeyContent::from(&e.content).into()) + } + AnyMessageLikeEvent::KeyVerificationMac(e) => { + Some(MacContent::from(&e.content).into()) + } + AnyMessageLikeEvent::KeyVerificationDone(e) => { Some(DoneContent::from(&e.content).into()) } _ => None, @@ -150,8 +154,8 @@ impl AnyEvent<'_> { } } -impl<'a> From<&'a AnyMessageEvent> for AnyEvent<'a> { - fn from(e: &'a AnyMessageEvent) -> Self { +impl<'a> From<&'a AnyMessageLikeEvent> for AnyEvent<'a> { + fn from(e: &'a AnyMessageLikeEvent) -> Self { Self::Room(e) } } @@ -173,40 +177,40 @@ impl TryFrom<&AnyEvent<'_>> for FlowId { } } -impl TryFrom<&AnyMessageEvent> for FlowId { +impl TryFrom<&AnyMessageLikeEvent> for FlowId { type Error = (); - fn try_from(value: &AnyMessageEvent) -> Result { + fn try_from(value: &AnyMessageLikeEvent) -> Result { match value { - AnyMessageEvent::CallAnswer(_) - | AnyMessageEvent::CallInvite(_) - | AnyMessageEvent::CallHangup(_) - | AnyMessageEvent::CallCandidates(_) - | AnyMessageEvent::Reaction(_) - | AnyMessageEvent::RoomEncrypted(_) - | AnyMessageEvent::RoomMessageFeedback(_) - | AnyMessageEvent::RoomRedaction(_) - | AnyMessageEvent::Sticker(_) => Err(()), - AnyMessageEvent::KeyVerificationReady(e) => { + AnyMessageLikeEvent::CallAnswer(_) + | AnyMessageLikeEvent::CallInvite(_) + | AnyMessageLikeEvent::CallHangup(_) + | AnyMessageLikeEvent::CallCandidates(_) + | AnyMessageLikeEvent::Reaction(_) + | AnyMessageLikeEvent::RoomEncrypted(_) + | AnyMessageLikeEvent::RoomMessageFeedback(_) + | AnyMessageLikeEvent::RoomRedaction(_) + | AnyMessageLikeEvent::Sticker(_) => Err(()), + AnyMessageLikeEvent::KeyVerificationReady(e) => { 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::KeyVerificationStart(e) => { + AnyMessageLikeEvent::RoomMessage(e) => Ok(FlowId::from((&*e.room_id, &*e.event_id))), + AnyMessageLikeEvent::KeyVerificationStart(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::KeyVerificationCancel(e) => { + AnyMessageLikeEvent::KeyVerificationCancel(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::KeyVerificationAccept(e) => { + AnyMessageLikeEvent::KeyVerificationAccept(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::KeyVerificationKey(e) => { + AnyMessageLikeEvent::KeyVerificationKey(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::KeyVerificationMac(e) => { + AnyMessageLikeEvent::KeyVerificationMac(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } - AnyMessageEvent::KeyVerificationDone(e) => { + AnyMessageLikeEvent::KeyVerificationDone(e) => { Ok(FlowId::from((&*e.room_id, &*e.content.relates_to.event_id))) } _ => Err(()), @@ -363,7 +367,7 @@ macro_rules! try_from_outgoing_content { fn try_from(value: &'a OutgoingContent) -> Result { match value { OutgoingContent::Room(_, c) => { - if let AnyMessageEventContent::$enum_variant(c) = c { + if let AnyMessageLikeEventContent::$enum_variant(c) = c { Ok(Self::Room(c)) } else { Err(()) @@ -396,7 +400,7 @@ impl<'a> TryFrom<&'a OutgoingContent> for RequestContent<'a> { fn try_from(value: &'a OutgoingContent) -> Result { match value { OutgoingContent::Room(_, c) => { - if let AnyMessageEventContent::RoomMessage(m) = c { + if let AnyMessageLikeEventContent::RoomMessage(m) = c { if let MessageType::VerificationRequest(c) = &m.msgtype { Ok(Self::Room(c)) } else { @@ -675,7 +679,7 @@ impl OwnedAcceptContent { #[derive(Clone, Debug)] pub enum OutgoingContent { - Room(Box, AnyMessageEventContent), + Room(Box, AnyMessageLikeEventContent), ToDevice(AnyToDeviceEventContent), } @@ -683,7 +687,7 @@ impl From for OutgoingContent { fn from(content: OwnedStartContent) -> Self { match content { OwnedStartContent::Room(r, c) => { - (r, AnyMessageEventContent::KeyVerificationStart(c)).into() + (r, AnyMessageLikeEventContent::KeyVerificationStart(c)).into() } OwnedStartContent::ToDevice(c) => { AnyToDeviceEventContent::KeyVerificationStart(c).into() @@ -698,8 +702,8 @@ impl From for OutgoingContent { } } -impl From<(Box, AnyMessageEventContent)> for OutgoingContent { - fn from(content: (Box, AnyMessageEventContent)) -> Self { +impl From<(Box, AnyMessageLikeEventContent)> for OutgoingContent { + fn from(content: (Box, AnyMessageLikeEventContent)) -> Self { OutgoingContent::Room(content.0, content.1) } } diff --git a/crates/matrix-sdk-crypto/src/verification/mod.rs b/crates/matrix-sdk-crypto/src/verification/mod.rs index 673c93483..1842f4afb 100644 --- a/crates/matrix-sdk-crypto/src/verification/mod.rs +++ b/crates/matrix-sdk-crypto/src/verification/mod.rs @@ -45,7 +45,7 @@ use ruma::{ }, Relation, }, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, DeviceId, DeviceKeyId, EventId, RoomId, TransactionId, UserId, }; @@ -256,9 +256,9 @@ impl Done { .into(), FlowId::InRoom(r, e) => ( r.to_owned(), - AnyMessageEventContent::KeyVerificationDone(KeyVerificationDoneEventContent::new( - Relation::new(e.to_owned()), - )), + AnyMessageLikeEventContent::KeyVerificationDone( + KeyVerificationDoneEventContent::new(Relation::new(e.to_owned())), + ), ) .into(), } @@ -341,7 +341,7 @@ impl Cancelled { FlowId::InRoom(r, e) => ( r.clone(), - AnyMessageEventContent::KeyVerificationCancel( + AnyMessageLikeEventContent::KeyVerificationCancel( KeyVerificationCancelEventContent::new( self.reason.to_owned(), self.cancel_code.clone(), diff --git a/crates/matrix-sdk-crypto/src/verification/qrcode.rs b/crates/matrix-sdk-crypto/src/verification/qrcode.rs index fc7dfa0fd..1e711b485 100644 --- a/crates/matrix-sdk-crypto/src/verification/qrcode.rs +++ b/crates/matrix-sdk-crypto/src/verification/qrcode.rs @@ -31,7 +31,7 @@ use ruma::{ }, Relation, }, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, serde::Base64, DeviceId, RoomId, TransactionId, UserId, @@ -763,9 +763,9 @@ impl QrState { .into(), FlowId::InRoom(r, e) => ( r.to_owned(), - AnyMessageEventContent::KeyVerificationDone(KeyVerificationDoneEventContent::new( - Relation::new(e.to_owned()), - )), + AnyMessageLikeEventContent::KeyVerificationDone( + KeyVerificationDoneEventContent::new(Relation::new(e.to_owned())), + ), ) .into(), } diff --git a/crates/matrix-sdk-crypto/src/verification/requests.rs b/crates/matrix-sdk-crypto/src/verification/requests.rs index c22dd5a16..ada3a114a 100644 --- a/crates/matrix-sdk-crypto/src/verification/requests.rs +++ b/crates/matrix-sdk-crypto/src/verification/requests.rs @@ -30,7 +30,7 @@ use ruma::{ Relation, VerificationMethod, }, room::message::KeyVerificationRequestEventContent, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, to_device::DeviceIdOrAllDevices, DeviceId, RoomId, TransactionId, UserId, @@ -912,7 +912,7 @@ impl RequestState { .into(), FlowId::InRoom(r, e) => ( r.to_owned(), - AnyMessageEventContent::KeyVerificationReady( + AnyMessageLikeEventContent::KeyVerificationReady( KeyVerificationReadyEventContent::new( state.store.account.device_id().to_owned(), methods, diff --git a/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs b/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs index 646cee93c..e100226c0 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/helpers.rs @@ -21,7 +21,7 @@ use ruma::{ mac::{KeyVerificationMacEventContent, ToDeviceKeyVerificationMacEventContent}, Relation, }, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, serde::Base64, DeviceKeyAlgorithm, DeviceKeyId, UserId, @@ -347,15 +347,15 @@ pub fn get_mac_content(sas: &EstablishedSas, ids: &SasIds, flow_id: &FlowId) -> ToDeviceKeyVerificationMacEventContent::new(s.clone(), mac, keys), ) .into(), - FlowId::InRoom(r, e) => ( - r.clone(), - AnyMessageEventContent::KeyVerificationMac(KeyVerificationMacEventContent::new( - mac, - keys, - Relation::new(e.clone()), - )), - ) - .into(), + FlowId::InRoom(r, e) => { + ( + r.clone(), + AnyMessageLikeEventContent::KeyVerificationMac( + KeyVerificationMacEventContent::new(mac, keys, Relation::new(e.clone())), + ), + ) + .into() + } } } diff --git a/crates/matrix-sdk-crypto/src/verification/sas/mod.rs b/crates/matrix-sdk-crypto/src/verification/sas/mod.rs index 59cbe1a70..344438294 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/mod.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/mod.rs @@ -25,7 +25,7 @@ use ruma::{ api::client::keys::upload_signatures::v3::Request as SignatureUploadRequest, events::{ key::verification::{cancel::CancelCode, ShortAuthenticationString}, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, DeviceId, EventId, RoomId, TransactionId, UserId, }; @@ -336,7 +336,7 @@ impl Sas { OwnedAcceptContent::Room(room_id, content) => RoomMessageRequest { room_id, txn_id: TransactionId::new(), - content: AnyMessageEventContent::KeyVerificationAccept(content), + content: AnyMessageLikeEventContent::KeyVerificationAccept(content), } .into(), }) 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 793075621..d78a434a9 100644 --- a/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs +++ b/crates/matrix-sdk-crypto/src/verification/sas/sas_state.rs @@ -37,7 +37,7 @@ use ruma::{ HashAlgorithm, KeyAgreementProtocol, MessageAuthenticationCode, Relation, ShortAuthenticationString, VerificationMethod, }, - AnyMessageEventContent, AnyToDeviceEventContent, + AnyMessageLikeEventContent, AnyToDeviceEventContent, }, serde::Base64, DeviceId, EventId, RoomId, TransactionId, UserId, @@ -848,10 +848,12 @@ impl SasState { .into(), FlowId::InRoom(r, e) => ( r.clone(), - AnyMessageEventContent::KeyVerificationKey(KeyVerificationKeyEventContent::new( - Base64::new(self.our_public_key.to_vec()), - Relation::new(e.clone()), - )), + AnyMessageLikeEventContent::KeyVerificationKey( + KeyVerificationKeyEventContent::new( + Base64::new(self.our_public_key.to_vec()), + Relation::new(e.clone()), + ), + ), ) .into(), } @@ -874,10 +876,12 @@ impl SasState { .into(), FlowId::InRoom(r, e) => ( r.clone(), - AnyMessageEventContent::KeyVerificationKey(KeyVerificationKeyEventContent::new( - Base64::new(self.our_public_key.to_vec()), - Relation::new(e.clone()), - )), + AnyMessageLikeEventContent::KeyVerificationKey( + KeyVerificationKeyEventContent::new( + Base64::new(self.our_public_key.to_vec()), + Relation::new(e.clone()), + ), + ), ) .into(), } @@ -1177,9 +1181,9 @@ impl SasState { .into(), FlowId::InRoom(r, e) => ( r.clone(), - AnyMessageEventContent::KeyVerificationDone(KeyVerificationDoneEventContent::new( - Relation::new(e.clone()), - )), + AnyMessageLikeEventContent::KeyVerificationDone( + KeyVerificationDoneEventContent::new(Relation::new(e.clone())), + ), ) .into(), } diff --git a/crates/matrix-sdk-indexeddb/src/safe_encode.rs b/crates/matrix-sdk-indexeddb/src/safe_encode.rs index f0802bef1..bc45bb582 100644 --- a/crates/matrix-sdk-indexeddb/src/safe_encode.rs +++ b/crates/matrix-sdk-indexeddb/src/safe_encode.rs @@ -1,5 +1,5 @@ #![allow(dead_code)] -use matrix_sdk_base::ruma::events::StateEventType; +use matrix_sdk_base::ruma::events::{GlobalAccountDataEventType, StateEventType}; use matrix_sdk_common::ruma::{ receipt::ReceiptType, DeviceId, EventId, MxcUri, RoomId, TransactionId, UserId, }; @@ -135,9 +135,15 @@ impl SafeEncode for TransactionId { } } +impl SafeEncode for GlobalAccountDataEventType { + fn as_encoded_string(&self) -> String { + self.to_string().as_encoded_string() + } +} + impl SafeEncode for StateEventType { fn as_encoded_string(&self) -> String { - self.as_str().as_encoded_string() + self.to_string().as_encoded_string() } } diff --git a/crates/matrix-sdk-indexeddb/src/state_store.rs b/crates/matrix-sdk-indexeddb/src/state_store.rs index 745ceb971..2489c9912 100644 --- a/crates/matrix-sdk-indexeddb/src/state_store.rs +++ b/crates/matrix-sdk-indexeddb/src/state_store.rs @@ -33,7 +33,7 @@ use matrix_sdk_common::{ presence::PresenceEvent, receipt::Receipt, room::member::{MembershipState, RoomMemberEventContent}, - AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncMessageEvent, + AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncMessageLikeEvent, AnySyncRoomEvent, AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, }, @@ -388,7 +388,7 @@ impl IndexeddbStore { let store = tx.object_store(KEYS::ROOM_ACCOUNT_DATA)?; for (room, events) in &changes.room_account_data { for (event_type, event) in events { - let key = (room, event_type).encode(); + let key = (room, event_type.to_string().as_str()).encode(); store.put_key_val(&key, &self.serialize_event(&event)?)?; } } @@ -637,9 +637,9 @@ impl IndexeddbStore { }); for event in &timeline.events { // Redact events already in store only on sync response - if let Ok(AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomRedaction( - redaction, - ))) = event.event.deserialize() + if let Ok(AnySyncRoomEvent::MessageLike( + AnySyncMessageLikeEvent::RoomRedaction(redaction), + )) = event.event.deserialize() { let redacts_key = (room_id, &redaction.redacts).encode(); if let Some(position_key) = @@ -866,7 +866,7 @@ impl IndexeddbStore { self.inner .transaction_on_one_with_mode(KEYS::ACCOUNT_DATA, IdbTransactionMode::Readonly)? .object_store(KEYS::ACCOUNT_DATA)? - .get(&JsValue::from_str(event_type.as_str()))? + .get(&JsValue::from_str(&event_type.to_string()))? .await? .map(|f| self.deserialize_event(f).map_err::(|e| e)) .transpose() @@ -880,7 +880,7 @@ impl IndexeddbStore { self.inner .transaction_on_one_with_mode(KEYS::ROOM_ACCOUNT_DATA, IdbTransactionMode::Readonly)? .object_store(KEYS::ROOM_ACCOUNT_DATA)? - .get(&(room_id.as_str(), event_type.as_str()).encode())? + .get(&(room_id.as_str(), &event_type.to_string()).encode())? .await? .map(|f| self.deserialize_event(f).map_err::(|e| e)) .transpose() @@ -938,7 +938,7 @@ impl IndexeddbStore { } async fn add_media_content(&self, request: &MediaRequest, data: Vec) -> Result<()> { - let key = (&request.media_type.unique_key(), &request.format.unique_key()).encode(); + let key = (&request.source.unique_key(), &request.format.unique_key()).encode(); let tx = self.inner.transaction_on_one_with_mode(KEYS::MEDIA, IdbTransactionMode::Readwrite)?; @@ -948,7 +948,7 @@ impl IndexeddbStore { } async fn get_media_content(&self, request: &MediaRequest) -> Result>> { - let key = (&request.media_type.unique_key(), &request.format.unique_key()).encode(); + let key = (&request.source.unique_key(), &request.format.unique_key()).encode(); self.inner .transaction_on_one_with_mode(KEYS::MEDIA, IdbTransactionMode::Readonly)? .object_store(KEYS::MEDIA)? @@ -992,7 +992,7 @@ impl IndexeddbStore { } async fn remove_media_content(&self, request: &MediaRequest) -> Result<()> { - let key = (&request.media_type.unique_key(), &request.format.unique_key()).encode(); + let key = (&request.source.unique_key(), &request.format.unique_key()).encode(); let tx = self.inner.transaction_on_one_with_mode(KEYS::MEDIA, IdbTransactionMode::Readwrite)?; diff --git a/crates/matrix-sdk-sled/src/state_store.rs b/crates/matrix-sdk-sled/src/state_store.rs index 536b6a573..09f203c9a 100644 --- a/crates/matrix-sdk-sled/src/state_store.rs +++ b/crates/matrix-sdk-sled/src/state_store.rs @@ -41,7 +41,7 @@ use matrix_sdk_common::{ presence::PresenceEvent, receipt::Receipt, room::member::{MembershipState, RoomMemberEventContent}, - AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncMessageEvent, + AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncMessageLikeEvent, AnySyncRoomEvent, AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, }, @@ -81,7 +81,7 @@ pub enum SledStoreError { #[error(transparent)] TransactionError(#[from] sled::Error), #[error(transparent)] - Identifier(#[from] ruma::identifiers::Error), + Identifier(#[from] ruma::IdParseError), #[error(transparent)] Task(#[from] tokio::task::JoinError), } @@ -194,19 +194,19 @@ impl EncodeKey for (&str, &str, &str, &str) { impl EncodeKey for StateEventType { fn encode(&self) -> Vec { - self.as_str().encode() + self.to_string().encode() } } impl EncodeKey for GlobalAccountDataEventType { fn encode(&self) -> Vec { - self.as_str().encode() + self.to_string().encode() } } /* impl EncodeKey for RoomAccountDataEventType { fn encode(&self) -> Vec { - self.as_str().encode() + self.to_string().encode() } } */ @@ -534,7 +534,7 @@ impl SledStore { for (room, events) in &changes.room_account_data { for (event_type, event) in events { room_account_data.insert( - (room.as_str(), event_type.as_str()).encode(), + (room.as_str(), event_type.to_string().as_str()).encode(), self.serialize_event(&event) .map_err(ConflictableTransactionError::Abort)?, )?; @@ -545,7 +545,11 @@ impl SledStore { for (event_type, events) in event_types { for (state_key, event) in events { state.insert( - (room.as_str(), event_type.as_str(), state_key.as_str()) + ( + room.as_str(), + event_type.to_string().as_str(), + state_key.as_str(), + ) .encode(), self.serialize_event(&event) .map_err(ConflictableTransactionError::Abort)?, @@ -592,7 +596,11 @@ impl SledStore { for (event_type, events) in event_types { for (state_key, event) in events { stripped_state.insert( - (room.as_str(), event_type.as_str(), state_key.as_str()) + ( + room.as_str(), + event_type.to_string().as_str(), + state_key.as_str(), + ) .encode(), self.serialize_event(&event) .map_err(ConflictableTransactionError::Abort)?, @@ -682,7 +690,7 @@ impl SledStore { state_key: &str, ) -> Result>> { let db = self.clone(); - let key = (room_id.as_str(), event_type.as_str(), state_key).encode(); + let key = (room_id.as_str(), event_type.to_string().as_str(), state_key).encode(); spawn_blocking(move || { db.room_state.get(key)?.map(|e| db.deserialize_event(&e)).transpose() }) @@ -695,7 +703,7 @@ impl SledStore { event_type: StateEventType, ) -> Result>> { let db = self.clone(); - let key = (room_id.as_str(), event_type.as_str()).encode(); + let key = (room_id.as_str(), event_type.to_string().as_str()).encode(); spawn_blocking(move || { db.room_state .scan_prefix(key) @@ -854,7 +862,7 @@ impl SledStore { event_type: RoomAccountDataEventType, ) -> Result>> { let db = self.clone(); - let key = (room_id.as_str(), event_type.as_str()).encode(); + let key = (room_id.as_str(), event_type.to_string().as_str()).encode(); spawn_blocking(move || { db.room_account_data.get(key)?.map(|m| db.deserialize_event(&m)).transpose() }) @@ -904,8 +912,7 @@ impl SledStore { async fn add_media_content(&self, request: &MediaRequest, data: Vec) -> Result<()> { self.media.insert( - (request.media_type.unique_key().as_str(), request.format.unique_key().as_str()) - .encode(), + (request.source.unique_key().as_str(), request.format.unique_key().as_str()).encode(), data, )?; @@ -916,8 +923,8 @@ impl SledStore { async fn get_media_content(&self, request: &MediaRequest) -> Result>> { let db = self.clone(); - let key = (request.media_type.unique_key().as_str(), request.format.unique_key().as_str()) - .encode(); + let key = + (request.source.unique_key().as_str(), request.format.unique_key().as_str()).encode(); spawn_blocking(move || Ok(db.media.get(key)?.map(|m| m.to_vec()))).await? } @@ -937,8 +944,7 @@ impl SledStore { async fn remove_media_content(&self, request: &MediaRequest) -> Result<()> { self.media.remove( - (request.media_type.unique_key().as_str(), request.format.unique_key().as_str()) - .encode(), + (request.source.unique_key().as_str(), request.format.unique_key().as_str()).encode(), )?; Ok(()) @@ -1229,9 +1235,9 @@ impl SledStore { if timeline.sync { for event in &timeline.events { // Redact events already in store only on sync response - if let Ok(AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomRedaction( - redaction, - ))) = event.event.deserialize() + if let Ok(AnySyncRoomEvent::MessageLike( + AnySyncMessageLikeEvent::RoomRedaction(redaction), + )) = event.event.deserialize() { let redacts_key = (room_id.as_ref(), redaction.redacts.as_ref()).encode(); if let Some(position_key) = diff --git a/crates/matrix-sdk-test/Cargo.toml b/crates/matrix-sdk-test/Cargo.toml index cfd3ce57c..e6d688d0b 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 = { version = "0.5.0", features = ["client-api-c"] } +ruma = { git = "https://github.com/ruma/ruma", rev = "deea762b8", features = ["client-api-c"] } serde = "1.0.126" serde_json = "1.0.64" diff --git a/crates/matrix-sdk/Cargo.toml b/crates/matrix-sdk/Cargo.toml index 9467287dc..cf0d5237c 100644 --- a/crates/matrix-sdk/Cargo.toml +++ b/crates/matrix-sdk/Cargo.toml @@ -103,8 +103,9 @@ version = "0.11.3" default_features = false [dependencies.ruma] -version = "0.5.0" -features = ["client-api-c", "compat", "rand", "unstable-msc2448", "unstable-pre-spec"] +git = "https://github.com/ruma/ruma" +rev = "deea762b8" +features = ["client-api-c", "compat", "rand", "unstable-msc2448"] [dependencies.tokio-stream] version = "0.1.6" diff --git a/crates/matrix-sdk/examples/emoji_verification.rs b/crates/matrix-sdk/examples/emoji_verification.rs index c8f25a312..d4e77e132 100644 --- a/crates/matrix-sdk/examples/emoji_verification.rs +++ b/crates/matrix-sdk/examples/emoji_verification.rs @@ -13,7 +13,7 @@ use matrix_sdk::{ encryption::verification::{SasVerification, Verification}, ruma::{ events::{ - room::message::MessageType, AnySyncMessageEvent, AnySyncRoomEvent, AnyToDeviceEvent, + room::message::MessageType, AnySyncMessageLikeEvent, AnySyncRoomEvent, AnyToDeviceEvent, }, UserId, }, @@ -133,9 +133,9 @@ async fn login( for event in room_info.timeline.events.iter().filter_map(|e| e.event.deserialize().ok()) { - if let AnySyncRoomEvent::Message(event) = event { + if let AnySyncRoomEvent::MessageLike(event) = event { match event { - AnySyncMessageEvent::RoomMessage(m) => { + AnySyncMessageLikeEvent::RoomMessage(m) => { if let MessageType::VerificationRequest(_) = &m.content.msgtype { let request = client @@ -150,7 +150,7 @@ async fn login( .expect("Can't accept verification request"); } } - AnySyncMessageEvent::KeyVerificationKey(e) => { + AnySyncMessageLikeEvent::KeyVerificationKey(e) => { if let Some(Verification::SasV1(sas)) = client .encryption() .get_verification( @@ -162,7 +162,7 @@ async fn login( tokio::spawn(wait_for_confirmation((*client).clone(), sas)); } } - AnySyncMessageEvent::KeyVerificationMac(e) => { + AnySyncMessageLikeEvent::KeyVerificationMac(e) => { if let Some(Verification::SasV1(sas)) = client .encryption() .get_verification( diff --git a/crates/matrix-sdk/examples/wasm_command_bot/src/lib.rs b/crates/matrix-sdk/examples/wasm_command_bot/src/lib.rs index 0b63b8a9d..47bd1d052 100644 --- a/crates/matrix-sdk/examples/wasm_command_bot/src/lib.rs +++ b/crates/matrix-sdk/examples/wasm_command_bot/src/lib.rs @@ -6,7 +6,7 @@ use matrix_sdk::{ room::message::{ MessageType, RoomMessageEventContent, SyncRoomMessageEvent, TextMessageEventContent, }, - AnyMessageEventContent, AnySyncMessageEvent, AnySyncRoomEvent, + AnyMessageLikeEventContent, AnySyncMessageLikeEvent, AnySyncRoomEvent, }, RoomId, }, @@ -37,9 +37,9 @@ impl WasmBot { console::log_1(&format!("Received message event {:?}", &msg_body).into()); if msg_body.contains("!party") { - let content = AnyMessageEventContent::RoomMessage(RoomMessageEventContent::text_plain( - "🎉🎊🥳 let's PARTY!! 🥳🎊🎉", - )); + let content = AnyMessageLikeEventContent::RoomMessage( + RoomMessageEventContent::text_plain("🎉🎊🥳 let's PARTY!! 🥳🎊🎉"), + ); println!("sending"); @@ -59,7 +59,7 @@ impl WasmBot { for (room_id, room) in response.rooms.join { for event in room.timeline.events { - if let Ok(AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomMessage(ev))) = + if let Ok(AnySyncRoomEvent::Message(AnySyncMessageLikeEvent::RoomMessage(ev))) = event.event.deserialize() { self.on_room_message(&room_id, &ev).await diff --git a/crates/matrix-sdk/src/account.rs b/crates/matrix-sdk/src/account.rs index 1db85f5ab..f39ef9461 100644 --- a/crates/matrix-sdk/src/account.rs +++ b/crates/matrix-sdk/src/account.rs @@ -16,7 +16,7 @@ use std::io::Read; -use matrix_sdk_base::media::{MediaFormat, MediaRequest, MediaType}; +use matrix_sdk_base::media::{MediaFormat, MediaRequest}; use mime::Mime; use ruma::{ api::client::{ @@ -30,6 +30,7 @@ use ruma::{ uiaa::AuthData, }, assign, + events::room::MediaSource, thirdparty::Medium, ClientSecret, MxcUri, SessionId, UInt, }; @@ -167,7 +168,7 @@ impl Account { /// ``` pub async fn get_avatar(&self, format: MediaFormat) -> Result>> { if let Some(url) = self.get_avatar_url().await? { - let request = MediaRequest { media_type: MediaType::Uri(url), format }; + let request = MediaRequest { source: MediaSource::Plain(url), format }; Ok(Some(self.client.get_media_content(&request, true).await?)) } else { Ok(None) diff --git a/crates/matrix-sdk/src/attachment.rs b/crates/matrix-sdk/src/attachment.rs index 591aaf6f1..528555db8 100644 --- a/crates/matrix-sdk/src/attachment.rs +++ b/crates/matrix-sdk/src/attachment.rs @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::io::Read; #[cfg(feature = "image_proc")] use std::io::{BufRead, Cursor, Seek}; +use std::{io::Read, time::Duration}; #[cfg(feature = "image_proc")] use image::GenericImageView; @@ -46,8 +46,8 @@ pub struct BaseImageInfo { /// Base metadata about a video. #[derive(Debug, Clone)] pub struct BaseVideoInfo { - /// The duration of the video in milliseconds. - pub duration: Option, + /// The duration of the video. + pub duration: Option, /// The height of the video in pixels. pub height: Option, /// The width of the video in pixels. @@ -61,8 +61,8 @@ pub struct BaseVideoInfo { /// Base metadata about an audio clip. #[derive(Debug, Clone)] pub struct BaseAudioInfo { - /// The duration of the audio clip in milliseconds. - pub duration: Option, + /// The duration of the audio clip. + pub duration: Option, /// The file size of the audio clip in bytes. pub size: Option, } diff --git a/crates/matrix-sdk/src/client/builder.rs b/crates/matrix-sdk/src/client/builder.rs index 078cd4ffd..b70525182 100644 --- a/crates/matrix-sdk/src/client/builder.rs +++ b/crates/matrix-sdk/src/client/builder.rs @@ -4,7 +4,7 @@ use matrix_sdk_base::{locks::RwLock, store::StoreConfig, BaseClient, StateStore} use ruma::{ api::{ client::{ - discover::{discover_homeserver, get_supported_versions}, + discovery::{discover_homeserver, get_supported_versions}, Error, }, error::FromHttpResponseError, diff --git a/crates/matrix-sdk/src/client/mod.rs b/crates/matrix-sdk/src/client/mod.rs index 53447172a..fbe11fa5a 100644 --- a/crates/matrix-sdk/src/client/mod.rs +++ b/crates/matrix-sdk/src/client/mod.rs @@ -27,7 +27,7 @@ use dashmap::DashMap; use futures_core::stream::Stream; use matrix_sdk_base::{ deserialized_responses::SyncResponse, - media::{MediaEventContent, MediaFormat, MediaRequest, MediaThumbnailSize, MediaType}, + media::{MediaEventContent, MediaFormat, MediaRequest, MediaThumbnailSize}, BaseClient, Session, Store, }; use matrix_sdk_common::{ @@ -41,9 +41,9 @@ use ruma::{ api::{ client::{ account::{register, whoami}, - capabilities::{get_capabilities, Capabilities}, device::{delete_devices, get_devices}, directory::{get_public_rooms, get_public_rooms_filtered}, + discovery::get_capabilities::{self, Capabilities}, filter::{create_filter::v3::Request as FilterUploadRequest, FilterDefinition}, media::{create_content, get_content, get_content_thumbnail}, membership::{join_room_by_id, join_room_by_id_or_alias}, @@ -57,6 +57,7 @@ use ruma::{ MatrixVersion, OutgoingRequest, SendAccessToken, }, assign, + events::room::MediaSource, presence::PresenceState, DeviceId, MxcUri, RoomId, RoomOrAliasId, ServerName, UInt, UserId, }; @@ -377,7 +378,7 @@ impl Client { /// // Custom events work exactly the same way, you just need to declare /// // the content struct and use the EventContent derive macro on it. /// #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] - /// #[ruma_event(type = "org.shiny_new_2fa.token", kind = Message)] + /// #[ruma_event(type = "org.shiny_new_2fa.token", kind = MessageLike)] /// struct TokenEventContent { /// token: String, /// #[serde(rename = "exp")] @@ -1930,8 +1931,8 @@ impl Client { if let Some(content) = content { Ok(content) } else { - let content: Vec = match &request.media_type { - MediaType::Encrypted(file) => { + let content: Vec = match &request.source { + MediaSource::Encrypted(file) => { let content: Vec = self.send(get_content::v3::Request::from_url(&file.url)?, None).await?.file; @@ -1951,7 +1952,7 @@ impl Client { content } - MediaType::Uri(uri) => { + MediaSource::Plain(uri) => { if let MediaFormat::Thumbnail(size) = &request.format { self.send( get_content_thumbnail::v3::Request::from_url( @@ -2016,10 +2017,10 @@ impl Client { event_content: impl MediaEventContent, use_cache: bool, ) -> Result>> { - if let Some(media_type) = event_content.file() { + if let Some(source) = event_content.source() { Ok(Some( self.get_media_content( - &MediaRequest { media_type, format: MediaFormat::File }, + &MediaRequest { source, format: MediaFormat::File }, use_cache, ) .await?, @@ -2038,9 +2039,8 @@ impl Client { /// /// * `event_content` - The media event content. pub async fn remove_file(&self, event_content: impl MediaEventContent) -> Result<()> { - if let Some(media_type) = event_content.file() { - self.remove_media_content(&MediaRequest { media_type, format: MediaFormat::File }) - .await? + if let Some(source) = event_content.source() { + self.remove_media_content(&MediaRequest { source, format: MediaFormat::File }).await? } Ok(()) @@ -2070,10 +2070,10 @@ impl Client { size: MediaThumbnailSize, use_cache: bool, ) -> Result>> { - if let Some(media_type) = event_content.thumbnail() { + if let Some(source) = event_content.thumbnail_source() { Ok(Some( self.get_media_content( - &MediaRequest { media_type, format: MediaFormat::Thumbnail(size) }, + &MediaRequest { source, format: MediaFormat::Thumbnail(size) }, use_cache, ) .await?, @@ -2099,9 +2099,9 @@ impl Client { event_content: impl MediaEventContent, size: MediaThumbnailSize, ) -> Result<()> { - if let Some(media_type) = event_content.file() { + if let Some(source) = event_content.source() { self.remove_media_content(&MediaRequest { - media_type, + source, format: MediaFormat::Thumbnail(size), }) .await? @@ -2126,7 +2126,7 @@ impl Client { info: Option, thumbnail: Option>, ) -> Result { - let (thumbnail_url, thumbnail_info) = if let Some(thumbnail) = thumbnail { + let (thumbnail_source, thumbnail_info) = if let Some(thumbnail) = thumbnail { let response = self.upload(thumbnail.content_type, thumbnail.reader).await?; let url = response.content_uri; @@ -2136,7 +2136,7 @@ impl Client { { mimetype: Some(thumbnail.content_type.as_ref().to_owned()) } ); - (Some(url), Some(Box::new(thumbnail_info))) + (Some(MediaSource::Plain(url)), Some(Box::new(thumbnail_info))) } else { (None, None) }; @@ -2152,8 +2152,8 @@ impl Client { info.map(room::ImageInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_url, - thumbnail_info + thumbnail_source, + thumbnail_info, } ); message::MessageType::Image(message::ImageMessageEventContent::plain( @@ -2180,7 +2180,7 @@ impl Client { info.map(message::VideoInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_url, + thumbnail_source, thumbnail_info } ); @@ -2195,7 +2195,7 @@ impl Client { info.map(message::FileInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_url, + thumbnail_source, thumbnail_info } ); @@ -2218,7 +2218,7 @@ pub(crate) mod test { use std::{collections::BTreeMap, convert::TryInto, io::Cursor, str::FromStr, time::Duration}; - use matrix_sdk_base::media::{MediaFormat, MediaRequest, MediaThumbnailSize, MediaType}; + use matrix_sdk_base::media::{MediaFormat, MediaRequest, MediaThumbnailSize}; use matrix_sdk_common::deserialized_responses::SyncRoomEvent; use matrix_sdk_test::{test_json, EventBuilder, EventsJson}; use mockito::{mock, Matcher}; @@ -2245,7 +2245,7 @@ pub(crate) mod test { events::{ room::{ message::{ImageMessageEventContent, RoomMessageEventContent}, - ImageInfo, + ImageInfo, MediaSource, }, AnySyncStateEvent, StateEventType, }, @@ -2584,7 +2584,7 @@ pub(crate) mod test { .create(); if let Err(err) = client.login("example", "wordpass", None, None).await { - if let crate::Error::Http(HttpError::ClientApi(FromHttpResponseError::Http( + if let crate::Error::Http(HttpError::ClientApi(FromHttpResponseError::Server( ServerError::Known(client_api::Error { kind, message, status_code }), ))) = err { @@ -2621,7 +2621,7 @@ pub(crate) mod test { }); if let Err(err) = client.register(user).await { - if let HttpError::UiaaError(FromHttpResponseError::Http(ServerError::Known( + if let HttpError::UiaaError(FromHttpResponseError::Server(ServerError::Known( UiaaResponse::MatrixError(client_api::Error { kind, message, status_code }), ))) = err { @@ -3177,7 +3177,7 @@ pub(crate) mod test { let config = AttachmentConfig::new().info(AttachmentInfo::Video(BaseVideoInfo { height: Some(uint!(600)), width: Some(uint!(800)), - duration: Some(uint!(3600)), + duration: Some(Duration::from_millis(3600)), size: None, blurhash: None, })); @@ -3558,7 +3558,7 @@ pub(crate) mod test { let client = logged_in_client().await; let request = MediaRequest { - media_type: MediaType::Uri(mxc_uri!("mxc://localhost/textfile").to_owned()), + source: MediaSource::Plain(mxc_uri!("mxc://localhost/textfile").to_owned()), format: MediaFormat::File, }; diff --git a/crates/matrix-sdk/src/encryption/mod.rs b/crates/matrix-sdk/src/encryption/mod.rs index 8bbe2a408..f2d177426 100644 --- a/crates/matrix-sdk/src/encryption/mod.rs +++ b/crates/matrix-sdk/src/encryption/mod.rs @@ -48,7 +48,9 @@ use ruma::{ uiaa::AuthData, }, assign, - events::{AnyMessageEvent, AnyRoomEvent, AnySyncMessageEvent, GlobalAccountDataEventType}, + events::{ + AnyMessageLikeEvent, AnyRoomEvent, AnySyncMessageLikeEvent, GlobalAccountDataEventType, + }, serde::Raw, DeviceId, TransactionId, UserId, }; @@ -70,13 +72,13 @@ impl Client { #[cfg(feature = "encryption")] pub(crate) async fn decrypt_room_event(&self, event: Raw) -> RoomEvent { if let Some(machine) = self.olm_machine().await { - if let Ok(AnyRoomEvent::Message(event)) = event.deserialize() { - if let AnyMessageEvent::RoomEncrypted(_) = event { + if let Ok(AnyRoomEvent::MessageLike(event)) = event.deserialize() { + if let AnyMessageLikeEvent::RoomEncrypted(_) = event { let room_id = event.room_id(); - // Turn the AnyMessageEvent into a AnySyncMessageEvent + // Turn the AnyMessageLikeEvent into a AnySyncMessageLikeEvent let event = event.clone().into(); - if let AnySyncMessageEvent::RoomEncrypted(e) = event { + if let AnySyncMessageLikeEvent::RoomEncrypted(e) = event { if let Ok(decrypted) = machine.decrypt_room_event(&e, room_id).await { return decrypted; } @@ -120,7 +122,7 @@ impl Client { info: Option, thumbnail: Option>, ) -> Result { - let (thumbnail_file, thumbnail_info) = if let Some(thumbnail) = thumbnail { + let (thumbnail_source, thumbnail_info) = if let Some(thumbnail) = thumbnail { let mut reader = matrix_sdk_base::crypto::AttachmentEncryptor::new(thumbnail.reader); let response = self.upload(thumbnail.content_type, &mut reader).await?; @@ -143,7 +145,7 @@ impl Client { { mimetype: Some(thumbnail.content_type.as_ref().to_owned()) } ); - (Some(Box::new(file)), Some(Box::new(thumbnail_info))) + (Some(MediaSource::Encrypted(Box::new(file))), Some(Box::new(thumbnail_info))) } else { (None, None) }; @@ -164,14 +166,14 @@ impl Client { .into() }; - use ruma::events::room::{self, message}; + use ruma::events::room::{self, message, MediaSource}; Ok(match content_type.type_() { mime::IMAGE => { let info = assign!( info.map(room::ImageInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_file, + thumbnail_source, thumbnail_info } ); @@ -199,7 +201,7 @@ impl Client { info.map(message::VideoInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_file, + thumbnail_source, thumbnail_info } ); @@ -214,7 +216,7 @@ impl Client { info.map(message::FileInfo::from).unwrap_or_default(), { mimetype: Some(content_type.as_ref().to_owned()), - thumbnail_file, + thumbnail_source, thumbnail_info } ); @@ -234,13 +236,10 @@ impl Client { ) -> Result { let own_user = self.user_id().await.ok_or_else(|| Error::from(HttpError::AuthenticationRequired))?; - let data = serde_json::value::to_raw_value(&content)?; let request = ruma::api::client::config::set_global_account_data::v3::Request::new( - &data, - ruma::events::EventContent::event_type(&content), - &own_user, - ); + &content, &own_user, + )?; Ok(self.send(request, None).await?) } @@ -376,11 +375,9 @@ impl Client { &self, request: &ToDeviceRequest, ) -> HttpResult { - let request = RumaToDeviceRequest::new_raw( - request.event_type.as_str(), - &request.txn_id, - request.messages.clone(), - ); + let event_type = request.event_type.to_string(); + let request = + RumaToDeviceRequest::new_raw(&event_type, &request.txn_id, request.messages.clone()); self.send(request, None).await } diff --git a/crates/matrix-sdk/src/error.rs b/crates/matrix-sdk/src/error.rs index 871a9ac51..97be0e276 100644 --- a/crates/matrix-sdk/src/error.rs +++ b/crates/matrix-sdk/src/error.rs @@ -34,7 +34,7 @@ use ruma::{ error::{FromHttpResponseError, IntoHttpError, MatrixError as RumaApiError, ServerError}, }, events::tag::InvalidUserTagName, - identifiers::Error as IdentifierError, + IdParseError, }; use serde_json::Error as JsonError; use thiserror::Error; @@ -149,7 +149,7 @@ pub enum Error { /// An error encountered when trying to parse an identifier. #[error(transparent)] - Identifier(#[from] IdentifierError), + Identifier(#[from] IdParseError), /// An error encountered when trying to parse a url. #[error(transparent)] @@ -211,7 +211,7 @@ impl HttpError { /// This method is an convenience method to get to the info the server /// returned on the first, failed request. pub fn uiaa_response(&self) -> Option<&UiaaInfo> { - if let HttpError::UiaaError(FromHttpResponseError::Http(ServerError::Known( + if let HttpError::UiaaError(FromHttpResponseError::Server(ServerError::Known( UiaaError::AuthResponse(i), ))) = self { @@ -235,9 +235,9 @@ impl Error { /// This method is an convenience method to get to the info the server /// returned on the first, failed request. pub fn uiaa_response(&self) -> Option<&UiaaInfo> { - if let Error::Http(HttpError::UiaaError(FromHttpResponseError::Http(ServerError::Known( - UiaaError::AuthResponse(i), - )))) = self + if let Error::Http(HttpError::UiaaError(FromHttpResponseError::Server( + ServerError::Known(UiaaError::AuthResponse(i)), + ))) = self { Some(i) } else { diff --git a/crates/matrix-sdk/src/event_handler.rs b/crates/matrix-sdk/src/event_handler.rs index 19cf4e1ad..0811a49d6 100644 --- a/crates/matrix-sdk/src/event_handler.rs +++ b/crates/matrix-sdk/src/event_handler.rs @@ -390,35 +390,37 @@ mod static_events { use ruma::events::{ self, presence::{PresenceEvent, PresenceEventContent}, - StaticEventContent, + EphemeralRoomEventType, EventContent, GlobalAccountDataEventType, MessageLikeEventType, + RedactedEventContent, RoomAccountDataEventType, StateEventType, StaticEventContent, + ToDeviceEventType, }; use super::{EventKind, SyncEvent}; impl SyncEvent for events::GlobalAccountDataEvent where - C: StaticEventContent + events::GlobalAccountDataEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::GlobalAccountData, C::TYPE); } impl SyncEvent for events::RoomAccountDataEvent where - C: StaticEventContent + events::RoomAccountDataEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::RoomAccountData, C::TYPE); } impl SyncEvent for events::SyncEphemeralRoomEvent where - C: StaticEventContent + events::EphemeralRoomEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::EphemeralRoomData, C::TYPE); } - impl SyncEvent for events::SyncMessageEvent + impl SyncEvent for events::SyncMessageLikeEvent where - C: StaticEventContent + events::MessageEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::Message { redacted: false }, C::TYPE); } @@ -432,28 +434,28 @@ mod static_events { impl SyncEvent for events::SyncStateEvent where - C: StaticEventContent + events::StateEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::State { redacted: false }, C::TYPE); } impl SyncEvent for events::StrippedStateEvent where - C: StaticEventContent + events::StateEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::StrippedState, C::TYPE); } impl SyncEvent for events::InitialStateEvent where - C: StaticEventContent + events::StateEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::InitialState, C::TYPE); } impl SyncEvent for events::ToDeviceEvent where - C: StaticEventContent + events::ToDeviceEventContent, + C: StaticEventContent + EventContent, { const ID: (EventKind, &'static str) = (EventKind::ToDevice, C::TYPE); } @@ -462,9 +464,11 @@ mod static_events { const ID: (EventKind, &'static str) = (EventKind::Presence, PresenceEventContent::TYPE); } - impl SyncEvent for events::RedactedSyncMessageEvent + impl SyncEvent for events::RedactedSyncMessageLikeEvent where - C: StaticEventContent + events::RedactedMessageEventContent, + C: StaticEventContent + + EventContent + + RedactedEventContent, { const ID: (EventKind, &'static str) = (EventKind::Message { redacted: true }, C::TYPE); } @@ -478,7 +482,7 @@ mod static_events { impl SyncEvent for events::RedactedSyncStateEvent where - C: StaticEventContent + events::RedactedStateEventContent, + C: StaticEventContent + EventContent + RedactedEventContent, { const ID: (EventKind, &'static str) = (EventKind::State { redacted: true }, C::TYPE); } diff --git a/crates/matrix-sdk/src/room/common.rs b/crates/matrix-sdk/src/room/common.rs index fc0ff6ec7..95d807d82 100644 --- a/crates/matrix-sdk/src/room/common.rs +++ b/crates/matrix-sdk/src/room/common.rs @@ -16,9 +16,9 @@ use ruma::{ }, assign, events::{ - room::history_visibility::HistoryVisibility, + room::{history_visibility::HistoryVisibility, MediaSource}, tag::{TagInfo, TagName}, - AnyStateEvent, AnySyncStateEvent, StateEventContent, StateEventType, StaticEventContent, + AnyStateEvent, AnySyncStateEvent, EventContent, StateEventType, StaticEventContent, SyncStateEvent, }, serde::Raw, @@ -26,7 +26,7 @@ use ruma::{ }; use crate::{ - media::{MediaFormat, MediaRequest, MediaType}, + media::{MediaFormat, MediaRequest}, room::RoomType, BaseRoom, Client, HttpError, HttpResult, Result, RoomMember, }; @@ -131,7 +131,7 @@ impl Common { /// ``` 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 { source: MediaSource::Plain(url.clone()), format }; Ok(Some(self.client.get_media_content(&request, true).await?)) } else { Ok(None) @@ -661,7 +661,7 @@ impl Common { /// ``` pub async fn get_state_events_static(&self) -> Result>>> where - C: StaticEventContent + StateEventContent, + C: StaticEventContent + EventContent, { // FIXME: Could be more efficient, if we had streaming store accessor functions Ok(self.get_state_events(C::TYPE.into()).await?.into_iter().map(Raw::cast).collect()) @@ -701,7 +701,7 @@ impl Common { state_key: &str, ) -> Result>>> where - C: StaticEventContent + StateEventContent, + C: StaticEventContent + EventContent, { Ok(self.get_state_event(C::TYPE.into(), state_key).await?.map(Raw::cast)) } diff --git a/crates/matrix-sdk/src/room/joined.rs b/crates/matrix-sdk/src/room/joined.rs index 993ded0d6..ec06f6c9f 100644 --- a/crates/matrix-sdk/src/room/joined.rs +++ b/crates/matrix-sdk/src/room/joined.rs @@ -26,7 +26,9 @@ use ruma::{ typing::create_typing_event::v3::{Request as TypingRequest, Typing}, }, assign, - events::{room::message::RoomMessageEventContent, MessageEventContent, StateEventContent}, + events::{ + room::message::RoomMessageEventContent, EventContent, MessageLikeEventType, StateEventType, + }, receipt::ReceiptType, serde::Raw, EventId, TransactionId, UserId, @@ -402,8 +404,8 @@ impl Joined { /// earlier transaction ID. /// * On the receiving side, the field is used for recognizing our own /// messages when they arrive down the sync: the server includes the - /// ID in the [`Unsigned`] field [`transaction_id`] of the - /// corresponding [`SyncMessageEvent`], but only for the *sending* + /// ID in the [`MessageLikeUnsigned`] field [`transaction_id`] of the + /// corresponding [`SyncMessageLikeEvent`], but only for the *sending* /// device. Other devices will not see it. This is then used to ignore /// events sent by our own device and/or to implement local echo. /// @@ -438,7 +440,7 @@ impl Joined { /// /// // Custom events work too: /// #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] - /// #[ruma_event(type = "org.shiny_new_2fa.token", kind = Message)] + /// #[ruma_event(type = "org.shiny_new_2fa.token", kind = MessageLike)] /// struct TokenEventContent { /// token: String, /// #[serde(rename = "exp")] @@ -461,18 +463,18 @@ impl Joined { /// # Result::<_, matrix_sdk::Error>::Ok(()) }); /// ``` /// - /// [`SyncMessageEvent`]: ruma::events::SyncMessageEvent - /// [`Unsigned`]: ruma::events::Unsigned - /// [`transaction_id`]: ruma::events::Unsigned#structfield.transaction_id + /// [`SyncMessageLikeEvent`]: ruma::events::SyncMessageLikeEvent + /// [`MessageLikeUnsigned`]: ruma::events::MessageLikeUnsigned + /// [`transaction_id`]: ruma::events::MessageLikeUnsigned#structfield.transaction_id pub async fn send( &self, - content: impl MessageEventContent, + content: impl EventContent, txn_id: Option<&TransactionId>, ) -> Result { - let event_type = content.event_type(); + let event_type = content.event_type().to_string(); let content = serde_json::to_value(&content)?; - self.send_raw(content, event_type, txn_id).await + self.send_raw(content, &event_type, txn_id).await } /// Send a room message to this room from a json `Value`. @@ -500,8 +502,8 @@ impl Joined { /// earlier transaction ID. /// * On the receiving side, the field is used for recognizing our own /// messages when they arrive down the sync: the server includes the - /// ID in the [`Unsigned`] field [`transaction_id`] of the - /// corresponding [`SyncMessageEvent`], but only for the *sending* + /// ID in the [`StateUnsigned`] field [`transaction_id`] of the + /// corresponding [`SyncMessageLikeEvent`], but only for the *sending* /// device. Other devices will not see it. This is then used to ignore /// events sent by our own device and/or to implement local echo. /// @@ -529,9 +531,9 @@ impl Joined { /// # Result::<_, matrix_sdk::Error>::Ok(()) }); /// ``` /// - /// [`SyncMessageEvent`]: ruma::events::SyncMessageEvent - /// [`Unsigned`]: ruma::events::Unsigned - /// [`transaction_id`]: ruma::events::Unsigned#structfield.transaction_id + /// [`SyncMessageLikeEvent`]: ruma::events::SyncMessageLikeEvent + /// [`StateUnsigned`]: ruma::events::StateUnsigned + /// [`transaction_id`]: ruma::events::StateUnsigned#structfield.transaction_id pub async fn send_raw( &self, content: Value, @@ -583,7 +585,7 @@ impl Joined { let request = send_message_event::v3::Request::new_raw( self.inner.room_id(), &txn_id, - event_type, + event_type.into(), content, ); @@ -806,7 +808,7 @@ impl Joined { /// ``` pub async fn send_state_event( &self, - content: impl StateEventContent, + content: impl EventContent, state_key: &str, ) -> Result { let request = @@ -857,7 +859,7 @@ impl Joined { let content = Raw::new(&content)?.cast(); let request = send_state_event::v3::Request::new_raw( self.inner.room_id(), - event_type, + event_type.into(), state_key, content, ); diff --git a/crates/matrix-sdk/src/room_member.rs b/crates/matrix-sdk/src/room_member.rs index c88e8f74e..a180993ee 100644 --- a/crates/matrix-sdk/src/room_member.rs +++ b/crates/matrix-sdk/src/room_member.rs @@ -1,7 +1,9 @@ use std::ops::Deref; +use ruma::events::room::MediaSource; + use crate::{ - media::{MediaFormat, MediaRequest, MediaType}, + media::{MediaFormat, MediaRequest}, BaseRoomMember, Client, Result, }; @@ -61,7 +63,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.to_owned()), format }; + let request = MediaRequest { source: MediaSource::Plain(url.to_owned()), format }; Ok(Some(self.client.get_media_content(&request, true).await?)) } else { Ok(None)