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:
Edgar Bellot Micó
2026-08-13 14:22:06 -04:00
committed by GitHub
co-authored by Bill Gardner
parent 9dfbaeca99
commit 663ad3dae9
4 changed files with 67 additions and 3 deletions
+2 -2
View File
@@ -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) {
+1 -1
View File
@@ -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
}
+33
View File
@@ -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)