31 lines
2.3 KiB
Diff
31 lines
2.3 KiB
Diff
# UNDF: UNDF-2026-000000283
|
|
--- a/src/Simplex/Chat/Library/Commands.hs
|
|
+++ b/src/Simplex/Chat/Library/Commands.hs
|
|
@@ -2310,8 +2310,9 @@ processChatCommand vr nm = \case
|
|
APIMembersRole groupId memberIds newRole -> withUser $ \user ->
|
|
withGroupLock "memberRole" groupId $ do
|
|
g@(Group gInfo members) <- withFastStore $ \db -> getGroup db vr user groupId
|
|
- when (selfSelected gInfo) $ throwCmdError "can't change role for self"
|
|
- let (invitedMems, currentMems, unchangedMems, maxRole, anyAdmin, anyPending) = selectMembers members
|
|
+ let gmIdSet = S.fromList (L.toList memberIds)
|
|
+ when (selfSelected gmIdSet gInfo) $ throwCmdError "can't change role for self"
|
|
+ let (invitedMems, currentMems, unchangedMems, maxRole, anyAdmin, anyPending) = selectMembers gmIdSet members
|
|
when (length invitedMems + length currentMems + length unchangedMems /= length memberIds) $ throwChatError CEGroupMemberNotFound
|
|
when (length memberIds > 1 && (anyAdmin || newRole >= GRAdmin)) $
|
|
throwCmdError "can't change role of multiple members when admins selected, or new role is admin"
|
|
@@ -2326,12 +2327,12 @@ processChatCommand vr nm = \case
|
|
pure $ CRMembersRoleUser {user, groupInfo = gInfo, members = changed1 <> changed2, toRole = newRole} -- same order is not guaranteed
|
|
where
|
|
- selfSelected GroupInfo {membership} = elem (groupMemberId' membership) memberIds
|
|
- selectMembers :: [GroupMember] -> ([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], [GroupMember], GroupMemberRole, Bool, Bool)
|
|
+ selectMembers gmIdSet = foldr' addMember ([], [], [], GRObserver, False, False)
|
|
where
|
|
addMember m@GroupMember {groupMemberId, memberStatus, memberRole} (invited, current, unchanged, maxRole, anyAdmin, anyPending)
|
|
- | groupMemberId `elem` memberIds =
|
|
+ | groupMemberId `S.member` gmIdSet =
|
|
let maxRole' = max maxRole memberRole
|
|
anyAdmin' = anyAdmin || memberRole >= GRAdmin
|
|
anyPending' = anyPending || memberPending m
|