Skip to content

Commit c0cc85e

Browse files
mdimjasevicpcapriottismatting
authored
[WPB-2565] Do not send member updates to all (#3703)
* Do not send member updates to all (#3431) --------- Co-authored-by: Paolo Capriotti <paolo@capriotti.io> Co-authored-by: Stefan Matting <stefan@wire.com>
1 parent aa7c912 commit c0cc85e

File tree

5 files changed

+44
-221
lines changed

5 files changed

+44
-221
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Events for a member update, join and leave are not sent to everyone in the team any longer. Only team admins get them.

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import Galley.Effects.GundeckAccess
6161
import Galley.Effects.LegalHoldStore as LegalHoldStore
6262
import Galley.Effects.MemberStore qualified as E
6363
import Galley.Effects.TeamStore
64+
import Galley.Effects.TeamStore qualified as E
6465
import Galley.Intra.Push qualified as Intra
6566
import Galley.Monad
6667
import Galley.Options hiding (brig)
@@ -361,8 +362,8 @@ rmUser lusr conn = do
361362
goConvPages range newCids
362363

363364
leaveTeams page = for_ (pageItems page) $ \tid -> do
364-
mems <- getTeamMembersForFanout tid
365-
uncheckedDeleteTeamMember lusr conn tid (tUnqualified lusr) mems
365+
admins <- E.getTeamAdmins tid
366+
uncheckedDeleteTeamMember lusr conn tid (tUnqualified lusr) admins
366367
page' <- listTeams @p2 (tUnqualified lusr) (Just (pageState page)) maxBound
367368
leaveTeams page'
368369

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

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,10 @@ updateTeamH zusr zcon tid updateData = do
332332
void $ permissionCheckS SSetTeamData zusrMembership
333333
E.setTeamData tid updateData
334334
now <- input
335-
memList <- getTeamMembersForFanout tid
335+
admins <- E.getTeamAdmins tid
336336
let e = newEvent tid now (EdTeamUpdate updateData)
337-
let r = list1 (userRecipient zusr) (membersToRecipients (Just zusr) (memList ^. teamMembers))
338-
E.push1 $ newPushLocal1 (memList ^. teamMemberListType) zusr (TeamEvent e) r & pushConn ?~ zcon
337+
let r = list1 (userRecipient zusr) (map userRecipient (filter (/= zusr) admins))
338+
E.push1 $ newPushLocal1 ListComplete zusr (TeamEvent e) r & pushConn ?~ zcon & pushTransient .~ True
339339

340340
deleteTeam ::
341341
forall r.
@@ -737,8 +737,7 @@ addTeamMember lzusr zcon tid nmem = do
737737
ensureConnectedToLocals zusr [uid]
738738
(TeamSize sizeBeforeJoin) <- E.getSize tid
739739
ensureNotTooLargeForLegalHold tid (fromIntegral sizeBeforeJoin + 1)
740-
memList <- getTeamMembersForFanout tid
741-
void $ addTeamMemberInternal tid (Just zusr) (Just zcon) nmem memList
740+
void $ addTeamMemberInternal tid (Just zusr) (Just zcon) nmem
742741

743742
-- This function is "unchecked" because there is no need to check for user binding (invite only).
744743
uncheckedAddTeamMember ::
@@ -760,12 +759,11 @@ uncheckedAddTeamMember ::
760759
NewTeamMember ->
761760
Sem r ()
762761
uncheckedAddTeamMember tid nmem = do
763-
mems <- getTeamMembersForFanout tid
764762
(TeamSize sizeBeforeJoin) <- E.getSize tid
765763
ensureNotTooLargeForLegalHold tid (fromIntegral sizeBeforeJoin + 1)
766-
(TeamSize sizeBeforeAdd) <- addTeamMemberInternal tid Nothing Nothing nmem mems
767-
billingUserIds <- E.getBillingTeamMembers tid
768-
Journal.teamUpdate tid (sizeBeforeAdd + 1) billingUserIds
764+
(TeamSize sizeBeforeAdd) <- addTeamMemberInternal tid Nothing Nothing nmem
765+
owners <- E.getBillingTeamMembers tid
766+
Journal.teamUpdate tid (sizeBeforeAdd + 1) owners
769767

770768
uncheckedUpdateTeamMember ::
771769
forall r.
@@ -804,30 +802,15 @@ uncheckedUpdateTeamMember mlzusr mZcon tid newMember = do
804802
-- update target in Cassandra
805803
E.setTeamMemberPermissions (previousMember ^. permissions) tid targetId targetPermissions
806804

807-
updatedMembers <- getTeamMembersForFanout tid
808-
updateJournal team
809-
updatePeers mZusr targetId targetMember targetPermissions updatedMembers
810-
where
811-
updateJournal :: Team -> Sem r ()
812-
updateJournal team = do
813-
when (team ^. teamBinding == Binding) $ do
814-
(TeamSize size) <- E.getSize tid
815-
owners <- E.getBillingTeamMembers tid
816-
Journal.teamUpdate tid size owners
817-
818-
updatePeers :: Maybe UserId -> UserId -> TeamMember -> Permissions -> TeamMemberList -> Sem r ()
819-
updatePeers zusr targetId targetMember targetPermissions updatedMembers = do
820-
-- inform members of the team about the change
821-
-- some (privileged) users will be informed about which change was applied
822-
let privileged = filter (`canSeePermsOf` targetMember) (updatedMembers ^. teamMembers)
823-
mkUpdate = EdMemberUpdate targetId
824-
privilegedUpdate = mkUpdate $ Just targetPermissions
825-
privilegedRecipients = membersToRecipients Nothing privileged
826-
now <- input
827-
let ePriv = newEvent tid now privilegedUpdate
828-
-- push to all members (user is privileged)
829-
let pushPriv = newPush (updatedMembers ^. teamMemberListType) zusr (TeamEvent ePriv) $ privilegedRecipients
830-
for_ pushPriv (\p -> E.push1 (p & pushConn .~ mZcon))
805+
when (team ^. teamBinding == Binding) $ do
806+
(TeamSize size) <- E.getSize tid
807+
owners <- E.getBillingTeamMembers tid
808+
Journal.teamUpdate tid size owners
809+
810+
now <- input
811+
let event = newEvent tid now (EdMemberUpdate targetId (Just targetPermissions))
812+
let pushPriv = newPush ListComplete mZusr (TeamEvent event) (map userRecipient admins')
813+
for_ pushPriv (\p -> E.push1 (p & pushConn .~ mZcon & pushTransient .~ True))
831814

832815
updateTeamMember ::
833816
forall r.
@@ -967,7 +950,6 @@ deleteTeamMember' lusr zcon tid remove mBody = do
967950
tm <- noteS @'TeamMemberNotFound targetMember
968951
unless (canDeleteMember dm tm) $ throwS @'AccessDenied
969952
team <- fmap tdTeam $ E.getTeam tid >>= noteS @'TeamNotFound
970-
mems <- getTeamMembersForFanout tid
971953
if team ^. teamBinding == Binding && isJust targetMember
972954
then do
973955
body <- mBody & note (InvalidPayload "missing request body")
@@ -985,7 +967,8 @@ deleteTeamMember' lusr zcon tid remove mBody = do
985967
Journal.teamUpdate tid sizeAfterDelete $ filter (/= remove) owners
986968
pure TeamMemberDeleteAccepted
987969
else do
988-
uncheckedDeleteTeamMember lusr (Just zcon) tid remove mems
970+
admins <- E.getTeamAdmins tid
971+
uncheckedDeleteTeamMember lusr (Just zcon) tid remove admins
989972
pure TeamMemberDeleteCompleted
990973

991974
-- This function is "unchecked" because it does not validate that the user has the `RemoveTeamMember` permission.
@@ -1002,47 +985,43 @@ uncheckedDeleteTeamMember ::
1002985
Maybe ConnId ->
1003986
TeamId ->
1004987
UserId ->
1005-
TeamMemberList ->
988+
[UserId] ->
1006989
Sem r ()
1007-
uncheckedDeleteTeamMember lusr zcon tid remove mems = do
990+
uncheckedDeleteTeamMember lusr zcon tid remove admins = do
1008991
now <- input
1009992
pushMemberLeaveEvent now
1010993
E.deleteTeamMember tid remove
1011994
removeFromConvsAndPushConvLeaveEvent now
1012995
where
1013-
-- notify all team members.
996+
-- notify team admins
1014997
pushMemberLeaveEvent :: UTCTime -> Sem r ()
1015998
pushMemberLeaveEvent now = do
1016999
let e = newEvent tid now (EdMemberLeave remove)
10171000
let r =
1018-
list1
1019-
(userRecipient (tUnqualified lusr))
1020-
(membersToRecipients (Just (tUnqualified lusr)) (mems ^. teamMembers))
1001+
userRecipient
1002+
<$> list1
1003+
(tUnqualified lusr)
1004+
(filter (/= (tUnqualified lusr)) admins)
10211005
E.push1 $
1022-
newPushLocal1 (mems ^. teamMemberListType) (tUnqualified lusr) (TeamEvent e) r & pushConn .~ zcon
1006+
newPushLocal1 ListComplete (tUnqualified lusr) (TeamEvent e) r & pushConn .~ zcon & pushTransient .~ True
10231007
-- notify all conversation members not in this team.
10241008
removeFromConvsAndPushConvLeaveEvent :: UTCTime -> Sem r ()
10251009
removeFromConvsAndPushConvLeaveEvent now = do
1026-
-- This may not make sense if that list has been truncated. In such cases, we still want to
1027-
-- remove the user from conversations but never send out any events. We assume that clients
1028-
-- handle nicely these missing events, regardless of whether they are in the same team or not
1029-
let tmids = Set.fromList $ map (view userId) (mems ^. teamMembers)
1010+
let tmids = Set.fromList admins
10301011
let edata = Conv.EdMembersLeave Conv.EdReasonDeleted (Conv.QualifiedUserIdList [tUntagged (qualifyAs lusr remove)])
10311012
cc <- E.getTeamConversations tid
10321013
for_ cc $ \c ->
10331014
E.getConversation (c ^. conversationId) >>= \conv ->
10341015
for_ conv $ \dc -> when (remove `isMember` Data.convLocalMembers dc) $ do
10351016
E.deleteMembers (c ^. conversationId) (UserList [remove] [])
1036-
-- If the list was truncated, then the tmids list is incomplete so we simply drop these events
1037-
unless (mems ^. teamMemberListType == ListTruncated) $
1038-
pushEvent tmids edata now dc
1017+
pushEvent tmids edata now dc
10391018
pushEvent :: Set UserId -> Conv.EventData -> UTCTime -> Data.Conversation -> Sem r ()
10401019
pushEvent exceptTo edata now dc = do
10411020
let qconvId = tUntagged $ qualifyAs lusr (Data.convId dc)
10421021
let (bots, users) = localBotsAndUsers (Data.convLocalMembers dc)
10431022
let x = filter (\m -> not (Conv.lmId m `Set.member` exceptTo)) users
10441023
let y = Conv.Event qconvId Nothing (tUntagged lusr) now edata
1045-
for_ (newPushLocal (mems ^. teamMemberListType) (tUnqualified lusr) (ConvEvent y) (recipient <$> x)) $ \p ->
1024+
for_ (newPushLocal ListComplete (tUnqualified lusr) (ConvEvent y) (recipient <$> x)) $ \p ->
10461025
E.push1 $ p & pushConn .~ zcon
10471026
E.deliverAsync (map (,y) bots)
10481027

@@ -1264,9 +1243,8 @@ addTeamMemberInternal ::
12641243
Maybe UserId ->
12651244
Maybe ConnId ->
12661245
NewTeamMember ->
1267-
TeamMemberList ->
12681246
Sem r TeamSize
1269-
addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) memList = do
1247+
addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) = do
12701248
P.debug $
12711249
Log.field "targets" (toByteString (new ^. userId))
12721250
. Log.field "action" (Log.val "Teams.addTeamMemberInternal")
@@ -1277,22 +1255,17 @@ addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) memList =
12771255
checkAdminLimit (length admins')
12781256

12791257
E.createTeamMember tid new
1258+
12801259
now <- input
12811260
let e = newEvent tid now (EdMemberJoin (new ^. userId))
1261+
let rs = case origin of
1262+
Just o -> userRecipient <$> list1 o (filter (/= o) ((new ^. userId) : admins'))
1263+
Nothing -> userRecipient <$> list1 (new ^. userId) (admins')
12821264
E.push1 $
1283-
newPushLocal1 (memList ^. teamMemberListType) (new ^. userId) (TeamEvent e) (recipients origin new) & pushConn .~ originConn
1265+
newPushLocal1 ListComplete (new ^. userId) (TeamEvent e) rs & pushConn .~ originConn & pushTransient .~ True
12841266

12851267
APITeamQueue.pushTeamEvent tid e
12861268
pure sizeBeforeAdd
1287-
where
1288-
recipients (Just o) n =
1289-
list1
1290-
(userRecipient o)
1291-
(membersToRecipients (Just o) (n : memList ^. teamMembers))
1292-
recipients Nothing n =
1293-
list1
1294-
(userRecipient (n ^. userId))
1295-
(membersToRecipients Nothing (memList ^. teamMembers))
12961269

12971270
finishCreateTeam ::
12981271
( Member GundeckAccess r,

0 commit comments

Comments
 (0)