From 78d7c56e6faa384e46d78dec6668237860955660 Mon Sep 17 00:00:00 2001 From: ember33 Date: Wed, 18 Mar 2026 12:51:19 +0100 Subject: [PATCH] fix(spaces): allow PL omission when users_default matches, handle semaphore errors - PL omission check now allows omitting a space-managed user if the proposed users_default equals their space-granted PL - Semaphore acquire errors cause early return instead of silent proceed Co-Authored-By: Claude Opus 4.6 (1M context) --- src/service/rooms/roles/mod.rs | 12 +++++++++--- src/service/rooms/timeline/build.rs | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/service/rooms/roles/mod.rs b/src/service/rooms/roles/mod.rs index 41437fc4..bb973ba8 100644 --- a/src/service/rooms/roles/mod.rs +++ b/src/service/rooms/roles/mod.rs @@ -719,7 +719,9 @@ impl Service { pending.insert(space_id.clone()) }; - let _permit = this.enforcement_semaphore.acquire().await; + let Ok(_permit) = this.enforcement_semaphore.acquire().await else { + return; + }; // Always repopulate cache first this.populate_space(&space_id).await; @@ -829,7 +831,9 @@ impl Service { let this = Arc::clone(self); self.server.runtime().spawn(async move { - let _permit = this.enforcement_semaphore.acquire().await; + let Ok(_permit) = this.enforcement_semaphore.acquire().await else { + return; + }; // Read the actual m.space.child state event to check via let child_event_type = StateEventType::SpaceChild; @@ -984,7 +988,9 @@ impl Service { let this = Arc::clone(self); self.server.runtime().spawn(async move { - let _permit = this.enforcement_semaphore.acquire().await; + let Ok(_permit) = this.enforcement_semaphore.acquire().await else { + return; + }; if let Err(e) = this.auto_join_qualifying_rooms(&space_id, &user_id).await { debug_warn!(user_id = %user_id, error = ?e, "Auto-join on Space join failed"); diff --git a/src/service/rooms/timeline/build.rs b/src/service/rooms/timeline/build.rs index c9133032..95781371 100644 --- a/src/service/rooms/timeline/build.rs +++ b/src/service/rooms/timeline/build.rs @@ -166,7 +166,7 @@ pub async fn build_and_append_pdu( .max(); if let Some(space_pl) = space_pl { match proposed.users.get(user_id) { - | None => { + | None if i64::from(proposed.users_default) != space_pl => { debug_warn!( user_id = %user_id, room_id = %room_id,