fix: resolve federated identity checks for server mute/deafen pipeline

- The client now dynamically resolves the user's federated identity via `getMyUserIdForOrigin` when evaluating incoming `voice_server_muted` and `voice_server_deafened` events. Previously, the client incorrectly compared the remote event's federated `userId` against the local `authStore` home `userId`, causing federated users to silently drop restriction events.
- Client-side mic/deafen toggles (`toggleMic`, `toggleDeafen`) now accurately evaluate the user's origin-specific ID against the restriction sets, preventing federated users from bypassing locks.
- UI state selectors (`VoiceControlBar`, `ChannelSidebar`) now compute `myOriginId` to correctly render the yellow server-lockdown indicators for cross-instance users.
This commit is contained in:
Jannis Braun
2026-03-09 19:54:15 +01:00
parent 6a12fe2024
commit db1909d785
4 changed files with 97 additions and 73 deletions
+4 -2
View File
@@ -241,7 +241,8 @@ export const useVoiceStore = create<VoiceState>()(
toggleMic: () => set((state) => {
// Server-muted/deafened users cannot unmute themselves
const myId = useAuthStore.getState().user?.id;
const origin = state.currentVoiceChannelId ? getChannelOrigin(state.currentVoiceChannelId) : '';
const myId = getMyUserIdForOrigin(origin);
const spaceId = state.currentVoiceChannelId ? useSpaceStore.getState().channelToSpaceMap.get(state.currentVoiceChannelId) : null;
if (myId && spaceId && state.isMuted && (state.serverMutedUserIds.has(`${spaceId}:${myId}`) || state.serverDeafenedUserIds.has(`${spaceId}:${myId}`))) {
return {};
@@ -254,7 +255,8 @@ export const useVoiceStore = create<VoiceState>()(
}),
toggleDeafen: () => set((state) => {
// Server-deafened users cannot undeafen themselves
const myId = useAuthStore.getState().user?.id;
const origin = state.currentVoiceChannelId ? getChannelOrigin(state.currentVoiceChannelId) : '';
const myId = getMyUserIdForOrigin(origin);
const spaceId = state.currentVoiceChannelId ? useSpaceStore.getState().channelToSpaceMap.get(state.currentVoiceChannelId) : null;
if (myId && spaceId && state.isDeafened && state.serverDeafenedUserIds.has(`${spaceId}:${myId}`)) {
return {};