From 7e797cea3bafb99318ad779c621be89d6176b4b2 Mon Sep 17 00:00:00 2001 From: Devin Binnie <52460000+devinbinnie@users.noreply.github.com> Date: Wed, 15 May 2024 17:18:05 -0400 Subject: [PATCH] [MM-54757] Stop broadcasting channel_deleted/channel_restored messages from private channels to non-members (#27001) * [MM-54757] Stop broadcasting channel_deleted/channel_restored messages from private channels to non-members * Remove unnecessary return --------- Co-authored-by: Mattermost Build --- server/channels/app/channel.go | 21 ++++++- server/channels/app/channel_test.go | 98 +++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 3 deletions(-) diff --git a/server/channels/app/channel.go b/server/channels/app/channel.go index fddedbfcb9..27ac77c8e8 100644 --- a/server/channels/app/channel.go +++ b/server/channels/app/channel.go @@ -764,7 +764,12 @@ func (a *App) RestoreChannel(c request.CTX, channel *model.Channel, userID strin channel.DeleteAt = 0 a.Srv().Platform().InvalidateCacheForChannel(channel) - message := model.NewWebSocketEvent(model.WebsocketEventChannelRestored, channel.TeamId, "", "", nil, "") + var message *model.WebSocketEvent + if channel.Type == model.ChannelTypeOpen { + message = model.NewWebSocketEvent(model.WebsocketEventChannelRestored, channel.TeamId, "", "", nil, "") + } else { + message = model.NewWebSocketEvent(model.WebsocketEventChannelRestored, "", channel.Id, "", nil, "") + } message.Add("channel_id", channel.Id) a.Publish(message) @@ -1497,7 +1502,12 @@ func (a *App) DeleteChannel(c request.CTX, channel *model.Channel, userID string a.Srv().Platform().InvalidateCacheForChannel(channel) - message := model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, channel.TeamId, "", "", nil, "") + var message *model.WebSocketEvent + if channel.Type == model.ChannelTypeOpen { + message = model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, channel.TeamId, "", "", nil, "") + } else { + message = model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, "", channel.Id, "", nil, "") + } message.Add("channel_id", channel.Id) message.Add("delete_at", deleteAt) a.Publish(message) @@ -3078,8 +3088,13 @@ func (a *App) PermanentDeleteChannel(c request.CTX, channel *model.Channel) *mod } a.Srv().Platform().InvalidateCacheForChannel(channel) - message := model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, channel.TeamId, "", "", nil, "") + var message *model.WebSocketEvent + if channel.Type == model.ChannelTypeOpen { + message = model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, channel.TeamId, "", "", nil, "") + } else { + message = model.NewWebSocketEvent(model.WebsocketEventChannelDeleted, "", channel.Id, "", nil, "") + } message.Add("channel_id", channel.Id) message.Add("delete_at", deleteAt) a.Publish(message) diff --git a/server/channels/app/channel_test.go b/server/channels/app/channel_test.go index 44cc457ee8..b9e706065c 100644 --- a/server/channels/app/channel_test.go +++ b/server/channels/app/channel_test.go @@ -2854,3 +2854,101 @@ func TestPatchChannelMembersNotifyProps(t *testing.T) { assert.NotNil(t, appErr) }) } + +func TestDeleteChannel(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + + t.Run("should send the correct websocket events", func(t *testing.T) { + user1 := th.CreateUser() + user2 := th.CreateUser() + + channel1 := th.CreateChannel(th.Context, th.BasicTeam) + channel2 := th.CreatePrivateChannel(th.Context, th.BasicTeam) + + th.LinkUserToTeam(user1, th.BasicTeam) + th.LinkUserToTeam(user2, th.BasicTeam) + th.AddUserToChannel(user1, channel1) + th.AddUserToChannel(user1, channel2) + + eventTypesFilter := []model.WebsocketEventType{model.WebsocketEventChannelDeleted} + + messages1, closeWS1 := connectFakeWebSocket(t, th, user1.Id, "", eventTypesFilter) + defer closeWS1() + messages2, closeWS2 := connectFakeWebSocket(t, th, user2.Id, "", eventTypesFilter) + defer closeWS2() + + err := th.App.DeleteChannel(th.Context, channel1, "") + require.Nil(t, err) + + received := <-messages1 + assert.Equal(t, model.WebsocketEventChannelDeleted, received.EventType()) + received = <-messages2 + assert.Equal(t, model.WebsocketEventChannelDeleted, received.EventType()) + + err = th.App.DeleteChannel(th.Context, channel2, "") + require.Nil(t, err) + + select { + case shouldNotReceive := <-messages2: + assert.NotEqual(t, model.WebsocketEventChannelDeleted, shouldNotReceive.EventType()) + case <-time.After(2 * time.Second): + } + + received = <-messages1 + assert.Equal(t, model.WebsocketEventChannelDeleted, received.EventType()) + }) +} + +func TestRestoreChannel(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + + t.Run("should send the correct websocket events", func(t *testing.T) { + user1 := th.CreateUser() + user2 := th.CreateUser() + + channel1 := th.CreateChannel(th.Context, th.BasicTeam) + channel2 := th.CreatePrivateChannel(th.Context, th.BasicTeam) + + th.LinkUserToTeam(user1, th.BasicTeam) + th.LinkUserToTeam(user2, th.BasicTeam) + th.AddUserToChannel(user1, channel1) + th.AddUserToChannel(user1, channel2) + + err := th.App.DeleteChannel(th.Context, channel1, "") + require.Nil(t, err) + err = th.App.DeleteChannel(th.Context, channel2, "") + require.Nil(t, err) + + channel1.DeleteAt = time.Now().UnixMilli() + channel2.DeleteAt = time.Now().UnixMilli() + + eventTypesFilter := []model.WebsocketEventType{model.WebsocketEventChannelRestored} + + messages1, closeWS1 := connectFakeWebSocket(t, th, user1.Id, "", eventTypesFilter) + defer closeWS1() + messages2, closeWS2 := connectFakeWebSocket(t, th, user2.Id, "", eventTypesFilter) + defer closeWS2() + + _, err = th.App.RestoreChannel(th.Context, channel1, "") + require.Nil(t, err) + + received := <-messages1 + assert.Equal(t, model.WebsocketEventChannelRestored, received.EventType()) + received = <-messages2 + assert.Equal(t, model.WebsocketEventChannelRestored, received.EventType()) + + _, err = th.App.RestoreChannel(th.Context, channel2, "") + require.Nil(t, err) + + select { + case shouldNotReceive := <-messages2: + assert.NotEqual(t, model.WebsocketEventChannelRestored, shouldNotReceive.EventType()) + case <-time.After(2 * time.Second): + } + + received = <-messages1 + assert.Equal(t, model.WebsocketEventChannelRestored, received.EventType()) + }) +}