# UNDF: UNDF-2026-000000284 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2378,8 +2378,9 @@ processChatCommand vr nm = \case APIBlockMembersForAll groupId memberIds blockFlag -> withUser $ \user -> withGroupLock "blockForAll" groupId $ do Group gInfo members <- withFastStore $ \db -> getGroup db vr user groupId - when (selfSelected gInfo) $ throwCmdError "can't block/unblock self" - let (blockMems, remainingMems, maxRole, anyAdmin, anyPending) = selectMembers members + let gmIdSet = S.fromList (L.toList memberIds) + when (selfSelected gmIdSet gInfo) $ throwCmdError "can't block/unblock self" + let (blockMems, remainingMems, maxRole, anyAdmin, anyPending) = selectMembers gmIdSet members when (length blockMems /= length memberIds) $ throwChatError CEGroupMemberNotFound when (length memberIds > 1 && anyAdmin) $ throwCmdError "can't block/unblock multiple members when admins selected" when anyPending $ throwCmdError "can't block/unblock members pending approval" @@ -2388,11 +2389,11 @@ processChatCommand vr nm = \case blockMembers user gInfo blockMems remainingMems where - selfSelected GroupInfo {membership} = elem (groupMemberId' membership) memberIds - selectMembers :: [GroupMember] -> ([GroupMember], [GroupMember], GroupMemberRole, Bool, Bool) - selectMembers = foldr' addMember ([], [], GRObserver, False, False) + selfSelected gmIdSet GroupInfo {membership} = S.member (groupMemberId' membership) gmIdSet + selectMembers :: S.Set GroupMemberId -> [GroupMember] -> ([GroupMember], [GroupMember], GroupMemberRole, Bool, Bool) + selectMembers gmIdSet = foldr' addMember ([], [], GRObserver, False, False) where addMember m@GroupMember {groupMemberId, memberRole} (block, remaining, maxRole, anyAdmin, anyPending) - | groupMemberId `elem` memberIds = + | groupMemberId `S.member` gmIdSet = let maxRole' = max maxRole memberRole anyAdmin' = anyAdmin || memberRole >= GRAdmin anyPending' = anyPending || memberPending m