Skip to content

Commit 56ce5f1

Browse files
committed
Re-enable multiple victim when removing members
This is useful to batch removals occurring after an access update to a conversation.
1 parent 82147ba commit 56ce5f1

File tree

6 files changed

+26
-22
lines changed

6 files changed

+26
-22
lines changed

libs/wire-api-federation/test/Test/Wire/API/Federation/Golden/ConversationUpdate.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,5 @@ testObject_ConversationUpdate2 =
7070
cuConvId =
7171
Id (fromJust (UUID.fromString "00000000-0000-0000-0000-000100000006")),
7272
cuAlreadyPresentUsers = [chad, dee],
73-
cuAction = ConversationActionRemoveMember (qAlice)
73+
cuAction = ConversationActionRemoveMembers (pure qAlice)
7474
}

libs/wire-api/src/Wire/API/Conversation/Action.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import Wire.API.Util.Aeson (CustomEncoded (..))
3838
-- Used to send notifications to users and to remote backends.
3939
data ConversationAction
4040
= ConversationActionAddMembers (NonEmpty (Qualified UserId)) RoleName
41-
| ConversationActionRemoveMember (Qualified UserId)
41+
| ConversationActionRemoveMembers (NonEmpty (Qualified UserId))
4242
| ConversationActionRename ConversationRename
4343
| ConversationActionMessageTimerUpdate ConversationMessageTimerUpdate
4444
| ConversationActionReceiptModeUpdate ConversationReceiptModeUpdate
@@ -57,9 +57,9 @@ conversationActionToEvent ::
5757
conversationActionToEvent now quid qcnv (ConversationActionAddMembers newMembers role) =
5858
Event MemberJoin qcnv quid now $
5959
EdMembersJoin $ SimpleMembers (map (`SimpleMember` role) (toList newMembers))
60-
conversationActionToEvent now quid qcnv (ConversationActionRemoveMember removedMember) =
60+
conversationActionToEvent now quid qcnv (ConversationActionRemoveMembers removedMembers) =
6161
Event MemberLeave qcnv quid now $
62-
EdMembersLeave (QualifiedUserIdList [removedMember])
62+
EdMembersLeave (QualifiedUserIdList (toList removedMembers))
6363
conversationActionToEvent now quid qcnv (ConversationActionRename rename) =
6464
Event ConvRename qcnv quid now (EdConvRename rename)
6565
conversationActionToEvent now quid qcnv (ConversationActionMessageTimerUpdate update) =
@@ -74,8 +74,8 @@ conversationActionToEvent now quid qcnv (ConversationActionAccessUpdate update)
7474

7575
conversationActionTag :: Qualified UserId -> ConversationAction -> Action
7676
conversationActionTag _ (ConversationActionAddMembers _ _) = AddConversationMember
77-
conversationActionTag qusr (ConversationActionRemoveMember victim)
78-
| qusr == victim = LeaveConversation
77+
conversationActionTag qusr (ConversationActionRemoveMembers victims)
78+
| pure qusr == victims = LeaveConversation
7979
| otherwise = RemoveConversationMember
8080
conversationActionTag _ (ConversationActionRename _) = ModifyConversationName
8181
conversationActionTag _ (ConversationActionMessageTimerUpdate _) = ModifyConversationMessageTimer

services/galley/src/Galley/API/Federation.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ onConversationUpdated requestingDomain cu = do
133133
let localUsers = getLocalUsers localDomain toAdd
134134
Data.addLocalMembersToRemoteConv qconvId localUsers
135135
pure localUsers
136-
ConversationActionRemoveMember toRemove -> do
137-
let localUsers = getLocalUsers localDomain (pure toRemove)
136+
ConversationActionRemoveMembers toRemove -> do
137+
let localUsers = getLocalUsers localDomain toRemove
138138
Data.removeLocalMembersFromRemoteConv qconvId localUsers
139139
pure []
140140
ConversationActionRename _ -> pure []
@@ -175,7 +175,8 @@ leaveConversation requestingDomain lc = do
175175
. runMaybeT
176176
. void
177177
. API.updateLocalConversation lcnv leaver Nothing
178-
. ConversationActionRemoveMember
178+
. ConversationActionRemoveMembers
179+
. pure
179180
$ leaver
180181

181182
-- FUTUREWORK: report errors to the originating backend

services/galley/src/Galley/API/Update.hs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,8 @@ performAction ::
420420
performAction qusr conv action = case action of
421421
ConversationActionAddMembers members role ->
422422
performAddMemberAction qusr conv members role
423-
ConversationActionRemoveMember member -> do
424-
performRemoveMemberAction conv member
423+
ConversationActionRemoveMembers members -> do
424+
performRemoveMemberAction conv (toList members)
425425
pure (mempty, action)
426426
ConversationActionRename rename -> lift $ do
427427
cn <- rangeChecked (cupName rename)
@@ -650,7 +650,7 @@ performAddMemberAction qusr conv invited role = do
650650
qvictim <- qUntagged <$> qualifyLocal (lmId mem)
651651
void . runMaybeT $
652652
updateLocalConversation lcnv qvictim Nothing $
653-
ConversationActionRemoveMember qvictim
653+
ConversationActionRemoveMembers (pure qvictim)
654654
else throwErrorDescriptionType @MissingLegalholdConsent
655655

656656
checkLHPolicyConflictsRemote :: FutureWork 'LegalholdPlusFederationNotImplemented [Remote UserId] -> Galley ()
@@ -790,14 +790,16 @@ removeMemberFromRemoteConv (qUntagged -> qcnv) lusr _ victim
790790

791791
performRemoveMemberAction ::
792792
Data.Conversation ->
793-
Qualified UserId ->
793+
[Qualified UserId] ->
794794
MaybeT Galley ()
795-
performRemoveMemberAction conv victim = do
795+
performRemoveMemberAction conv victims = do
796796
loc <- qualifyLocal ()
797-
guard $ isConvMember loc conv victim
798-
let removeLocal u c = Data.removeLocalMembersFromLocalConv c (pure (tUnqualified u))
799-
removeRemote u c = Data.removeRemoteMembersFromLocalConv c (pure u)
800-
lift $ foldQualified loc removeLocal removeRemote victim (Data.convId conv)
797+
let presentVictims = filter (isConvMember loc conv) victims
798+
guard . not . null $ presentVictims
799+
800+
let (lvictims, rvictims) = partitionQualified loc presentVictims
801+
traverse_ (lift . Data.removeLocalMembersFromLocalConv (Data.convId conv)) (nonEmpty lvictims)
802+
traverse_ (lift . Data.removeRemoteMembersFromLocalConv (Data.convId conv)) (nonEmpty rvictims)
801803

802804
-- | Remove a member from a local conversation.
803805
removeMemberFromLocalConv ::
@@ -811,7 +813,8 @@ removeMemberFromLocalConv lcnv lusr con victim =
811813
fmap (maybe (Left RemoveFromConversationErrorUnchanged) Right)
812814
. runMaybeT
813815
. updateLocalConversation lcnv (qUntagged lusr) con
814-
. ConversationActionRemoveMember
816+
. ConversationActionRemoveMembers
817+
. pure
815818
$ victim
816819

817820
-- OTR

services/galley/test/integration/API/Federation.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ removeLocalUser = do
216216
FedGalley.cuConvId = conv,
217217
FedGalley.cuAlreadyPresentUsers = [alice],
218218
FedGalley.cuAction =
219-
ConversationActionRemoveMember qAlice
219+
ConversationActionRemoveMembers (pure qAlice)
220220
}
221221

222222
WS.bracketR c alice $ \ws -> do
@@ -278,7 +278,7 @@ removeRemoteUser = do
278278
FedGalley.cuConvId = conv,
279279
FedGalley.cuAlreadyPresentUsers = [alice, charlie, dee],
280280
FedGalley.cuAction =
281-
ConversationActionRemoveMember user
281+
ConversationActionRemoveMembers (pure user)
282282
}
283283

284284
WS.bracketRN c [alice, charlie, dee, flo] $ \[wsA, wsC, wsD, wsF] -> do

services/galley/test/integration/API/Util.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1423,7 +1423,7 @@ assertRemoveUpdate req qconvId remover alreadyPresentUsers victim = liftIO $ do
14231423
FederatedGalley.cuOrigUserId cu @?= remover
14241424
FederatedGalley.cuConvId cu @?= qUnqualified qconvId
14251425
sort (FederatedGalley.cuAlreadyPresentUsers cu) @?= sort alreadyPresentUsers
1426-
FederatedGalley.cuAction cu @?= ConversationActionRemoveMember victim
1426+
FederatedGalley.cuAction cu @?= ConversationActionRemoveMembers (pure victim)
14271427

14281428
-------------------------------------------------------------------------------
14291429
-- Helpers

0 commit comments

Comments
 (0)