Skip to content

Commit bdff7aa

Browse files
committed
Accept any string as a key for m.direct account data
1 parent 9002f82 commit bdff7aa

File tree

14 files changed

+104
-58
lines changed

14 files changed

+104
-58
lines changed

Cargo.lock

Lines changed: 14 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ proptest = { version = "1.5.0", default-features = false, features = ["std"] }
5656
rand = "0.8.5"
5757
reqwest = { version = "0.12.4", default-features = false }
5858
rmp-serde = "1.3.0"
59-
ruma = { version = "0.11.1", features = [
59+
ruma = { git = "https://github.com/ruma/ruma.git", rev = "35fda7f2f7811156df2e60b223dbf136fc143bc8", features = [
6060
"client-api-c",
6161
"compat-upload-signatures",
6262
"compat-user-id",
@@ -70,7 +70,7 @@ ruma = { version = "0.11.1", features = [
7070
"unstable-msc4075",
7171
"unstable-msc4140",
7272
] }
73-
ruma-common = "0.14.1"
73+
ruma-common = { git = "https://github.com/ruma/ruma.git", rev = "35fda7f2f7811156df2e60b223dbf136fc143bc8" }
7474
serde = "1.0.151"
7575
serde_html_form = "0.2.0"
7676
serde_json = "1.0.91"

crates/matrix-sdk-base/src/response_processors.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ use std::{
1818
};
1919

2020
use ruma::{
21-
events::{AnyGlobalAccountDataEvent, GlobalAccountDataEventType},
21+
events::{
22+
direct::OwnedDirectUserIdentifier, AnyGlobalAccountDataEvent, GlobalAccountDataEventType,
23+
},
2224
serde::Raw,
23-
OwnedUserId, RoomId,
25+
RoomId,
2426
};
2527
use tracing::{debug, instrument, trace, warn};
2628

@@ -94,10 +96,10 @@ impl AccountDataProcessor {
9496
for event in events {
9597
let AnyGlobalAccountDataEvent::Direct(direct_event) = event else { continue };
9698

97-
let mut new_dms = HashMap::<&RoomId, HashSet<OwnedUserId>>::new();
98-
for (user_id, rooms) in direct_event.content.iter() {
99+
let mut new_dms = HashMap::<&RoomId, HashSet<OwnedDirectUserIdentifier>>::new();
100+
for (user_identifier, rooms) in direct_event.content.iter() {
99101
for room_id in rooms {
100-
new_dms.entry(room_id).or_default().insert(user_id.clone());
102+
new_dms.entry(room_id).or_default().insert(user_identifier.clone());
101103
}
102104
}
103105

crates/matrix-sdk-base/src/rooms/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use ruma::{
2222
events::{
2323
beacon_info::BeaconInfoEventContent,
2424
call::member::{CallMemberEventContent, CallMemberStateKey},
25+
direct::OwnedDirectUserIdentifier,
2526
macros::EventContent,
2627
room::{
2728
avatar::RoomAvatarEventContent,
@@ -128,7 +129,7 @@ pub struct BaseRoomInfo {
128129
pub(crate) create: Option<MinimalStateEvent<RoomCreateWithCreatorEventContent>>,
129130
/// A list of user ids this room is considered as direct message, if this
130131
/// room is a DM.
131-
pub(crate) dm_targets: HashSet<OwnedUserId>,
132+
pub(crate) dm_targets: HashSet<OwnedDirectUserIdentifier>,
132133
/// The `m.room.encryption` event content that enabled E2EE in this room.
133134
pub(crate) encryption: Option<RoomEncryptionEventContent>,
134135
/// The guest access policy of this room.

crates/matrix-sdk-base/src/rooms/normal.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use ruma::{
3333
api::client::sync::sync_events::v3::RoomSummary as RumaSummary,
3434
events::{
3535
call::member::{CallMemberStateKey, MembershipData},
36+
direct::OwnedDirectUserIdentifier,
3637
ignored_user_list::IgnoredUserListEventContent,
3738
receipt::{Receipt, ReceiptThread, ReceiptType},
3839
room::{
@@ -460,7 +461,7 @@ impl Room {
460461
/// only be considered as guidance. We leave members in this list to allow
461462
/// us to re-find a DM with a user even if they have left, since we may
462463
/// want to re-invite them.
463-
pub fn direct_targets(&self) -> HashSet<OwnedUserId> {
464+
pub fn direct_targets(&self) -> HashSet<OwnedDirectUserIdentifier> {
464465
self.inner.read().base_info.dm_targets.clone()
465466
}
466467

crates/matrix-sdk-base/src/sliding_sync/mod.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ mod tests {
911911
api::client::sync::sync_events::UnreadNotificationsCount,
912912
assign, event_id,
913913
events::{
914-
direct::DirectEventContent,
914+
direct::{DirectEventContent, DirectUserIdentifier, OwnedDirectUserIdentifier},
915915
room::{
916916
avatar::RoomAvatarEventContent,
917917
canonical_alias::RoomCanonicalAliasEventContent,
@@ -1337,7 +1337,7 @@ mod tests {
13371337
create_dm(&client, room_id, user_a_id, user_b_id, MembershipState::Join).await;
13381338

13391339
// (Sanity: B is a direct target, and is in Join state)
1340-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1340+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
13411341
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Join);
13421342

13431343
// When B leaves
@@ -1346,7 +1346,7 @@ mod tests {
13461346
// Then B is still a direct target, and is in Leave state (B is a direct target
13471347
// because we want to return to our old DM in the UI even if the other
13481348
// user left, so we can reinvite them. See https://github.com/matrix-org/matrix-rust-sdk/issues/2017)
1349-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1349+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
13501350
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Leave);
13511351
}
13521352

@@ -1362,7 +1362,7 @@ mod tests {
13621362
create_dm(&client, room_id, user_a_id, user_b_id, MembershipState::Invite).await;
13631363

13641364
// (Sanity: B is a direct target, and is in Invite state)
1365-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1365+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
13661366
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Invite);
13671367

13681368
// When B declines the invitation (i.e. leaves)
@@ -1371,7 +1371,7 @@ mod tests {
13711371
// Then B is still a direct target, and is in Leave state (B is a direct target
13721372
// because we want to return to our old DM in the UI even if the other
13731373
// user left, so we can reinvite them. See https://github.com/matrix-org/matrix-rust-sdk/issues/2017)
1374-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1374+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
13751375
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Leave);
13761376
}
13771377

@@ -1389,7 +1389,7 @@ mod tests {
13891389
assert_eq!(membership(&client, room_id, user_a_id).await, MembershipState::Join);
13901390

13911391
// (Sanity: B is a direct target, and is in Join state)
1392-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1392+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
13931393
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Join);
13941394

13951395
let room = client.get_room(room_id).unwrap();
@@ -1413,7 +1413,7 @@ mod tests {
14131413
assert_eq!(membership(&client, room_id, user_a_id).await, MembershipState::Join);
14141414

14151415
// (Sanity: B is a direct target, and is in Join state)
1416-
assert!(direct_targets(&client, room_id).contains(user_b_id));
1416+
assert!(direct_targets(&client, room_id).contains(<&DirectUserIdentifier>::from(user_b_id)));
14171417
assert_eq!(membership(&client, room_id, user_b_id).await, MembershipState::Invite);
14181418

14191419
let room = client.get_room(room_id).unwrap();
@@ -2558,9 +2558,10 @@ mod tests {
25582558
let mut room_response = http::response::Room::new();
25592559
set_room_joined(&mut room_response, user_a_id);
25602560
let mut response = response_with_room(room_id_1, room_response);
2561-
let mut direct_content = BTreeMap::new();
2562-
direct_content.insert(user_a_id.to_owned(), vec![room_id_1.to_owned()]);
2563-
direct_content.insert(user_b_id.to_owned(), vec![room_id_2.to_owned()]);
2561+
let mut direct_content: BTreeMap<OwnedDirectUserIdentifier, Vec<OwnedRoomId>> =
2562+
BTreeMap::new();
2563+
direct_content.insert(user_a_id.into(), vec![room_id_1.to_owned()]);
2564+
direct_content.insert(user_b_id.into(), vec![room_id_2.to_owned()]);
25642565
response
25652566
.extensions
25662567
.account_data
@@ -2671,7 +2672,7 @@ mod tests {
26712672
member.membership().clone()
26722673
}
26732674

2674-
fn direct_targets(client: &BaseClient, room_id: &RoomId) -> HashSet<OwnedUserId> {
2675+
fn direct_targets(client: &BaseClient, room_id: &RoomId) -> HashSet<OwnedDirectUserIdentifier> {
26752676
let room = client.get_room(room_id).expect("Room not found!");
26762677
room.direct_targets()
26772678
}
@@ -2730,8 +2731,9 @@ mod tests {
27302731
user_id: OwnedUserId,
27312732
room_ids: Vec<OwnedRoomId>,
27322733
) {
2733-
let mut direct_content = BTreeMap::new();
2734-
direct_content.insert(user_id, room_ids);
2734+
let mut direct_content: BTreeMap<OwnedDirectUserIdentifier, Vec<OwnedRoomId>> =
2735+
BTreeMap::new();
2736+
direct_content.insert(user_id.into(), room_ids);
27352737
response
27362738
.extensions
27372739
.account_data

crates/matrix-sdk-base/src/store/migration_helpers.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use std::{
2323
use matrix_sdk_common::deserialized_responses::SyncTimelineEvent;
2424
use ruma::{
2525
events::{
26+
direct::OwnedDirectUserIdentifier,
2627
room::{
2728
avatar::RoomAvatarEventContent,
2829
canonical_alias::RoomCanonicalAliasEventContent,
@@ -37,7 +38,7 @@ use ruma::{
3738
},
3839
EmptyStateKey, EventContent, RedactContent, StateEventContent, StateEventType,
3940
},
40-
OwnedRoomId, OwnedUserId, RoomId,
41+
OwnedRoomId, RoomId,
4142
};
4243
use serde::{Deserialize, Serialize};
4344

@@ -155,7 +156,7 @@ fn encryption_state_default() -> bool {
155156
struct BaseRoomInfoV1 {
156157
avatar: Option<MinimalStateEvent<RoomAvatarEventContent>>,
157158
canonical_alias: Option<MinimalStateEvent<RoomCanonicalAliasEventContent>>,
158-
dm_targets: HashSet<OwnedUserId>,
159+
dm_targets: HashSet<OwnedDirectUserIdentifier>,
159160
encryption: Option<RoomEncryptionEventContent>,
160161
guest_access: Option<MinimalStateEvent<RoomGuestAccessEventContent>>,
161162
history_visibility: Option<MinimalStateEvent<RoomHistoryVisibilityEventContent>>,

crates/matrix-sdk/src/account.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ impl Account {
861861
};
862862

863863
for user_id in user_ids {
864-
content.entry(user_id.to_owned()).or_default().push(room_id.to_owned());
864+
content.entry(user_id.into()).or_default().push(room_id.to_owned());
865865
}
866866

867867
// TODO: We should probably save the fact that we need to send this out

crates/matrix-sdk/src/encryption/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ use ruma::{
5050
uiaa::{AuthData, UiaaInfo},
5151
},
5252
assign,
53-
events::room::{MediaSource, ThumbnailInfo},
53+
events::{
54+
direct::DirectUserIdentifier,
55+
room::{MediaSource, ThumbnailInfo},
56+
},
5457
DeviceId, OwnedDeviceId, OwnedUserId, TransactionId, UserId,
5558
};
5659
use serde::Deserialize;
@@ -605,7 +608,7 @@ impl Client {
605608
// Find the room we share with the `user_id` and only with `user_id`
606609
let room = rooms.into_iter().find(|r| {
607610
let targets = r.direct_targets();
608-
targets.len() == 1 && targets.contains(user_id)
611+
targets.len() == 1 && targets.contains(<&DirectUserIdentifier>::from(user_id))
609612
});
610613

611614
trace!(?room, "Found room");

crates/matrix-sdk/src/room/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1224,7 +1224,7 @@ impl Room {
12241224
room_members.retain(|member| member.user_id() != self.own_user_id());
12251225

12261226
for member in room_members {
1227-
let entry = content.entry(member.user_id().to_owned()).or_default();
1227+
let entry = content.entry(member.user_id().into()).or_default();
12281228
if !entry.iter().any(|room_id| room_id == this_room_id) {
12291229
entry.push(this_room_id.to_owned());
12301230
}

crates/matrix-sdk/tests/integration/client.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ use ruma::{
3535
assign, device_id,
3636
directory::Filter,
3737
event_id,
38-
events::{direct::DirectEventContent, AnyInitialStateEvent},
38+
events::{
39+
direct::{DirectEventContent, DirectUserIdentifier},
40+
AnyInitialStateEvent,
41+
},
3942
room_id,
4043
serde::Raw,
4144
user_id, OwnedUserId,
@@ -496,7 +499,9 @@ async fn test_marking_room_as_dm() {
496499
"The body of the PUT /account_data request should be a valid DirectEventContent",
497500
);
498501

499-
let bob_entry = content.get(bob).expect("We should have bob in the direct event content");
502+
let bob_entry = content
503+
.get(<&DirectUserIdentifier>::from(bob))
504+
.expect("We should have bob in the direct event content");
500505

501506
assert_eq!(content.len(), 2, "We should have entries for bob and foo");
502507
assert_eq!(bob_entry.len(), 3, "Bob should have 3 direct rooms");

0 commit comments

Comments
 (0)