MM-23876: Fix for patching channel moderations with a null team schem… (#14239)
* MM-23876: Fix for patching channel moderations with a null team scheme channel guest role. * MM-23876: Tests the moderations response.
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
27a0ff4d52
Коммит
f92d3fa518
@@ -3282,4 +3282,69 @@ func TestPatchChannelModerations(t *testing.T) {
|
|||||||
require.NotEqual(t, scheme.DeleteAt, int64(0))
|
require.NotEqual(t, scheme.DeleteAt, int64(0))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) {
|
||||||
|
team := th.BasicTeam
|
||||||
|
scheme := th.SetupTeamScheme()
|
||||||
|
scheme.DefaultChannelGuestRole = ""
|
||||||
|
|
||||||
|
mockStore := mocks.Store{}
|
||||||
|
mockSchemeStore := mocks.SchemeStore{}
|
||||||
|
mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil)
|
||||||
|
mockSchemeStore.On("Save", mock.Anything).Return(scheme, nil)
|
||||||
|
mockSchemeStore.On("Delete", 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)
|
||||||
|
|
||||||
|
moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch)
|
||||||
|
require.Nil(t, res.Error)
|
||||||
|
require.Equal(t, len(moderations), 4)
|
||||||
|
for _, moderation := range moderations {
|
||||||
|
if moderation.Name == "manage_members" {
|
||||||
|
require.Empty(t, moderation.Roles.Guests)
|
||||||
|
} else {
|
||||||
|
require.Equal(t, moderation.Roles.Guests.Value, false)
|
||||||
|
require.Equal(t, moderation.Roles.Guests.Enabled, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
require.Equal(t, moderation.Roles.Members.Value, true)
|
||||||
|
require.Equal(t, moderation.Roles.Members.Enabled, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
patch := []*model.ChannelModerationPatch{
|
||||||
|
{
|
||||||
|
Name: &createPosts,
|
||||||
|
Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(true)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
moderations, res = th.SystemAdminClient.PatchChannelModerations(channel.Id, patch)
|
||||||
|
require.Nil(t, res.Error)
|
||||||
|
require.Equal(t, len(moderations), 4)
|
||||||
|
for _, moderation := range moderations {
|
||||||
|
if moderation.Name == "manage_members" {
|
||||||
|
require.Empty(t, moderation.Roles.Guests)
|
||||||
|
} else {
|
||||||
|
require.Equal(t, moderation.Roles.Guests.Value, false)
|
||||||
|
require.Equal(t, moderation.Roles.Guests.Enabled, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
require.Equal(t, moderation.Roles.Members.Value, true)
|
||||||
|
require.Equal(t, moderation.Roles.Members.Enabled, true)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -726,7 +726,7 @@ func (a *App) GetChannelModerationsForChannel(channel *model.Channel) ([]*model.
|
|||||||
}
|
}
|
||||||
|
|
||||||
var higherScopedGuestRole *model.Role
|
var higherScopedGuestRole *model.Role
|
||||||
if len(guestRoleName) > 0 {
|
if len(higherScopedGuestRoleName) > 0 {
|
||||||
higherScopedGuestRole, err = a.GetRoleByName(higherScopedGuestRoleName)
|
higherScopedGuestRole, err = a.GetRoleByName(higherScopedGuestRoleName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -738,19 +738,30 @@ func (a *App) GetChannelModerationsForChannel(channel *model.Channel) ([]*model.
|
|||||||
|
|
||||||
// PatchChannelModerationsForChannel Updates a channels scheme roles based on a given ChannelModerationPatch, if the permissions match the higher scoped role the scheme is deleted.
|
// PatchChannelModerationsForChannel Updates a channels scheme roles based on a given ChannelModerationPatch, if the permissions match the higher scoped role the scheme is deleted.
|
||||||
func (a *App) PatchChannelModerationsForChannel(channel *model.Channel, channelModerationsPatch []*model.ChannelModerationPatch) ([]*model.ChannelModeration, *model.AppError) {
|
func (a *App) PatchChannelModerationsForChannel(channel *model.Channel, channelModerationsPatch []*model.ChannelModerationPatch) ([]*model.ChannelModeration, *model.AppError) {
|
||||||
higherScopedGuestRoleName, higherScopedMemberRoleName, _, _ := a.GetTeamSchemeChannelRoles(channel.TeamId)
|
higherScopedGuestRoleName, higherScopedMemberRoleName, _, err := a.GetTeamSchemeChannelRoles(channel.TeamId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
higherScopedMemberRole, err := a.GetRoleByName(higherScopedMemberRoleName)
|
higherScopedMemberRole, err := a.GetRoleByName(higherScopedMemberRoleName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
higherScopedGuestRole, err := a.GetRoleByName(higherScopedGuestRoleName)
|
var higherScopedGuestRole *model.Role
|
||||||
if err != nil {
|
if len(higherScopedGuestRoleName) > 0 {
|
||||||
return nil, err
|
higherScopedGuestRole, err = a.GetRoleByName(higherScopedGuestRoleName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
higherScopedMemberPermissions := higherScopedMemberRole.GetChannelModeratedPermissions(channel.Type)
|
higherScopedMemberPermissions := higherScopedMemberRole.GetChannelModeratedPermissions(channel.Type)
|
||||||
higherScopedGuestPermissions := higherScopedGuestRole.GetChannelModeratedPermissions(channel.Type)
|
|
||||||
|
var higherScopedGuestPermissions map[string]bool
|
||||||
|
if higherScopedGuestRole != nil {
|
||||||
|
higherScopedGuestPermissions = higherScopedGuestRole.GetChannelModeratedPermissions(channel.Type)
|
||||||
|
}
|
||||||
|
|
||||||
for _, moderationPatch := range channelModerationsPatch {
|
for _, moderationPatch := range channelModerationsPatch {
|
||||||
if moderationPatch.Roles.Members != nil && *moderationPatch.Roles.Members && !higherScopedMemberPermissions[*moderationPatch.Name] {
|
if moderationPatch.Roles.Members != nil && *moderationPatch.Roles.Members && !higherScopedMemberPermissions[*moderationPatch.Name] {
|
||||||
@@ -772,19 +783,29 @@ func (a *App) PatchChannelModerationsForChannel(channel *model.Channel, channelM
|
|||||||
mlog.Info("Permission scheme created.", mlog.String("channel_id", channel.Id), mlog.String("channel_name", channel.Name))
|
mlog.Info("Permission scheme created.", mlog.String("channel_id", channel.Id), mlog.String("channel_name", channel.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
guestRoleName, memberRoleName, _, _ := a.GetSchemeRolesForChannel(channel.Id)
|
guestRoleName, memberRoleName, _, err := a.GetSchemeRolesForChannel(channel.Id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
memberRole, err := a.GetRoleByName(memberRoleName)
|
memberRole, err := a.GetRoleByName(memberRoleName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
guestRole, err := a.GetRoleByName(guestRoleName)
|
var guestRole *model.Role
|
||||||
if err != nil {
|
if len(guestRoleName) > 0 {
|
||||||
return nil, err
|
guestRole, err = a.GetRoleByName(guestRoleName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memberRolePatch := memberRole.RolePatchFromChannelModerationsPatch(channelModerationsPatch, "members")
|
memberRolePatch := memberRole.RolePatchFromChannelModerationsPatch(channelModerationsPatch, "members")
|
||||||
guestRolePatch := guestRole.RolePatchFromChannelModerationsPatch(channelModerationsPatch, "guests")
|
var guestRolePatch *model.RolePatch
|
||||||
|
if guestRole != nil {
|
||||||
|
guestRolePatch = guestRole.RolePatchFromChannelModerationsPatch(channelModerationsPatch, "guests")
|
||||||
|
}
|
||||||
|
|
||||||
for _, channelModerationPatch := range channelModerationsPatch {
|
for _, channelModerationPatch := range channelModerationsPatch {
|
||||||
permissionModified := *channelModerationPatch.Name
|
permissionModified := *channelModerationPatch.Name
|
||||||
|
|||||||
@@ -204,6 +204,10 @@ func PermissionsChangedByPatch(role *Role, patch *RolePatch) []string {
|
|||||||
func ChannelModeratedPermissionsChangedByPatch(role *Role, patch *RolePatch) []string {
|
func ChannelModeratedPermissionsChangedByPatch(role *Role, patch *RolePatch) []string {
|
||||||
var result []string
|
var result []string
|
||||||
|
|
||||||
|
if role == nil {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
if patch.Permissions == nil {
|
if patch.Permissions == nil {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user