diff --git a/conduwuit-example.toml b/conduwuit-example.toml index 82b78fde..66082a1a 100644 --- a/conduwuit-example.toml +++ b/conduwuit-example.toml @@ -470,6 +470,12 @@ # #suspend_on_register = false +# Enable space permission cascading (power levels and role-based access). +# When enabled, power levels cascade from Spaces to child rooms and rooms +# can require roles for access. Applies to all Spaces on this server. +# +#space_permission_cascading = false + # Enabling this setting opens registration to anyone without restrictions. # This makes your server vulnerable to abuse # diff --git a/src/service/rooms/roles/cache_tests.rs b/src/service/rooms/roles/cache_tests.rs index 2ff2592e..a37c302f 100644 --- a/src/service/rooms/roles/cache_tests.rs +++ b/src/service/rooms/roles/cache_tests.rs @@ -4,7 +4,6 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use conduwuit_core::matrix::space_roles::RoleDefinition; use ruma::{room_id, user_id, OwnedRoomId, OwnedUserId}; -use std::collections::HashSet as StdHashSet; use super::tests::{make_requirements, make_roles, make_user_roles}; @@ -13,7 +12,7 @@ struct MockCache { roles: HashMap>, user_roles: HashMap>>, room_requirements: HashMap>>, - room_to_space: HashMap>, + room_to_space: HashMap>, } impl MockCache { diff --git a/src/service/rooms/timeline/build.rs b/src/service/rooms/timeline/build.rs index 63e0f974..cfe18df6 100644 --- a/src/service/rooms/timeline/build.rs +++ b/src/service/rooms/timeline/build.rs @@ -1,4 +1,9 @@ -use std::{collections::HashSet, iter::once}; +use std::{ + collections::{BTreeMap, HashSet}, + iter::once, +}; + +use conduwuit_core::matrix::space_roles::RoleDefinition; use conduwuit::trace; use conduwuit_core::{ @@ -120,12 +125,14 @@ pub async fn build_and_append_pdu( } } } - - } + } // Also check that space-managed users aren't omitted // Clone data out of guards to avoid holding locks across await - let space_data: Vec<(ruma::OwnedRoomId, Vec<(OwnedUserId, HashSet)>, std::collections::BTreeMap)> = { + type SpaceEnforcementData = + (ruma::OwnedRoomId, Vec<(OwnedUserId, HashSet)>, BTreeMap); + + let space_data: Vec = { let user_roles_guard = self.services.roles.user_roles.read().await; let roles_guard = self.services.roles.roles.read().await; parent_spaces.iter().filter_map(|ps| {