mirror of
https://github.com/mattermost/mattermost.git
synced 2026-08-26 21:27:40 -05:00
MM-70072: Update team admin assignment during team join (#37922)
* MM-70072: Update team admin assignment during team join * Assert SchemeUser in team rejoin test case * MM-70072: Fix team admin assignment in bulk import path * Preserve computed admin status through scheme role sync in bulk import --------- Co-authored-by: Bill Gardner <billg@wavearts.com>
This commit is contained in:
co-authored by
Bill Gardner
parent
9dfbaeca99
commit
663ad3dae9
@@ -1113,7 +1113,7 @@ func (a *App) importUserTeams(rctx request.CTX, user *model.User, data *[]import
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
member.SchemeAdmin = userShouldBeAdmin
|
||||
member.SchemeAdmin = member.SchemeAdmin || userShouldBeAdmin
|
||||
}
|
||||
|
||||
if tdata.Channels != nil {
|
||||
@@ -1170,7 +1170,7 @@ func (a *App) importUserTeams(rctx request.CTX, user *model.User, data *[]import
|
||||
}
|
||||
}
|
||||
|
||||
if _, appErr := a.UpdateTeamMemberSchemeRoles(rctx, member.TeamId, user.Id, isGuestByTeamID[member.TeamId], isUserByTeamId[member.TeamId], isAdminByTeamID[member.TeamId]); appErr != nil {
|
||||
if _, appErr := a.UpdateTeamMemberSchemeRoles(rctx, member.TeamId, user.Id, isGuestByTeamID[member.TeamId], isUserByTeamId[member.TeamId], member.SchemeAdmin || isAdminByTeamID[member.TeamId]); appErr != nil {
|
||||
rctx.Logger().Warn("Error updating team member scheme roles", mlog.String("team_id", member.TeamId), mlog.String("user_id", user.Id), mlog.Err(appErr))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1982,6 +1982,37 @@ func TestImportUserTeams(t *testing.T) {
|
||||
appErr := th.App.importUserTeams(th.Context, user, data)
|
||||
require.NotNil(t, appErr)
|
||||
})
|
||||
|
||||
t.Run("Group-synced admin should keep admin when imported roles omit team_admin", func(t *testing.T) {
|
||||
user := th.CreateUser(t)
|
||||
|
||||
group := th.CreateGroup(t)
|
||||
_, err := th.App.UpsertGroupMember(group.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
groupSyncable, err := th.App.UpsertGroupSyncable(&model.GroupSyncable{
|
||||
GroupId: group.Id,
|
||||
AutoAdd: false,
|
||||
SyncableId: th.BasicTeam.Id,
|
||||
Type: model.GroupSyncableTypeTeam,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
groupSyncable.SchemeAdmin = true
|
||||
_, err = th.App.UpdateGroupSyncable(groupSyncable)
|
||||
require.Nil(t, err)
|
||||
|
||||
data := &[]imports.UserTeamImportData{
|
||||
{
|
||||
Name: &th.BasicTeam.Name,
|
||||
},
|
||||
}
|
||||
appErr := th.App.importUserTeams(th.Context, user, data)
|
||||
require.Nil(t, appErr)
|
||||
|
||||
teamMember, nErr := th.App.Srv().Store().Team().GetMember(th.Context, th.BasicTeam.Id, user.Id)
|
||||
require.NoError(t, nErr)
|
||||
require.True(t, teamMember.SchemeAdmin, "group-synced admin should retain admin even though imported roles omit team_admin")
|
||||
})
|
||||
}
|
||||
|
||||
func TestImportUserChannels(t *testing.T) {
|
||||
|
||||
@@ -189,7 +189,7 @@ func (ts *TeamService) JoinUserToTeam(rctx request.CTX, team *model.Team, user *
|
||||
tm.SchemeAdmin = userShouldBeAdmin
|
||||
}
|
||||
|
||||
if team.Email == user.Email {
|
||||
if team.Email == user.Email && !user.IsGuest() {
|
||||
tm.SchemeAdmin = true
|
||||
}
|
||||
|
||||
|
||||
@@ -130,6 +130,39 @@ func TestJoinUserToTeam(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("guest with the team email does not become team admin", func(t *testing.T) {
|
||||
user := model.User{Email: team.Email, Nickname: "Guest Vader", Username: "vader" + model.NewId(), Password: model.NewTestPassword(), Roles: model.SystemGuestRoleId, AuthService: ""}
|
||||
ruser := th.CreateUser(&user)
|
||||
defer th.DeleteUser(&user)
|
||||
|
||||
member, _, err := th.service.JoinUserToTeam(th.Context, team, ruser)
|
||||
require.NoError(t, err)
|
||||
require.True(t, member.SchemeGuest)
|
||||
require.False(t, member.SchemeUser)
|
||||
require.False(t, member.SchemeAdmin)
|
||||
|
||||
err = th.service.RemoveTeamMember(th.Context, member)
|
||||
require.NoError(t, err)
|
||||
|
||||
member, _, err = th.service.JoinUserToTeam(th.Context, team, ruser)
|
||||
require.NoError(t, err)
|
||||
require.True(t, member.SchemeGuest)
|
||||
require.False(t, member.SchemeUser)
|
||||
require.False(t, member.SchemeAdmin)
|
||||
})
|
||||
|
||||
t.Run("regular user with the team email becomes team admin", func(t *testing.T) {
|
||||
user := model.User{Email: team.Email, Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: model.NewTestPassword(), AuthService: ""}
|
||||
ruser := th.CreateUser(&user)
|
||||
defer th.DeleteUser(&user)
|
||||
|
||||
member, _, err := th.service.JoinUserToTeam(th.Context, team, ruser)
|
||||
require.NoError(t, err)
|
||||
require.False(t, member.SchemeGuest)
|
||||
require.True(t, member.SchemeUser)
|
||||
require.True(t, member.SchemeAdmin)
|
||||
})
|
||||
|
||||
t.Run("new join with limit problem", func(t *testing.T) {
|
||||
user1 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: model.NewTestPassword(), AuthService: ""}
|
||||
ruser1 := th.CreateUser(&user1)
|
||||
|
||||
Reference in New Issue
Block a user