Skip to content

Commit 21bb85a

Browse files
authored
feat(Room): Check if the user is allowed to do a room mention before trying to send a call notify event. (#4271)
1 parent f1a442b commit 21bb85a

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2975,6 +2975,10 @@ impl Room {
29752975
return Ok(());
29762976
}
29772977

2978+
if !self.can_user_trigger_room_notification(self.own_user_id()).await? {
2979+
return Ok(());
2980+
}
2981+
29782982
self.send_call_notification(
29792983
self.room_id().to_string().to_owned(),
29802984
ApplicationType::Call,

crates/matrix-sdk/tests/integration/room/joined.rs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use matrix_sdk_test::{
1414
async_test,
1515
mocks::{mock_encryption_state, mock_redaction},
1616
test_json::{self, sync::CUSTOM_ROOM_POWER_LEVELS},
17-
EphemeralTestEvent, GlobalAccountDataTestEvent, JoinedRoomBuilder, SyncResponseBuilder,
18-
DEFAULT_TEST_ROOM_ID,
17+
EphemeralTestEvent, GlobalAccountDataTestEvent, JoinedRoomBuilder, StateTestEvent,
18+
SyncResponseBuilder, DEFAULT_TEST_ROOM_ID,
1919
};
2020
use ruma::{
2121
api::client::{membership::Invite3pidInit, receipt::create_receipt::v3::ReceiptType},
@@ -635,7 +635,8 @@ async fn test_call_notifications_ring_for_dms() {
635635
let (client, server) = logged_in_client_with_server().await;
636636

637637
let mut sync_builder = SyncResponseBuilder::new();
638-
sync_builder.add_joined_room(JoinedRoomBuilder::default());
638+
let room_builder = JoinedRoomBuilder::default().add_state_event(StateTestEvent::PowerLevels);
639+
sync_builder.add_joined_room(room_builder);
639640
sync_builder.add_global_account_data_event(GlobalAccountDataTestEvent::Direct);
640641

641642
mock_sync(&server, sync_builder.build_json_sync_response(), None).await;
@@ -678,9 +679,10 @@ async fn test_call_notifications_notify_for_rooms() {
678679
let (client, server) = logged_in_client_with_server().await;
679680

680681
let mut sync_builder = SyncResponseBuilder::new();
681-
sync_builder.add_joined_room(JoinedRoomBuilder::default());
682-
682+
let room_builder = JoinedRoomBuilder::default().add_state_event(StateTestEvent::PowerLevels);
683+
sync_builder.add_joined_room(room_builder);
683684
mock_sync(&server, sync_builder.build_json_sync_response(), None).await;
685+
684686
mock_encryption_state(&server, false).await;
685687

686688
let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000));
@@ -715,6 +717,41 @@ async fn test_call_notifications_notify_for_rooms() {
715717
room.send_call_notification_if_needed().await.unwrap();
716718
}
717719

720+
#[async_test]
721+
async fn test_call_notifications_dont_notify_room_without_mention_powerlevel() {
722+
let (client, server) = logged_in_client_with_server().await;
723+
724+
let mut sync_builder = SyncResponseBuilder::new();
725+
let mut power_level_event = StateTestEvent::PowerLevels.into_json_value();
726+
// Allow noone to send room notify events.
727+
*power_level_event.get_mut("content").unwrap().get_mut("notifications").unwrap() =
728+
json!({"room": 101});
729+
730+
sync_builder.add_joined_room(
731+
JoinedRoomBuilder::default().add_state_event(StateTestEvent::Custom(power_level_event)),
732+
);
733+
734+
mock_sync(&server, sync_builder.build_json_sync_response(), None).await;
735+
mock_encryption_state(&server, false).await;
736+
737+
let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000));
738+
let _response = client.sync_once(sync_settings).await.unwrap();
739+
740+
let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap();
741+
assert!(!room.is_direct().await.unwrap());
742+
assert!(!room.has_active_room_call());
743+
744+
Mock::given(method("PUT"))
745+
.and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*"))
746+
.respond_with(ResponseTemplate::new(200).set_body_json(json!({"event_id": "$event_id"})))
747+
// Expect no calls of the send because we dont have permission to notify.
748+
.expect(0)
749+
.mount(&server)
750+
.await;
751+
752+
room.send_call_notification_if_needed().await.unwrap();
753+
}
754+
718755
#[async_test]
719756
async fn test_make_reply_event_doesnt_require_event_cache() {
720757
// Even if we don't have enabled the event cache, we'll resort to using the

testing/matrix-sdk-test/src/test_json/sync_events.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,9 @@ pub static POWER_LEVELS: Lazy<JsonValue> = Lazy::new(|| {
350350
"kick": 50,
351351
"redact": 50,
352352
"state_default": 50,
353+
"notifications": {
354+
"room": 0
355+
},
353356
"users": {
354357
"@example:localhost": 100,
355358
"@bob:localhost": 0

0 commit comments

Comments
 (0)