From 19cf3e85b7b2b428bd718b772afa198ed9f2a3bc Mon Sep 17 00:00:00 2001 From: Martin Kraft Date: Thu, 2 Apr 2020 08:09:23 -0400 Subject: [PATCH] MM-23770: Fix for blank DefaultChannelGuestRole on team schemes. (#14210) * MM-23770: Fix for blank DefaultChannelGuestRole on team schemes. * MM-23770: Adds test for an team scheme with a blank DefaultChannelGuestRole field. * MM-23770: Fix for unexpected Schemes.Get. --- api4/channel_test.go | 30 ++++++++++++++++++++++++++++++ app/channel.go | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/api4/channel_test.go b/api4/channel_test.go index d7e4e0cd7b..3231fd6d88 100644 --- a/api4/channel_test.go +++ b/api4/channel_test.go @@ -13,6 +13,8 @@ import ( "time" "github.com/mattermost/mattermost-server/v5/model" + "github.com/mattermost/mattermost-server/v5/plugin/plugintest/mock" + "github.com/mattermost/mattermost-server/v5/store/storetest/mocks" "github.com/mattermost/mattermost-server/v5/utils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -3138,6 +3140,34 @@ func TestGetChannelModerations(t *testing.T) { } } }) + + t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) { + scheme := th.SetupTeamScheme() + scheme.DefaultChannelGuestRole = "" + + mockStore := mocks.Store{} + mockSchemeStore := mocks.SchemeStore{} + mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil) + mockStore.On("Scheme").Return(&mockSchemeStore) + mockStore.On("Team").Return(th.App.Srv().Store.Team()) + mockStore.On("Channel").Return(th.App.Srv().Store.Channel()) + mockStore.On("User").Return(th.App.Srv().Store.User()) + mockStore.On("Post").Return(th.App.Srv().Store.Post()) + mockStore.On("FileInfo").Return(th.App.Srv().Store.FileInfo()) + mockStore.On("Webhook").Return(th.App.Srv().Store.Webhook()) + mockStore.On("System").Return(th.App.Srv().Store.System()) + mockStore.On("License").Return(th.App.Srv().Store.License()) + mockStore.On("Role").Return(th.App.Srv().Store.Role()) + mockStore.On("Close").Return(nil) + th.App.Srv().Store = &mockStore + + team.SchemeId = &scheme.Id + _, err := th.App.UpdateTeamScheme(team) + require.Nil(t, err) + + _, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") + require.Nil(t, res.Error) + }) } func TestPatchChannelModerations(t *testing.T) { diff --git a/app/channel.go b/app/channel.go index e1e66f5a00..903ae45c29 100644 --- a/app/channel.go +++ b/app/channel.go @@ -698,26 +698,39 @@ func (a *App) GetTeamSchemeChannelRoles(teamId string) (guestRoleName, userRoleN // GetChannelModerationsForChannel Gets a channels ChannelModerations from either the higherScoped roles or from the channel scheme roles. func (a *App) GetChannelModerationsForChannel(channel *model.Channel) ([]*model.ChannelModeration, *model.AppError) { - guestRoleName, memberRoleName, _, _ := a.GetSchemeRolesForChannel(channel.Id) + guestRoleName, memberRoleName, _, err := a.GetSchemeRolesForChannel(channel.Id) + if err != nil { + return nil, err + } + memberRole, err := a.GetRoleByName(memberRoleName) if err != nil { return nil, err } - guestRole, err := a.GetRoleByName(guestRoleName) + var guestRole *model.Role + if len(guestRoleName) > 0 { + guestRole, err = a.GetRoleByName(guestRoleName) + if err != nil { + return nil, err + } + } + + higherScopedGuestRoleName, higherScopedMemberRoleName, _, err := a.GetTeamSchemeChannelRoles(channel.TeamId) if err != nil { return nil, err } - - higherScopedGuestRoleName, higherScopedMemberRoleName, _, _ := a.GetTeamSchemeChannelRoles(channel.TeamId) higherScopedMemberRole, err := a.GetRoleByName(higherScopedMemberRoleName) if err != nil { return nil, err } - higherScopedGuestRole, err := a.GetRoleByName(higherScopedGuestRoleName) - if err != nil { - return nil, err + var higherScopedGuestRole *model.Role + if len(guestRoleName) > 0 { + higherScopedGuestRole, err = a.GetRoleByName(higherScopedGuestRoleName) + if err != nil { + return nil, err + } } return buildChannelModerations(channel.Type, memberRole, guestRole, higherScopedMemberRole, higherScopedGuestRole), nil @@ -821,10 +834,19 @@ func (a *App) PatchChannelModerationsForChannel(channel *model.Channel, channelM } func buildChannelModerations(channelType string, memberRole *model.Role, guestRole *model.Role, higherScopedMemberRole *model.Role, higherScopedGuestRole *model.Role) []*model.ChannelModeration { - memberPermissions := memberRole.GetChannelModeratedPermissions(channelType) - guestPermissions := guestRole.GetChannelModeratedPermissions(channelType) - higherScopedMemberPermissions := higherScopedMemberRole.GetChannelModeratedPermissions(channelType) - higherScopedGuestPermissions := higherScopedGuestRole.GetChannelModeratedPermissions(channelType) + var memberPermissions, guestPermissions, higherScopedMemberPermissions, higherScopedGuestPermissions map[string]bool + if memberRole != nil { + memberPermissions = memberRole.GetChannelModeratedPermissions(channelType) + } + if guestRole != nil { + guestPermissions = guestRole.GetChannelModeratedPermissions(channelType) + } + if higherScopedMemberRole != nil { + higherScopedMemberPermissions = higherScopedMemberRole.GetChannelModeratedPermissions(channelType) + } + if higherScopedGuestRole != nil { + higherScopedGuestPermissions = higherScopedGuestRole.GetChannelModeratedPermissions(channelType) + } var channelModerations []*model.ChannelModeration for _, permissionKey := range model.CHANNEL_MODERATED_PERMISSIONS {