diff --git a/server/channels/api4/channel_test.go b/server/channels/api4/channel_test.go index bf1ead14be..c9b0c856e6 100644 --- a/server/channels/api4/channel_test.go +++ b/server/channels/api4/channel_test.go @@ -3976,12 +3976,27 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { th.LoginBasic() + // cannot change the user scheme to false s1 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: false, SchemeGuest: false, } _, err := SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s1) + require.Error(t, err) + + tm1, _, err := SystemAdminClient.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, "") + require.NoError(t, err) + assert.Equal(t, false, tm1.SchemeGuest) + assert.Equal(t, true, tm1.SchemeUser) + assert.Equal(t, false, tm1.SchemeAdmin) + + s2 := &model.SchemeRoles{ + SchemeAdmin: false, + SchemeUser: true, + SchemeGuest: false, + } + _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s2) require.NoError(t, err) waiting := true @@ -3998,20 +4013,6 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { } } - tm1, _, err := SystemAdminClient.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, "") - require.NoError(t, err) - assert.Equal(t, false, tm1.SchemeGuest) - assert.Equal(t, false, tm1.SchemeUser) - assert.Equal(t, false, tm1.SchemeAdmin) - - s2 := &model.SchemeRoles{ - SchemeAdmin: false, - SchemeUser: true, - SchemeGuest: false, - } - _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s2) - require.NoError(t, err) - tm2, _, err := SystemAdminClient.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, "") require.NoError(t, err) assert.Equal(t, false, tm2.SchemeGuest) @@ -4025,7 +4026,7 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { s3 := &model.SchemeRoles{ SchemeAdmin: true, - SchemeUser: false, + SchemeUser: true, SchemeGuest: false, } _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s3) @@ -4034,60 +4035,46 @@ func TestUpdateChannelMemberSchemeRoles(t *testing.T) { tm3, _, err := SystemAdminClient.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, "") require.NoError(t, err) assert.Equal(t, false, tm3.SchemeGuest) - assert.Equal(t, false, tm3.SchemeUser) + assert.Equal(t, true, tm3.SchemeUser) assert.Equal(t, true, tm3.SchemeAdmin) s4 := &model.SchemeRoles{ - SchemeAdmin: true, - SchemeUser: true, - SchemeGuest: false, - } - _, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s4) - require.NoError(t, err) - - tm4, _, err := SystemAdminClient.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, "") - require.NoError(t, err) - assert.Equal(t, false, tm4.SchemeGuest) - assert.Equal(t, true, tm4.SchemeUser) - assert.Equal(t, true, tm4.SchemeAdmin) - - s5 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: false, SchemeGuest: true, } // cannot set user to guest for a single channel - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s5) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s4) require.Error(t, err) CheckBadRequestStatus(t, resp) - s6 := &model.SchemeRoles{ + s5 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: true, SchemeGuest: true, } - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s6) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s5) require.Error(t, err) CheckBadRequestStatus(t, resp) - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), model.NewId(), th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), model.NewId(), th.BasicUser.Id, s3) require.Error(t, err) CheckForbiddenStatus(t, resp) - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, model.NewId(), s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, model.NewId(), s3) require.Error(t, err) CheckNotFoundStatus(t, resp) - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), "ASDF", th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), "ASDF", th.BasicUser.Id, s3) require.Error(t, err) CheckBadRequestStatus(t, resp) - resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, "ASDF", s4) + resp, err = SystemAdminClient.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, "ASDF", s3) require.Error(t, err) CheckBadRequestStatus(t, resp) th.LoginBasic2() - resp, err = th.Client.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s4) + resp, err = th.Client.UpdateChannelMemberSchemeRoles(context.Background(), th.BasicChannel.Id, th.BasicUser.Id, s3) require.Error(t, err) CheckForbiddenStatus(t, resp) diff --git a/server/channels/api4/team_test.go b/server/channels/api4/team_test.go index 303a58c8d8..e5771442e4 100644 --- a/server/channels/api4/team_test.go +++ b/server/channels/api4/team_test.go @@ -3333,18 +3333,19 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { SystemAdminClient := th.SystemAdminClient th.LoginBasic() + // cannot change the user scheme to false s1 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: false, SchemeGuest: false, } _, err := SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s1) - require.NoError(t, err) + require.Error(t, err) tm1, _, err := SystemAdminClient.GetTeamMember(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, "") require.NoError(t, err) assert.Equal(t, false, tm1.SchemeGuest) - assert.Equal(t, false, tm1.SchemeUser) + assert.Equal(t, true, tm1.SchemeUser) assert.Equal(t, false, tm1.SchemeAdmin) s2 := &model.SchemeRoles{ @@ -3368,7 +3369,7 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { s3 := &model.SchemeRoles{ SchemeAdmin: true, - SchemeUser: false, + SchemeUser: true, SchemeGuest: false, } _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s3) @@ -3377,71 +3378,57 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) { tm3, _, err := SystemAdminClient.GetTeamMember(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, "") require.NoError(t, err) assert.Equal(t, false, tm3.SchemeGuest) - assert.Equal(t, false, tm3.SchemeUser) + assert.Equal(t, true, tm3.SchemeUser) assert.Equal(t, true, tm3.SchemeAdmin) s4 := &model.SchemeRoles{ - SchemeAdmin: true, - SchemeUser: true, - SchemeGuest: false, - } - _, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s4) - require.NoError(t, err) - - tm4, _, err := SystemAdminClient.GetTeamMember(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, "") - require.NoError(t, err) - assert.Equal(t, false, tm4.SchemeGuest) - assert.Equal(t, true, tm4.SchemeUser) - assert.Equal(t, true, tm4.SchemeAdmin) - - s5 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: false, SchemeGuest: true, } // cannot set user to guest for a single team - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s5) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s4) require.Error(t, err) CheckBadRequestStatus(t, resp) - s6 := &model.SchemeRoles{ + s5 := &model.SchemeRoles{ SchemeAdmin: false, SchemeUser: true, SchemeGuest: true, } - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s6) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s5) require.Error(t, err) CheckBadRequestStatus(t, resp) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), model.NewId(), th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), model.NewId(), th.BasicUser.Id, s3) require.Error(t, err) CheckNotFoundStatus(t, resp) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, model.NewId(), s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, model.NewId(), s3) require.Error(t, err) CheckNotFoundStatus(t, resp) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, guest.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, guest.Id, s3) require.Error(t, err) // user is a guest, cannot be set as member or admin CheckBadRequestStatus(t, resp) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), "ASDF", th.BasicUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), "ASDF", th.BasicUser.Id, s3) require.Error(t, err) CheckBadRequestStatus(t, resp) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, "ASDF", s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, "ASDF", s3) require.Error(t, err) CheckBadRequestStatus(t, resp) th.LoginBasic2() - resp, err = th.Client.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s4) + resp, err = th.Client.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s3) require.Error(t, err) CheckForbiddenStatus(t, resp) _, err = SystemAdminClient.Logout(context.Background()) require.NoError(t, err) - resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.SystemAdminUser.Id, s4) + resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.SystemAdminUser.Id, s3) require.Error(t, err) CheckUnauthorizedStatus(t, resp) } diff --git a/server/channels/app/channel.go b/server/channels/app/channel.go index 995ae2a482..7004cc3445 100644 --- a/server/channels/app/channel.go +++ b/server/channels/app/channel.go @@ -1324,6 +1324,10 @@ func (a *App) UpdateChannelMemberSchemeRoles(c request.CTX, channelID string, us return nil, model.NewAppError("UpdateChannelMemberSchemeRoles", "api.channel.update_channel_member_roles.user_and_guest.app_error", nil, "", http.StatusBadRequest) } + if !isSchemeUser { + return nil, model.NewAppError("UpdateChannelMemberSchemeRoles", "api.channel.update_channel_member_roles.unset_user_scheme.app_error", nil, "", http.StatusBadRequest) + } + member.SchemeAdmin = isSchemeAdmin member.SchemeUser = isSchemeUser member.SchemeGuest = isSchemeGuest diff --git a/server/channels/app/team.go b/server/channels/app/team.go index 1d6c13a6d3..96e54bcfd0 100644 --- a/server/channels/app/team.go +++ b/server/channels/app/team.go @@ -490,6 +490,10 @@ func (a *App) UpdateTeamMemberSchemeRoles(c request.CTX, teamID string, userID s return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.user_and_guest.app_error", nil, "", http.StatusBadRequest) } + if !isSchemeUser { + return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.unset_user_scheme.app_error", nil, "", http.StatusBadRequest) + } + member.SchemeAdmin = isSchemeAdmin member.SchemeUser = isSchemeUser member.SchemeGuest = isSchemeGuest diff --git a/server/i18n/en.json b/server/i18n/en.json index aaa2f232ef..fbc05f3c4a 100644 --- a/server/i18n/en.json +++ b/server/i18n/en.json @@ -575,6 +575,10 @@ "id": "api.channel.update_channel_member_roles.scheme_role.app_error", "translation": "The provided role is managed by a Scheme and therefore cannot be applied directly to a Channel Member." }, + { + "id": "api.channel.update_channel_member_roles.unset_user_scheme.app_error", + "translation": "Invalid channel member update: A channel member always has a user scheme." + }, { "id": "api.channel.update_channel_member_roles.user_and_guest.app_error", "translation": "Invalid channel member update: A guest cannot be set for a single channel, a System Admin must promote or demote users to/from guests." @@ -3390,6 +3394,10 @@ "id": "api.team.update_team_member_roles.guest_and_user.app_error", "translation": "Invalid team member update: A user must be a guest or a user but not both." }, + { + "id": "api.team.update_team_member_roles.unset_user_scheme.app_error", + "translation": "Invalid team member update: A team member always has a user scheme." + }, { "id": "api.team.update_team_member_roles.user_and_guest.app_error", "translation": "Invalid team member update: A guest cannot be set for a single team, a System Admin must promote or demote users to/from guests."