Merge branch 'ruma-0.3'

master
Damir Jelić 2021-08-12 15:22:21 +02:00
commit 725fd817c2
15 changed files with 81 additions and 108 deletions

View File

@ -26,5 +26,5 @@ byteorder = "1.4.3"
image = { version = "0.23.14", optional = true } image = { version = "0.23.14", optional = true }
qrcode = { version = "0.12.0", default-features = false } qrcode = { version = "0.12.0", default-features = false }
rqrr = { version = "0.3.2", optional = true } rqrr = { version = "0.3.2", optional = true }
ruma-identifiers = "0.19.3" ruma-identifiers = "0.20.0"
thiserror = "1.0.25" thiserror = "1.0.25"

View File

@ -55,7 +55,7 @@ version = "0.11.3"
default_features = false default_features = false
[dependencies.ruma] [dependencies.ruma]
version = "0.2.0" version = "0.3.0"
features = ["client-api-c", "compat", "unstable-pre-spec"] features = ["client-api-c", "compat", "unstable-pre-spec"]
[dependencies.tokio-stream] [dependencies.tokio-stream]

View File

@ -1,30 +1,12 @@
use std::{ use std::{
collections::BTreeMap,
env, io, env, io,
process::exit, process::exit,
sync::atomic::{AtomicBool, Ordering}, sync::atomic::{AtomicBool, Ordering},
}; };
use matrix_sdk::{ use matrix_sdk::{ruma::UserId, Client, LoopCtrl, SyncSettings};
ruma::{api::client::r0::uiaa::AuthData, UserId},
Client, LoopCtrl, SyncSettings,
};
use serde_json::json;
use url::Url; use url::Url;
fn auth_data<'a>(user: &UserId, password: &str, session: Option<&'a str>) -> AuthData<'a> {
let mut auth_parameters = BTreeMap::new();
let identifier = json!({
"type": "m.id.user",
"user": user,
});
auth_parameters.insert("identifier".to_owned(), identifier);
auth_parameters.insert("password".to_owned(), password.to_owned().into());
AuthData::DirectRequest { kind: "m.login.password", auth_parameters, session }
}
async fn bootstrap(client: Client, user_id: UserId, password: String) { async fn bootstrap(client: Client, user_id: UserId, password: String) {
println!("Bootstrapping a new cross signing identity, press enter to continue."); println!("Bootstrapping a new cross signing identity, press enter to continue.");
@ -34,8 +16,14 @@ async fn bootstrap(client: Client, user_id: UserId, password: String) {
#[cfg(feature = "encryption")] #[cfg(feature = "encryption")]
if let Err(e) = client.bootstrap_cross_signing(None).await { if let Err(e) = client.bootstrap_cross_signing(None).await {
use matrix_sdk::ruma::{api::client::r0::uiaa, assign};
if let Some(response) = e.uiaa_response() { if let Some(response) = e.uiaa_response() {
let auth_data = auth_data(&user_id, &password, response.session.as_deref()); let auth_data = uiaa::AuthData::Password(assign!(
uiaa::Password::new(uiaa::UserIdentifier::MatrixId(user_id.as_str()), &password),
{ session: response.session.as_deref() }
));
client client
.bootstrap_cross_signing(Some(auth_data)) .bootstrap_cross_signing(Some(auth_data))
.await .await

View File

@ -118,7 +118,7 @@ use ruma::{
room::create_room, room::create_room,
session::{get_login_types, login, sso_login}, session::{get_login_types, login, sso_login},
sync::sync_events, sync::sync_events,
uiaa::AuthData, uiaa::{AuthData, UserIdentifier},
}, },
unversioned::{discover_homeserver, get_supported_versions}, unversioned::{discover_homeserver, get_supported_versions},
}, },
@ -1070,14 +1070,12 @@ impl Client {
) -> Result<login::Response> { ) -> Result<login::Response> {
info!("Logging in to {} as {:?}", self.homeserver().await, user); info!("Logging in to {} as {:?}", self.homeserver().await, user);
let request = assign!( let login_info =
login::Request::new( login::LoginInfo::Password { identifier: UserIdentifier::MatrixId(user), password };
login::LoginInfo::Password { identifier: login::UserIdentifier::MatrixId(user), password }, let request = assign!(login::Request::new(login_info), {
), { device_id: device_id.map(|d| d.into()),
device_id: device_id.map(|d| d.into()), initial_device_display_name,
initial_device_display_name, });
}
);
let response = self.send(request, None).await?; let response = self.send(request, None).await?;
self.base_client.receive_login_response(&response).await?; self.base_client.receive_login_response(&response).await?;
@ -1383,7 +1381,7 @@ impl Client {
/// # use matrix_sdk::ruma::{ /// # use matrix_sdk::ruma::{
/// # api::client::r0::{ /// # api::client::r0::{
/// # account::register::{Request as RegistrationRequest, RegistrationKind}, /// # account::register::{Request as RegistrationRequest, RegistrationKind},
/// # uiaa::AuthData, /// # uiaa,
/// # }, /// # },
/// # assign, DeviceId, /// # assign, DeviceId,
/// # }; /// # };
@ -1395,7 +1393,9 @@ impl Client {
/// let request = assign!(RegistrationRequest::new(), { /// let request = assign!(RegistrationRequest::new(), {
/// username: Some("user"), /// username: Some("user"),
/// password: Some("password"), /// password: Some("password"),
/// auth: Some(AuthData::FallbackAcknowledgement { session: "foobar" }), /// auth: Some(uiaa::AuthData::FallbackAcknowledgement(
/// uiaa::FallbackAcknowledgement::new("foobar"),
/// )),
/// }); /// });
/// let client = Client::new(homeserver).unwrap(); /// let client = Client::new(homeserver).unwrap();
/// client.register(request).await; /// client.register(request).await;
@ -1886,9 +1886,12 @@ impl Client {
/// ///
/// ```no_run /// ```no_run
/// # use matrix_sdk::{ /// # use matrix_sdk::{
/// # ruma::api::{ /// # ruma::{
/// # client::r0::uiaa::{UiaaResponse, AuthData}, /// # api::{
/// # error::{FromHttpResponseError, ServerError}, /// # client::r0::uiaa,
/// # error::{FromHttpResponseError, ServerError},
/// # },
/// # assign,
/// # }, /// # },
/// # Client, Error, SyncSettings, /// # Client, Error, SyncSettings,
/// # }; /// # };
@ -1903,20 +1906,10 @@ impl Client {
/// ///
/// if let Err(e) = client.delete_devices(devices, None).await { /// if let Err(e) = client.delete_devices(devices, None).await {
/// if let Some(info) = e.uiaa_response() { /// if let Some(info) = e.uiaa_response() {
/// let mut auth_parameters = BTreeMap::new(); /// let auth_data = uiaa::AuthData::Password(assign!(
/// /// uiaa::Password::new(uiaa::UserIdentifier::MatrixId("example"), "wordpass"),
/// let identifier = json!({ /// { session: info.session.as_deref() }
/// "type": "m.id.user", /// ));
/// "user": "example",
/// });
/// auth_parameters.insert("identifier".to_owned(), identifier);
/// auth_parameters.insert("password".to_owned(), "wordpass".into());
///
/// let auth_data = AuthData::DirectRequest {
/// kind: "m.login.password",
/// auth_parameters,
/// session: info.session.as_deref(),
/// };
/// ///
/// client /// client
/// .delete_devices(devices, Some(auth_data)) /// .delete_devices(devices, Some(auth_data))
@ -2320,8 +2313,10 @@ impl Client {
/// # Examples /// # Examples
/// ```no_run /// ```no_run
/// # use std::{convert::TryFrom, collections::BTreeMap}; /// # use std::{convert::TryFrom, collections::BTreeMap};
/// # use matrix_sdk::{Client, ruma::UserId}; /// # use matrix_sdk::{
/// # use matrix_sdk::ruma::api::client::r0::uiaa::AuthData; /// # ruma::{api::client::r0::uiaa, assign, UserId},
/// # Client,
/// # };
/// # use url::Url; /// # use url::Url;
/// # use futures::executor::block_on; /// # use futures::executor::block_on;
/// # use serde_json::json; /// # use serde_json::json;
@ -2329,30 +2324,17 @@ impl Client {
/// # let homeserver = Url::parse("http://example.com").unwrap(); /// # let homeserver = Url::parse("http://example.com").unwrap();
/// # let client = Client::new(homeserver).unwrap(); /// # let client = Client::new(homeserver).unwrap();
/// # block_on(async { /// # block_on(async {
///
/// fn auth_data<'a>(user: &UserId, password: &str, session: Option<&'a str>) -> AuthData<'a> {
/// let mut auth_parameters = BTreeMap::new();
/// let identifier = json!({
/// "type": "m.id.user",
/// "user": user,
/// });
/// auth_parameters.insert("identifier".to_owned(), identifier);
/// auth_parameters.insert("password".to_owned(), password.to_owned().into());
///
/// AuthData::DirectRequest {
/// kind: "m.login.password",
/// auth_parameters,
/// session,
/// }
/// }
///
/// if let Err(e) = client.bootstrap_cross_signing(None).await { /// if let Err(e) = client.bootstrap_cross_signing(None).await {
/// if let Some(response) = e.uiaa_response() { /// if let Some(response) = e.uiaa_response() {
/// let auth_data = auth_data(&user_id, "wordpass", response.session.as_deref()); /// let auth_data = uiaa::AuthData::Password(assign!(
/// client /// uiaa::Password::new(uiaa::UserIdentifier::MatrixId("example"), "wordpass"),
/// .bootstrap_cross_signing(Some(auth_data)) /// { session: response.session.as_deref() }
/// .await /// ));
/// .expect("Couldn't bootstrap cross signing") ///
/// client
/// .bootstrap_cross_signing(Some(auth_data))
/// .await
/// .expect("Couldn't bootstrap cross signing")
/// } else { /// } else {
/// panic!("Error durign cross signing bootstrap {:#?}", e); /// panic!("Error durign cross signing bootstrap {:#?}", e);
/// } /// }
@ -2797,7 +2779,7 @@ mod test {
media::get_content_thumbnail::Method, media::get_content_thumbnail::Method,
membership::Invite3pidInit, membership::Invite3pidInit,
session::get_login_types::LoginType, session::get_login_types::LoginType,
uiaa::{AuthData, UiaaResponse}, uiaa::{self, UiaaResponse},
}, },
}, },
error::{FromHttpResponseError, ServerError}, error::{FromHttpResponseError, ServerError},
@ -3137,7 +3119,9 @@ mod test {
let user = assign!(RegistrationRequest::new(), { let user = assign!(RegistrationRequest::new(), {
username: Some("user"), username: Some("user"),
password: Some("password"), password: Some("password"),
auth: Some(AuthData::FallbackAcknowledgement { session: "foobar" }), auth: Some(uiaa::AuthData::FallbackAcknowledgement(
uiaa::FallbackAcknowledgement::new("foobar"),
)),
kind: RegistrationKind::User, kind: RegistrationKind::User,
}); });
@ -3813,11 +3797,10 @@ mod test {
auth_parameters.insert("identifier".to_owned(), identifier); auth_parameters.insert("identifier".to_owned(), identifier);
auth_parameters.insert("password".to_owned(), "wordpass".into()); auth_parameters.insert("password".to_owned(), "wordpass".into());
let auth_data = AuthData::DirectRequest { let auth_data = uiaa::AuthData::Password(assign!(
kind: "m.login.password", uiaa::Password::new(uiaa::UserIdentifier::MatrixId("example"), "wordpass"),
auth_parameters, { session: info.session.as_deref() }
session: info.session.as_deref(), ));
};
client.delete_devices(devices, Some(auth_data)).await.unwrap(); client.delete_devices(devices, Some(auth_data)).await.unwrap();
} }

View File

@ -29,7 +29,7 @@ warp = { git = "https://github.com/seanmonstar/warp.git", rev = "629405", option
matrix-sdk = { version = "0.3", path = "../matrix_sdk", default-features = false, features = ["appservice", "native-tls"] } matrix-sdk = { version = "0.3", path = "../matrix_sdk", default-features = false, features = ["appservice", "native-tls"] }
[dependencies.ruma] [dependencies.ruma]
version = "0.2.0" version = "0.3.0"
features = ["client-api-c", "appservice-api-s", "unstable-pre-spec"] features = ["client-api-c", "appservice-api-s", "unstable-pre-spec"]
[dev-dependencies] [dev-dependencies]

View File

@ -26,7 +26,7 @@ docs = ["encryption", "sled_cryptostore"]
[dependencies] [dependencies]
dashmap = "4.0.2" dashmap = "4.0.2"
lru = "0.6.5" lru = "0.6.5"
ruma = { version = "0.2.0", features = ["client-api-c", "unstable-pre-spec"] } ruma = { version = "0.3.0", features = ["client-api-c", "unstable-pre-spec"] }
serde = { version = "1.0.126", features = ["rc"] } serde = { version = "1.0.126", features = ["rc"] }
serde_json = "1.0.64" serde_json = "1.0.64"
tracing = "0.1.26" tracing = "0.1.26"

View File

@ -83,7 +83,7 @@ impl BaseRoomInfo {
true true
} }
AnyStateEventContent::RoomName(n) => { AnyStateEventContent::RoomName(n) => {
self.name = n.name().map(|n| n.to_string()); self.name = n.name.as_ref().map(|n| n.to_string());
true true
} }
AnyStateEventContent::RoomCreate(c) => { AnyStateEventContent::RoomCreate(c) => {

View File

@ -13,7 +13,7 @@ version = "0.3.0"
[dependencies] [dependencies]
async-trait = "0.1.50" async-trait = "0.1.50"
instant = { version = "0.1.9", features = ["wasm-bindgen", "now"] } instant = { version = "0.1.9", features = ["wasm-bindgen", "now"] }
ruma = { version = "0.2.0", features = ["client-api-c"] } ruma = { version = "0.3.0", features = ["client-api-c"] }
serde = "1.0.126" serde = "1.0.126"
[target.'cfg(not(target_arch = "wasm32"))'.dependencies] [target.'cfg(not(target_arch = "wasm32"))'.dependencies]

View File

@ -22,7 +22,7 @@ docs = ["sled_cryptostore"]
[dependencies] [dependencies]
matrix-qrcode = { version = "0.1.0", path = "../matrix_qrcode" } matrix-qrcode = { version = "0.1.0", path = "../matrix_qrcode" }
matrix-sdk-common = { version = "0.3.0", path = "../matrix_sdk_common" } matrix-sdk-common = { version = "0.3.0", path = "../matrix_sdk_common" }
ruma = { version = "0.2.0", features = ["client-api-c", "unstable-pre-spec"] } ruma = { version = "0.3.0", features = ["client-api-c", "unstable-pre-spec"] }
olm-rs = { version = "1.0.1", features = ["serde"] } olm-rs = { version = "1.0.1", features = ["serde"] }
getrandom = "0.2.3" getrandom = "0.2.3"

View File

@ -28,7 +28,7 @@ use ruma::{
encryption::{DeviceKeys, SignedKey}, encryption::{DeviceKeys, SignedKey},
events::{ events::{
forwarded_room_key::ForwardedRoomKeyToDeviceEventContent, forwarded_room_key::ForwardedRoomKeyToDeviceEventContent,
key::verification::VerificationMethod, room::encrypted::EncryptedEventContent, key::verification::VerificationMethod, room::encrypted::EncryptedToDeviceEventContent,
AnyToDeviceEventContent, AnyToDeviceEventContent,
}, },
DeviceId, DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, UserId, DeviceId, DeviceIdBox, DeviceKeyAlgorithm, DeviceKeyId, EventEncryptionAlgorithm, UserId,
@ -231,7 +231,7 @@ impl Device {
pub(crate) async fn encrypt( pub(crate) async fn encrypt(
&self, &self,
content: AnyToDeviceEventContent, content: AnyToDeviceEventContent,
) -> OlmResult<(Session, EncryptedEventContent)> { ) -> OlmResult<(Session, EncryptedToDeviceEventContent)> {
self.inner.encrypt(&*self.verification_machine.store, content).await self.inner.encrypt(&*self.verification_machine.store, content).await
} }
@ -241,7 +241,7 @@ impl Device {
&self, &self,
session: InboundGroupSession, session: InboundGroupSession,
message_index: Option<u32>, message_index: Option<u32>,
) -> OlmResult<(Session, EncryptedEventContent)> { ) -> OlmResult<(Session, EncryptedToDeviceEventContent)> {
let export = if let Some(index) = message_index { let export = if let Some(index) = message_index {
session.export_at_index(index).await session.export_at_index(index).await
} else { } else {
@ -464,7 +464,7 @@ impl ReadOnlyDevice {
&self, &self,
store: &dyn CryptoStore, store: &dyn CryptoStore,
content: AnyToDeviceEventContent, content: AnyToDeviceEventContent,
) -> OlmResult<(Session, EncryptedEventContent)> { ) -> OlmResult<(Session, EncryptedToDeviceEventContent)> {
let sender_key = if let Some(k) = self.get_key(DeviceKeyAlgorithm::Curve25519) { let sender_key = if let Some(k) = self.get_key(DeviceKeyAlgorithm::Curve25519) {
k k
} else { } else {

View File

@ -772,7 +772,7 @@ mod test {
use ruma::{ use ruma::{
events::{ events::{
forwarded_room_key::ForwardedRoomKeyToDeviceEventContent, forwarded_room_key::ForwardedRoomKeyToDeviceEventContent,
room::encrypted::EncryptedEventContent, room::encrypted::EncryptedToDeviceEventContent,
room_key_request::RoomKeyRequestToDeviceEventContent, AnyToDeviceEvent, ToDeviceEvent, room_key_request::RoomKeyRequestToDeviceEventContent, AnyToDeviceEvent, ToDeviceEvent,
}, },
room_id, room_id,
@ -1214,7 +1214,7 @@ mod test {
.unwrap() .unwrap()
.get(&DeviceIdOrAllDevices::DeviceId(alice_device_id())) .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id()))
.unwrap(); .unwrap();
let content: EncryptedEventContent = content.deserialize_as().unwrap(); let content: EncryptedToDeviceEventContent = content.deserialize_as().unwrap();
bob_machine.mark_outgoing_request_as_sent(id).await.unwrap(); bob_machine.mark_outgoing_request_as_sent(id).await.unwrap();
@ -1362,7 +1362,7 @@ mod test {
.unwrap() .unwrap()
.get(&DeviceIdOrAllDevices::DeviceId(alice_device_id())) .get(&DeviceIdOrAllDevices::DeviceId(alice_device_id()))
.unwrap(); .unwrap();
let content: EncryptedEventContent = content.deserialize_as().unwrap(); let content: EncryptedToDeviceEventContent = content.deserialize_as().unwrap();
bob_machine.mark_outgoing_request_as_sent(id).await.unwrap(); bob_machine.mark_outgoing_request_as_sent(id).await.unwrap();

View File

@ -34,7 +34,9 @@ use ruma::{
}, },
assign, assign,
events::{ events::{
room::encrypted::{EncryptedEventContent, EncryptedEventScheme}, room::encrypted::{
EncryptedEventContent, EncryptedEventScheme, EncryptedToDeviceEventContent,
},
room_key::RoomKeyToDeviceEventContent, room_key::RoomKeyToDeviceEventContent,
AnyMessageEventContent, AnyRoomEvent, AnyToDeviceEvent, SyncMessageEvent, ToDeviceEvent, AnyMessageEventContent, AnyRoomEvent, AnyToDeviceEvent, SyncMessageEvent, ToDeviceEvent,
}, },
@ -534,7 +536,7 @@ impl OlmMachine {
/// * `event` - The to-device event that should be decrypted. /// * `event` - The to-device event that should be decrypted.
async fn decrypt_to_device_event( async fn decrypt_to_device_event(
&self, &self,
event: &ToDeviceEvent<EncryptedEventContent>, event: &ToDeviceEvent<EncryptedToDeviceEventContent>,
) -> OlmResult<OlmDecryptionInfo> { ) -> OlmResult<OlmDecryptionInfo> {
let mut decrypted = self.account.decrypt_to_device_event(event).await?; let mut decrypted = self.account.decrypt_to_device_event(event).await?;
// Handle the decrypted event, e.g. fetch out Megolm sessions out of // Handle the decrypted event, e.g. fetch out Megolm sessions out of
@ -1249,7 +1251,7 @@ pub(crate) mod test {
events::{ events::{
dummy::DummyToDeviceEventContent, dummy::DummyToDeviceEventContent,
room::{ room::{
encrypted::EncryptedEventContent, encrypted::EncryptedToDeviceEventContent,
message::{MessageEventContent, MessageType}, message::{MessageEventContent, MessageType},
}, },
AnyMessageEventContent, AnySyncMessageEvent, AnySyncRoomEvent, AnyToDeviceEvent, AnyMessageEventContent, AnySyncMessageEvent, AnySyncRoomEvent, AnyToDeviceEvent,
@ -1298,7 +1300,9 @@ pub(crate) mod test {
.expect("Can't parse the keys upload response") .expect("Can't parse the keys upload response")
} }
fn to_device_requests_to_content(requests: Vec<Arc<ToDeviceRequest>>) -> EncryptedEventContent { fn to_device_requests_to_content(
requests: Vec<Arc<ToDeviceRequest>>,
) -> EncryptedToDeviceEventContent {
let to_device_request = &requests[0]; let to_device_request = &requests[0];
to_device_request to_device_request

View File

@ -34,7 +34,7 @@ use ruma::{
api::client::r0::keys::{upload_keys, upload_signatures::Request as SignatureUploadRequest}, api::client::r0::keys::{upload_keys, upload_signatures::Request as SignatureUploadRequest},
encryption::{DeviceKeys, OneTimeKey, SignedKey}, encryption::{DeviceKeys, OneTimeKey, SignedKey},
events::{ events::{
room::encrypted::{EncryptedEventContent, EncryptedEventScheme}, room::encrypted::{EncryptedEventScheme, EncryptedToDeviceEventContent},
AnyToDeviceEvent, ToDeviceEvent, AnyToDeviceEvent, ToDeviceEvent,
}, },
serde::{CanonicalJsonValue, Raw}, serde::{CanonicalJsonValue, Raw},
@ -114,7 +114,7 @@ impl Deref for Account {
impl Account { impl Account {
pub async fn decrypt_to_device_event( pub async fn decrypt_to_device_event(
&self, &self,
event: &ToDeviceEvent<EncryptedEventContent>, event: &ToDeviceEvent<EncryptedToDeviceEventContent>,
) -> OlmResult<OlmDecryptionInfo> { ) -> OlmResult<OlmDecryptionInfo> {
debug!("Decrypting to-device event"); debug!("Decrypting to-device event");

View File

@ -23,7 +23,7 @@ pub use olm_rs::{
use ruma::{ use ruma::{
events::{ events::{
room::encrypted::{ room::encrypted::{
CiphertextInfo, EncryptedEventContent, EncryptedEventScheme, CiphertextInfo, EncryptedEventScheme, EncryptedToDeviceEventContent,
OlmV1Curve25519AesSha2Content, OlmV1Curve25519AesSha2Content,
}, },
AnyToDeviceEventContent, EventContent, AnyToDeviceEventContent, EventContent,
@ -110,7 +110,7 @@ impl Session {
&mut self, &mut self,
recipient_device: &ReadOnlyDevice, recipient_device: &ReadOnlyDevice,
content: AnyToDeviceEventContent, content: AnyToDeviceEventContent,
) -> OlmResult<EncryptedEventContent> { ) -> OlmResult<EncryptedToDeviceEventContent> {
let recipient_signing_key = recipient_device let recipient_signing_key = recipient_device
.get_key(DeviceKeyAlgorithm::Ed25519) .get_key(DeviceKeyAlgorithm::Ed25519)
.ok_or(EventError::MissingSigningKey)?; .ok_or(EventError::MissingSigningKey)?;
@ -140,13 +140,11 @@ impl Session {
let mut content = BTreeMap::new(); let mut content = BTreeMap::new();
content.insert((&*self.sender_key).to_owned(), ciphertext); content.insert((&*self.sender_key).to_owned(), ciphertext);
Ok(EncryptedEventContent::new( Ok(EncryptedEventScheme::OlmV1Curve25519AesSha2(OlmV1Curve25519AesSha2Content::new(
EncryptedEventScheme::OlmV1Curve25519AesSha2(OlmV1Curve25519AesSha2Content::new( content,
content, self.our_identity_keys.curve25519().to_string(),
self.our_identity_keys.curve25519().to_string(),
)),
None,
)) ))
.into())
} }
/// Check if a pre-key Olm message was encrypted for this session. /// Check if a pre-key Olm message was encrypted for this session.

View File

@ -18,6 +18,6 @@ http = "0.2.4"
lazy_static = "1.4.0" lazy_static = "1.4.0"
matrix-sdk-common = { version = "0.3.0", path = "../matrix_sdk_common" } matrix-sdk-common = { version = "0.3.0", path = "../matrix_sdk_common" }
matrix-sdk-test-macros = { version = "0.1.0", path = "../matrix_sdk_test_macros" } matrix-sdk-test-macros = { version = "0.1.0", path = "../matrix_sdk_test_macros" }
ruma = { version = "0.2.0", features = ["client-api-c"] } ruma = { version = "0.3.0", features = ["client-api-c"] }
serde = "1.0.126" serde = "1.0.126"
serde_json = "1.0.64" serde_json = "1.0.64"