Skip to content

Commit

Permalink
MM-56929- Dont allow guests to be set via team API (#26286) (#26449)
Browse files Browse the repository at this point in the history
Automatic Merge
  • Loading branch information
mattermost-build committed Mar 12, 2024
1 parent f0872dd commit fba5b8e
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 61 deletions.
42 changes: 33 additions & 9 deletions server/channels/api4/team_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2913,6 +2913,28 @@ func TestUpdateTeamMemberRoles(t *testing.T) {
func TestUpdateTeamMemberSchemeRoles(t *testing.T) {
th := Setup(t).InitBasic()
defer th.TearDown()
enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable
defer func() {
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts })
th.App.Srv().RemoveLicense()
}()
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true })
th.App.Srv().SetLicense(model.NewTestLicense())

id := model.NewId()
guest := &model.User{
Email: th.GenerateTestEmail(),
Nickname: "nn_" + id,
FirstName: "f_" + id,
LastName: "l_" + id,
Password: "Pa$$word11",
EmailVerified: true,
}
guest, appError := th.App.CreateGuest(th.Context, guest)
require.Nil(t, appError)
_, _, appError = th.App.AddUserToTeam(th.Context, th.BasicTeam.Id, guest.Id, "")
require.Nil(t, appError)

SystemAdminClient := th.SystemAdminClient
th.LoginBasic()

Expand Down Expand Up @@ -2944,6 +2966,11 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) {
assert.Equal(t, true, tm2.SchemeUser)
assert.Equal(t, false, tm2.SchemeAdmin)

//cannot set Guest to User for single team
resp, err := SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, guest.Id, s2)
require.Error(t, err)
CheckBadRequestStatus(t, resp)

s3 := &model.SchemeRoles{
SchemeAdmin: true,
SchemeUser: false,
Expand Down Expand Up @@ -2977,21 +3004,18 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) {
SchemeUser: false,
SchemeGuest: true,
}
_, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s5)
require.NoError(t, err)

tm5, _, err := SystemAdminClient.GetTeamMember(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, "")
require.NoError(t, err)
assert.Equal(t, true, tm5.SchemeGuest)
assert.Equal(t, false, tm5.SchemeUser)
assert.Equal(t, false, tm5.SchemeAdmin)
// cannot set user to guest for a single team
resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s5)
require.Error(t, err)
CheckBadRequestStatus(t, resp)

s6 := &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, s6)
require.Error(t, err)
CheckBadRequestStatus(t, resp)

Expand All @@ -3003,7 +3027,7 @@ func TestUpdateTeamMemberSchemeRoles(t *testing.T) {
require.Error(t, err)
CheckNotFoundStatus(t, resp)

resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, th.BasicUser.Id, s4)
resp, err = SystemAdminClient.UpdateTeamMemberSchemeRoles(context.Background(), th.BasicTeam.Id, guest.Id, s4)
require.Error(t, err) // user is a guest, cannot be set as member or admin
CheckBadRequestStatus(t, resp)

Expand Down
87 changes: 45 additions & 42 deletions server/channels/app/import_functions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1505,52 +1505,55 @@ func TestImportImportUser(t *testing.T) {
channelMember, appErr = th.App.GetChannelMember(th.Context, channel.Id, user.Id)
require.Nil(t, appErr, "Failed to get the channel member")

assert.False(t, teamMember.SchemeAdmin)
assert.False(t, channelMember.SchemeAdmin)
assert.True(t, channelMember.SchemeUser)
assert.False(t, teamMember.SchemeGuest)
assert.False(t, channelMember.SchemeGuest)
assert.Equal(t, "", channelMember.ExplicitRoles)

// see https://mattermost.atlassian.net/browse/MM-56986
// Test importing deleted guest with a valid team & valid channel name in apply mode.
username = model.NewId()
deleteAt = model.GetMillis()
deletedGuestData := &imports.UserImportData{
Username: &username,
DeleteAt: &deleteAt,
Email: ptrStr(model.NewId() + "@example.com"),
Teams: &[]imports.UserTeamImportData{
{
Name: &team.Name,
Roles: ptrStr("team_guest"),
Channels: &[]imports.UserChannelImportData{
{
Name: &channel.Name,
Roles: ptrStr("channel_guest"),
},
},
},
},
}
appErr = th.App.importUser(th.Context, deletedGuestData, false)
assert.Nil(t, appErr)

user, appErr = th.App.GetUserByUsername(*deletedGuestData.Username)
require.Nil(t, appErr, "Failed to get user from database.")

teamMember, appErr = th.App.GetTeamMember(th.Context, team.Id, user.Id)
require.Nil(t, appErr, "Failed to get the team member")

assert.False(t, teamMember.SchemeAdmin)
assert.False(t, teamMember.SchemeUser)
assert.True(t, teamMember.SchemeGuest)
assert.Equal(t, "", teamMember.ExplicitRoles)

channelMember, appErr = th.App.GetChannelMember(th.Context, channel.Id, user.Id)
require.Nil(t, appErr, "Failed to get the channel member")

assert.False(t, teamMember.SchemeAdmin)
assert.False(t, channelMember.SchemeUser)
assert.True(t, teamMember.SchemeGuest)
assert.Equal(t, "", channelMember.ExplicitRoles)
// mlog.Debug("TESTING GUEST")
// username = model.NewId()
// deleteAt = model.GetMillis()
// deletedGuestData := &imports.UserImportData{
// Username: &username,
// DeleteAt: &deleteAt,
// Email: ptrStr(model.NewId() + "@example.com"),
// Teams: &[]imports.UserTeamImportData{
// {
// Name: &team.Name,
// Roles: ptrStr("team_guest"),
// Channels: &[]imports.UserChannelImportData{
// {
// Name: &channel.Name,
// Roles: ptrStr("channel_guest"),
// },
// },
// },
// },
// }
// appErr = th.App.importUser(th.Context, deletedGuestData, false)
// assert.Nil(t, appErr)

// user, appErr = th.App.GetUserByUsername(*deletedGuestData.Username)
// require.Nil(t, appErr, "Failed to get user from database.")
// mlog.Debug(user.Roles)

// teamMember, appErr = th.App.GetTeamMember(th.Context, team.Id, user.Id)
// require.Nil(t, appErr, "Failed to get the team member")

// assert.False(t, teamMember.SchemeAdmin)
// assert.False(t, teamMember.SchemeUser)
// assert.True(t, teamMember.SchemeGuest)
// assert.Equal(t, "", teamMember.ExplicitRoles)

// channelMember, appErr = th.App.GetChannelMember(th.Context, channel.Id, user.Id)
// require.Nil(t, appErr, "Failed to get the channel member")

// assert.False(t, teamMember.SchemeAdmin)
// assert.False(t, channelMember.SchemeUser)
// assert.True(t, teamMember.SchemeGuest)
// assert.Equal(t, "", channelMember.ExplicitRoles)
}

func TestImportUserTeams(t *testing.T) {
Expand Down
8 changes: 2 additions & 6 deletions server/channels/app/team.go
Original file line number Diff line number Diff line change
Expand Up @@ -514,12 +514,8 @@ func (a *App) UpdateTeamMemberSchemeRoles(c request.CTX, teamID string, userID s
return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.guest.app_error", nil, "", http.StatusBadRequest)
}

if isSchemeUser && isSchemeGuest {
return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.guest_and_user.app_error", nil, "", http.StatusBadRequest)
}

if isSchemeAdmin && isSchemeGuest {
return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.guest_and_admin.app_error", nil, "", http.StatusBadRequest)
if isSchemeGuest {
return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.user_and_guest.app_error", nil, "", http.StatusBadRequest)
}

member.SchemeAdmin = isSchemeAdmin
Expand Down
8 changes: 4 additions & 4 deletions server/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -3126,14 +3126,14 @@
"id": "api.team.update_team_member_roles.guest.app_error",
"translation": "Invalid team member update: A guest cannot be made team member or team admin, please promote as a user first."
},
{
"id": "api.team.update_team_member_roles.guest_and_admin.app_error",
"translation": "Invalid team member update: A user must cannot be set as a guest and admin at the same time."
},
{
"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.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."
},
{
"id": "api.team.update_team_scheme.license.error",
"translation": "Your license does not support updating a team's scheme"
Expand Down

0 comments on commit fba5b8e

Please sign in to comment.