MM-33913: Fix read-after-write issues with team member (#17173)

During LDAP sync, we would call AddTeamMember which had a read-after-write issue
where we would create a team member but then immediately after that
query the team member.

The same pattern was found in:
AddTeamMember
AddTeamMembers
AddTeamMemberByToken

To fix this, we just return the inserted team member from AddUserToTeam and use that
instead of query GetTeamMember again.

```release-note
NONE
```

https://mattermost.atlassian.net/browse/MM-33913

Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
Agniva De Sarker
2021-04-02 13:20:58 +05:30
коммит произвёл GitHub
родитель 02196e04fa
Коммит 4f0cfbe329
15 изменённых файлов: 139 добавлений и 145 удалений

Просмотреть файл

@@ -781,7 +781,7 @@ func (th *TestHelper) UpdateActiveUser(user *model.User, active bool) {
func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) { func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
err := th.App.JoinUserToTeam(team, user, "") _, err := th.App.JoinUserToTeam(team, user, "")
if err != nil { if err != nil {
panic(err) panic(err)
} }

Просмотреть файл

@@ -378,7 +378,7 @@ func TestCreateUserWebSocketEvent(t *testing.T) {
guest, err := th.App.CreateGuest(guest) guest, err := th.App.CreateGuest(guest)
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, guest.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, guest.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(guest, th.BasicChannel) _, err = th.App.AddUserToChannel(guest, th.BasicChannel)

Просмотреть файл

@@ -376,10 +376,10 @@ type AppIface interface {
AddTeamMemberByToken(userID, tokenID string) (*model.TeamMember, *model.AppError) AddTeamMemberByToken(userID, tokenID string) (*model.TeamMember, *model.AppError)
AddTeamMembers(teamID string, userIDs []string, userRequestorId string, graceful bool) ([]*model.TeamMemberWithError, *model.AppError) AddTeamMembers(teamID string, userIDs []string, userRequestorId string, graceful bool) ([]*model.TeamMemberWithError, *model.AppError)
AddUserToChannel(user *model.User, channel *model.Channel) (*model.ChannelMember, *model.AppError) AddUserToChannel(user *model.User, channel *model.Channel) (*model.ChannelMember, *model.AppError)
AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.AppError) AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.TeamMember, *model.AppError)
AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.AppError) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.TeamMember, *model.AppError)
AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError
AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.AppError) AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.TeamMember, *model.AppError)
AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError) AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError)
AllowOAuthAppAccessToUser(userID string, authRequest *model.AuthorizeRequest) (string, *model.AppError) AllowOAuthAppAccessToUser(userID string, authRequest *model.AuthorizeRequest) (string, *model.AppError)
AppendFile(fr io.Reader, path string) (int64, *model.AppError) AppendFile(fr io.Reader, path string) (int64, *model.AppError)
@@ -799,7 +799,7 @@ type AppIface interface {
IsUserSignUpAllowed() *model.AppError IsUserSignUpAllowed() *model.AppError
JoinChannel(channel *model.Channel, userID string) *model.AppError JoinChannel(channel *model.Channel, userID string) *model.AppError
JoinDefaultChannels(teamID string, user *model.User, shouldBeAdmin bool, userRequestorId string) *model.AppError JoinDefaultChannels(teamID string, user *model.User, shouldBeAdmin bool, userRequestorId string) *model.AppError
JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) *model.AppError JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) (*model.TeamMember, *model.AppError)
Ldap() einterfaces.LdapInterface Ldap() einterfaces.LdapInterface
LeaveChannel(channelID string, userID string) *model.AppError LeaveChannel(channelID string, userID string) *model.AppError
LeaveTeam(team *model.Team, user *model.User, requestorId string) *model.AppError LeaveTeam(team *model.Team, user *model.User, requestorId string) *model.AppError

Просмотреть файл

@@ -1373,6 +1373,10 @@ func (a *App) addUserToChannel(user *model.User, channel *model.Channel) (*model
} }
func (a *App) AddUserToChannel(user *model.User, channel *model.Channel) (*model.ChannelMember, *model.AppError) { func (a *App) AddUserToChannel(user *model.User, channel *model.Channel) (*model.ChannelMember, *model.AppError) {
// We have to query master here because this is called during LDAP sync from:
// a.createDefaultChannelMemberships -> a.AddTeamMember -> a.AddChannelMember
// So we get a teamMember right after adding a team member which leads to a failure.
// TODO: pass the team member to this method.
teamMember, nErr := a.Srv().Store.Team().GetMember(sqlstore.WithMaster(context.Background()), channel.TeamId, user.Id) teamMember, nErr := a.Srv().Store.Team().GetMember(sqlstore.WithMaster(context.Background()), channel.TeamId, user.Id)
if nErr != nil { if nErr != nil {
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound

Просмотреть файл

@@ -81,11 +81,11 @@ func TestRemoveAllDeactivatedMembersFromChannel(t *testing.T) {
th.App.PermanentDeleteTeam(team) th.App.PermanentDeleteTeam(team)
}() }()
_, err = th.App.AddUserToTeam(team.Id, th.BasicUser.Id, "") _, _, err = th.App.AddUserToTeam(team.Id, th.BasicUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
deacivatedUser := th.CreateUser() deacivatedUser := th.CreateUser()
_, err = th.App.AddUserToTeam(team.Id, deacivatedUser.Id, "") _, _, err = th.App.AddUserToTeam(team.Id, deacivatedUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(deacivatedUser, channel) _, err = th.App.AddUserToChannel(deacivatedUser, channel)
require.Nil(t, err) require.Nil(t, err)
@@ -118,13 +118,13 @@ func TestMoveChannel(t *testing.T) {
th.App.PermanentDeleteTeam(targetTeam) th.App.PermanentDeleteTeam(targetTeam)
}() }()
_, err = th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser.Id, "") _, _, err = th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser2.Id, "") _, _, err = th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser2.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(targetTeam.Id, th.BasicUser.Id, "") _, _, err = th.App.AddUserToTeam(targetTeam.Id, th.BasicUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(th.BasicUser, channel1) _, err = th.App.AddUserToChannel(th.BasicUser, channel1)
@@ -136,7 +136,7 @@ func TestMoveChannel(t *testing.T) {
err = th.App.MoveChannel(targetTeam, channel1, th.BasicUser) err = th.App.MoveChannel(targetTeam, channel1, th.BasicUser)
require.NotNil(t, err, "Should have failed due to mismatched members.") require.NotNil(t, err, "Should have failed due to mismatched members.")
_, err = th.App.AddUserToTeam(targetTeam.Id, th.BasicUser2.Id, "") _, _, err = th.App.AddUserToTeam(targetTeam.Id, th.BasicUser2.Id, "")
require.Nil(t, err) require.Nil(t, err)
err = th.App.MoveChannel(targetTeam, channel1, th.BasicUser) err = th.App.MoveChannel(targetTeam, channel1, th.BasicUser)
@@ -148,7 +148,7 @@ func TestMoveChannel(t *testing.T) {
channel2 := th.CreateChannel(sourceTeam) channel2 := th.CreateChannel(sourceTeam)
defer th.App.PermanentDeleteChannel(channel2) defer th.App.PermanentDeleteChannel(channel2)
_, err = th.App.AddUserToTeam(sourceTeam.Id, deacivatedUser.Id, "") _, _, err = th.App.AddUserToTeam(sourceTeam.Id, deacivatedUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(th.BasicUser, channel2) _, err = th.App.AddUserToChannel(th.BasicUser, channel2)
require.Nil(t, err) require.Nil(t, err)
@@ -234,11 +234,11 @@ func TestRemoveUsersFromChannelNotMemberOfTeam(t *testing.T) {
th.App.PermanentDeleteTeam(team2) th.App.PermanentDeleteTeam(team2)
}() }()
_, err := th.App.AddUserToTeam(team.Id, th.BasicUser.Id, "") _, _, err := th.App.AddUserToTeam(team.Id, th.BasicUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(team2.Id, th.BasicUser.Id, "") _, _, err = th.App.AddUserToTeam(team2.Id, th.BasicUser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(team.Id, th.BasicUser2.Id, "") _, _, err = th.App.AddUserToTeam(team.Id, th.BasicUser2.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(th.BasicUser, channel1) _, err = th.App.AddUserToChannel(th.BasicUser, channel1)
@@ -1098,7 +1098,7 @@ func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel) _, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
@@ -1112,7 +1112,7 @@ func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel) _, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
@@ -1126,7 +1126,7 @@ func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel) _, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
@@ -1140,7 +1140,7 @@ func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel) _, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
@@ -1157,7 +1157,7 @@ func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel) _, err = th.App.AddUserToChannel(ruser, th.BasicChannel)

Просмотреть файл

@@ -400,7 +400,7 @@ func (th *TestHelper) CreateMessagePost(channel *model.Channel, message string)
func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) { func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
err := th.App.JoinUserToTeam(team, user, "") _, err := th.App.JoinUserToTeam(team, user, "")
if err != nil { if err != nil {
panic(err) panic(err)
} }

Просмотреть файл

@@ -479,7 +479,7 @@ func (a *OpenTracingAppLayer) AddUserToChannel(user *model.User, channel *model.
return resultVar0, resultVar1 return resultVar0, resultVar1
} }
func (a *OpenTracingAppLayer) AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.AppError) { func (a *OpenTracingAppLayer) AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.TeamMember, *model.AppError) {
origCtx := a.ctx origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeam") span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeam")
@@ -491,17 +491,17 @@ func (a *OpenTracingAppLayer) AddUserToTeam(teamID string, userID string, userRe
}() }()
defer span.Finish() defer span.Finish()
resultVar0, resultVar1 := a.app.AddUserToTeam(teamID, userID, userRequestorId) resultVar0, resultVar1, resultVar2 := a.app.AddUserToTeam(teamID, userID, userRequestorId)
if resultVar1 != nil { if resultVar2 != nil {
span.LogFields(spanlog.Error(resultVar1)) span.LogFields(spanlog.Error(resultVar2))
ext.Error.Set(span, true) ext.Error.Set(span, true)
} }
return resultVar0, resultVar1 return resultVar0, resultVar1, resultVar2
} }
func (a *OpenTracingAppLayer) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.AppError) { func (a *OpenTracingAppLayer) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.TeamMember, *model.AppError) {
origCtx := a.ctx origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeamByInviteId") span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeamByInviteId")
@@ -513,14 +513,14 @@ func (a *OpenTracingAppLayer) AddUserToTeamByInviteId(inviteId string, userID st
}() }()
defer span.Finish() defer span.Finish()
resultVar0, resultVar1 := a.app.AddUserToTeamByInviteId(inviteId, userID) resultVar0, resultVar1, resultVar2 := a.app.AddUserToTeamByInviteId(inviteId, userID)
if resultVar1 != nil { if resultVar2 != nil {
span.LogFields(spanlog.Error(resultVar1)) span.LogFields(spanlog.Error(resultVar2))
ext.Error.Set(span, true) ext.Error.Set(span, true)
} }
return resultVar0, resultVar1 return resultVar0, resultVar1, resultVar2
} }
func (a *OpenTracingAppLayer) AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError { func (a *OpenTracingAppLayer) AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError {
@@ -545,7 +545,7 @@ func (a *OpenTracingAppLayer) AddUserToTeamByTeamId(teamID string, user *model.U
return resultVar0 return resultVar0
} }
func (a *OpenTracingAppLayer) AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.AppError) { func (a *OpenTracingAppLayer) AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.TeamMember, *model.AppError) {
origCtx := a.ctx origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeamByToken") span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddUserToTeamByToken")
@@ -557,14 +557,14 @@ func (a *OpenTracingAppLayer) AddUserToTeamByToken(userID string, tokenID string
}() }()
defer span.Finish() defer span.Finish()
resultVar0, resultVar1 := a.app.AddUserToTeamByToken(userID, tokenID) resultVar0, resultVar1, resultVar2 := a.app.AddUserToTeamByToken(userID, tokenID)
if resultVar1 != nil { if resultVar2 != nil {
span.LogFields(spanlog.Error(resultVar1)) span.LogFields(spanlog.Error(resultVar2))
ext.Error.Set(span, true) ext.Error.Set(span, true)
} }
return resultVar0, resultVar1 return resultVar0, resultVar1, resultVar2
} }
func (a *OpenTracingAppLayer) AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError) { func (a *OpenTracingAppLayer) AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError) {
@@ -10675,7 +10675,7 @@ func (a *OpenTracingAppLayer) JoinDefaultChannels(teamID string, user *model.Use
return resultVar0 return resultVar0
} }
func (a *OpenTracingAppLayer) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) *model.AppError { func (a *OpenTracingAppLayer) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) (*model.TeamMember, *model.AppError) {
origCtx := a.ctx origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.JoinUserToTeam") span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.JoinUserToTeam")
@@ -10687,14 +10687,14 @@ func (a *OpenTracingAppLayer) JoinUserToTeam(team *model.Team, user *model.User,
}() }()
defer span.Finish() defer span.Finish()
resultVar0 := a.app.JoinUserToTeam(team, user, userRequestorId) resultVar0, resultVar1 := a.app.JoinUserToTeam(team, user, userRequestorId)
if resultVar0 != nil { if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar0)) span.LogFields(spanlog.Error(resultVar1))
ext.Error.Set(span, true) ext.Error.Set(span, true)
} }
return resultVar0 return resultVar0, resultVar1
} }
func (a *OpenTracingAppLayer) LeaveChannel(channelID string, userID string) *model.AppError { func (a *OpenTracingAppLayer) LeaveChannel(channelID string, userID string) *model.AppError {

Просмотреть файл

@@ -41,7 +41,7 @@ func TestInviteProvider(t *testing.T) {
Description: "a test bot", Description: "a test bot",
}) })
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot2.UserId, basicUser3.Id) _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot2.UserId, basicUser3.Id)
require.Nil(t, err) require.Nil(t, err)
bot3, err := th.App.CreateBot(&model.Bot{ bot3, err := th.App.CreateBot(&model.Bot{
@@ -50,7 +50,7 @@ func TestInviteProvider(t *testing.T) {
Description: "a test bot", Description: "a test bot",
}) })
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot3.UserId, basicUser3.Id) _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot3.UserId, basicUser3.Id)
require.Nil(t, err) require.Nil(t, err)
err = th.App.RemoveUserFromTeam(th.BasicTeam.Id, bot3.UserId, basicUser3.Id) err = th.App.RemoveUserFromTeam(th.BasicTeam.Id, bot3.UserId, basicUser3.Id)
require.Nil(t, err) require.Nil(t, err)

Просмотреть файл

@@ -347,7 +347,7 @@ func (th *TestHelper) createPost(channel *model.Channel) *model.Post {
func (th *TestHelper) linkUserToTeam(user *model.User, team *model.Team) { func (th *TestHelper) linkUserToTeam(user *model.User, team *model.Team) {
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
err := th.App.JoinUserToTeam(team, user, "") _, err := th.App.JoinUserToTeam(team, user, "")
if err != nil { if err != nil {
panic(err) panic(err)
} }

Просмотреть файл

@@ -65,7 +65,7 @@ func (a *App) CreateTeamWithUser(team *model.Team, userID string) (*model.Team,
return nil, err return nil, err
} }
if err = a.JoinUserToTeam(rteam, user, ""); err != nil { if _, err := a.JoinUserToTeam(rteam, user, ""); err != nil {
return nil, err return nil, err
} }
@@ -480,7 +480,7 @@ func (a *App) sendUpdatedMemberRoleEvent(userID string, member *model.TeamMember
a.Publish(message) a.Publish(message)
} }
func (a *App) AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.AppError) { func (a *App) AddUserToTeam(teamID string, userID string, userRequestorId string) (*model.Team, *model.TeamMember, *model.AppError) {
tchan := make(chan store.StoreResult, 1) tchan := make(chan store.StoreResult, 1)
go func() { go func() {
team, err := a.Srv().Store.Team().Get(teamID) team, err := a.Srv().Store.Team().Get(teamID)
@@ -500,9 +500,9 @@ func (a *App) AddUserToTeam(teamID string, userID string, userRequestorId string
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeam", "app.team.get.find.app_error", nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeam", "app.team.get.find.app_error", nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeam", "app.team.get.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeam", "app.team.get.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
team := result.Data.(*model.Team) team := result.Data.(*model.Team)
@@ -512,18 +512,19 @@ func (a *App) AddUserToTeam(teamID string, userID string, userRequestorId string
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeam", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeam", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeam", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeam", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
user := result.Data.(*model.User) user := result.Data.(*model.User)
if err := a.JoinUserToTeam(team, user, userRequestorId); err != nil { teamMember, err := a.JoinUserToTeam(team, user, userRequestorId)
return nil, err if err != nil {
return nil, nil, err
} }
return team, nil return team, teamMember, nil
} }
func (a *App) AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError { func (a *App) AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppError {
@@ -538,22 +539,25 @@ func (a *App) AddUserToTeamByTeamId(teamID string, user *model.User) *model.AppE
} }
} }
return a.JoinUserToTeam(team, user, "") if _, err := a.JoinUserToTeam(team, user, ""); err != nil {
return err
}
return nil
} }
func (a *App) AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.AppError) { func (a *App) AddUserToTeamByToken(userID string, tokenID string) (*model.Team, *model.TeamMember, *model.AppError) {
token, err := a.Srv().Store.Token().GetByToken(tokenID) token, err := a.Srv().Store.Token().GetByToken(tokenID)
if err != nil { if err != nil {
return nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_invalid.app_error", nil, err.Error(), http.StatusBadRequest) return nil, nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_invalid.app_error", nil, err.Error(), http.StatusBadRequest)
} }
if token.Type != TokenTypeTeamInvitation && token.Type != TokenTypeGuestInvitation { if token.Type != TokenTypeTeamInvitation && token.Type != TokenTypeGuestInvitation {
return nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_invalid.app_error", nil, "", http.StatusBadRequest) return nil, nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_invalid.app_error", nil, "", http.StatusBadRequest)
} }
if model.GetMillis()-token.CreateAt >= InvitationExpiryTime { if model.GetMillis()-token.CreateAt >= InvitationExpiryTime {
a.DeleteToken(token) a.DeleteToken(token)
return nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_expired.app_error", nil, "", http.StatusBadRequest) return nil, nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.signup_link_expired.app_error", nil, "", http.StatusBadRequest)
} }
tokenData := model.MapFromJson(strings.NewReader(token.Extra)) tokenData := model.MapFromJson(strings.NewReader(token.Extra))
@@ -577,15 +581,15 @@ func (a *App) AddUserToTeamByToken(userID string, tokenID string) (*model.Team,
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeamByToken", "app.team.get.find.app_error", nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeamByToken", "app.team.get.find.app_error", nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeamByToken", "app.team.get.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeamByToken", "app.team.get.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
team := result.Data.(*model.Team) team := result.Data.(*model.Team)
if team.IsGroupConstrained() { if team.IsGroupConstrained() {
return nil, model.NewAppError("AddUserToTeamByToken", "app.team.invite_token.group_constrained.error", nil, "", http.StatusForbidden) return nil, nil, model.NewAppError("AddUserToTeamByToken", "app.team.invite_token.group_constrained.error", nil, "", http.StatusForbidden)
} }
result = <-uchan result = <-uchan
@@ -593,28 +597,29 @@ func (a *App) AddUserToTeamByToken(userID string, tokenID string) (*model.Team,
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeamByToken", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeamByToken", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeamByToken", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeamByToken", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
user := result.Data.(*model.User) user := result.Data.(*model.User)
if user.IsGuest() && token.Type == TokenTypeTeamInvitation { if user.IsGuest() && token.Type == TokenTypeTeamInvitation {
return nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.invalid_invitation_type.app_error", nil, "", http.StatusBadRequest) return nil, nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.invalid_invitation_type.app_error", nil, "", http.StatusBadRequest)
} }
if !user.IsGuest() && token.Type == TokenTypeGuestInvitation { if !user.IsGuest() && token.Type == TokenTypeGuestInvitation {
return nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.invalid_invitation_type.app_error", nil, "", http.StatusBadRequest) return nil, nil, model.NewAppError("AddUserToTeamByToken", "api.user.create_user.invalid_invitation_type.app_error", nil, "", http.StatusBadRequest)
} }
if err := a.JoinUserToTeam(team, user, ""); err != nil { teamMember, appErr := a.JoinUserToTeam(team, user, "")
return nil, err if appErr != nil {
return nil, nil, appErr
} }
if token.Type == TokenTypeGuestInvitation { if token.Type == TokenTypeGuestInvitation {
channels, err := a.Srv().Store.Channel().GetChannelsByIds(strings.Split(tokenData["channels"], " "), false) channels, err := a.Srv().Store.Channel().GetChannelsByIds(strings.Split(tokenData["channels"], " "), false)
if err != nil { if err != nil {
return nil, model.NewAppError("AddUserToTeamByToken", "app.channel.get_channels_by_ids.app_error", nil, err.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeamByToken", "app.channel.get_channels_by_ids.app_error", nil, err.Error(), http.StatusInternalServerError)
} }
for _, channel := range channels { for _, channel := range channels {
@@ -629,10 +634,10 @@ func (a *App) AddUserToTeamByToken(userID string, tokenID string) (*model.Team,
mlog.Warn("Error while deleting token", mlog.Err(err)) mlog.Warn("Error while deleting token", mlog.Err(err))
} }
return team, nil return team, teamMember, nil
} }
func (a *App) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.AppError) { func (a *App) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Team, *model.TeamMember, *model.AppError) {
tchan := make(chan store.StoreResult, 1) tchan := make(chan store.StoreResult, 1)
go func() { go func() {
team, err := a.Srv().Store.Team().GetByInviteId(inviteId) team, err := a.Srv().Store.Team().GetByInviteId(inviteId)
@@ -652,9 +657,9 @@ func (a *App) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Te
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeamByInviteId", "app.team.get_by_invite_id.finding.app_error", nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeamByInviteId", "app.team.get_by_invite_id.finding.app_error", nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeamByInviteId", "app.team.get_by_invite_id.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeamByInviteId", "app.team.get_by_invite_id.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
team := result.Data.(*model.Team) team := result.Data.(*model.Team)
@@ -664,18 +669,19 @@ func (a *App) AddUserToTeamByInviteId(inviteId string, userID string) (*model.Te
var nfErr *store.ErrNotFound var nfErr *store.ErrNotFound
switch { switch {
case errors.As(result.NErr, &nfErr): case errors.As(result.NErr, &nfErr):
return nil, model.NewAppError("AddUserToTeamByInviteId", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound) return nil, nil, model.NewAppError("AddUserToTeamByInviteId", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound)
default: default:
return nil, model.NewAppError("AddUserToTeamByInviteId", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) return nil, nil, model.NewAppError("AddUserToTeamByInviteId", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError)
} }
} }
user := result.Data.(*model.User) user := result.Data.(*model.User)
if err := a.JoinUserToTeam(team, user, ""); err != nil { teamMember, err := a.JoinUserToTeam(team, user, "")
return nil, err if err != nil {
return nil, nil, err
} }
return team, nil return team, teamMember, nil
} }
// Returns three values: // Returns three values:
@@ -753,16 +759,16 @@ func (a *App) joinUserToTeam(team *model.Team, user *model.User) (*model.TeamMem
return member, false, nil return member, false, nil
} }
func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) *model.AppError { func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId string) (*model.TeamMember, *model.AppError) {
if !a.isTeamEmailAllowed(user, team) { if !a.isTeamEmailAllowed(user, team) {
return model.NewAppError("JoinUserToTeam", "api.team.join_user_to_team.allowed_domains.app_error", nil, "", http.StatusBadRequest) return nil, model.NewAppError("JoinUserToTeam", "api.team.join_user_to_team.allowed_domains.app_error", nil, "", http.StatusBadRequest)
} }
tm, alreadyAdded, err := a.joinUserToTeam(team, user) teamMember, alreadyAdded, err := a.joinUserToTeam(team, user)
if err != nil { if err != nil {
return err return nil, err
} }
if alreadyAdded { if alreadyAdded {
return nil return teamMember, nil
} }
if pluginsEnvironment := a.GetPluginsEnvironment(); pluginsEnvironment != nil { if pluginsEnvironment := a.GetPluginsEnvironment(); pluginsEnvironment != nil {
@@ -774,14 +780,14 @@ func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId
a.Srv().Go(func() { a.Srv().Go(func() {
pluginContext := a.PluginContext() pluginContext := a.PluginContext()
pluginsEnvironment.RunMultiPluginHook(func(hooks plugin.Hooks) bool { pluginsEnvironment.RunMultiPluginHook(func(hooks plugin.Hooks) bool {
hooks.UserHasJoinedTeam(pluginContext, tm, actor) hooks.UserHasJoinedTeam(pluginContext, teamMember, actor)
return true return true
}, plugin.UserHasJoinedTeamID) }, plugin.UserHasJoinedTeamID)
}) })
} }
if _, err := a.Srv().Store.User().UpdateUpdateAt(user.Id); err != nil { if _, err := a.Srv().Store.User().UpdateUpdateAt(user.Id); err != nil {
return model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError) return nil, model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError)
} }
if _, err := a.createInitialSidebarCategories(user.Id, team.Id); err != nil { if _, err := a.createInitialSidebarCategories(user.Id, team.Id); err != nil {
@@ -816,7 +822,7 @@ func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId
message.Add("user_id", user.Id) message.Add("user_id", user.Id)
a.Publish(message) a.Publish(message)
return nil return teamMember, nil
} }
func (a *App) GetTeam(teamID string) (*model.Team, *model.AppError) { func (a *App) GetTeam(teamID string) (*model.Team, *model.AppError) {
@@ -1050,11 +1056,7 @@ func (a *App) GetTeamMembersByIds(teamID string, userIDs []string, restrictions
} }
func (a *App) AddTeamMember(teamID, userID string) (*model.TeamMember, *model.AppError) { func (a *App) AddTeamMember(teamID, userID string) (*model.TeamMember, *model.AppError) {
if _, err := a.AddUserToTeam(teamID, userID, ""); err != nil { _, teamMember, err := a.AddUserToTeam(teamID, userID, "")
return nil, err
}
teamMember, err := a.GetTeamMember(teamID, userID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1071,7 +1073,8 @@ func (a *App) AddTeamMembers(teamID string, userIDs []string, userRequestorId st
var membersWithErrors []*model.TeamMemberWithError var membersWithErrors []*model.TeamMemberWithError
for _, userID := range userIDs { for _, userID := range userIDs {
if _, err := a.AddUserToTeam(teamID, userID, userRequestorId); err != nil { _, teamMember, err := a.AddUserToTeam(teamID, userID, userRequestorId)
if err != nil {
if graceful { if graceful {
membersWithErrors = append(membersWithErrors, &model.TeamMemberWithError{ membersWithErrors = append(membersWithErrors, &model.TeamMemberWithError{
UserId: userID, UserId: userID,
@@ -1082,10 +1085,6 @@ func (a *App) AddTeamMembers(teamID string, userIDs []string, userRequestorId st
return nil, err return nil, err
} }
teamMember, err := a.GetTeamMember(teamID, userID)
if err != nil {
return nil, err
}
membersWithErrors = append(membersWithErrors, &model.TeamMemberWithError{ membersWithErrors = append(membersWithErrors, &model.TeamMemberWithError{
UserId: userID, UserId: userID,
Member: teamMember, Member: teamMember,
@@ -1101,12 +1100,7 @@ func (a *App) AddTeamMembers(teamID string, userIDs []string, userRequestorId st
} }
func (a *App) AddTeamMemberByToken(userID, tokenID string) (*model.TeamMember, *model.AppError) { func (a *App) AddTeamMemberByToken(userID, tokenID string) (*model.TeamMember, *model.AppError) {
team, err := a.AddUserToTeamByToken(userID, tokenID) _, teamMember, err := a.AddUserToTeamByToken(userID, tokenID)
if err != nil {
return nil, err
}
teamMember, err := a.GetTeamMember(team.Id, userID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1115,7 +1109,7 @@ func (a *App) AddTeamMemberByToken(userID, tokenID string) (*model.TeamMember, *
} }
func (a *App) AddTeamMemberByInviteId(inviteId, userID string) (*model.TeamMember, *model.AppError) { func (a *App) AddTeamMemberByInviteId(inviteId, userID string) (*model.TeamMember, *model.AppError) {
team, err := a.AddUserToTeamByInviteId(inviteId, userID) team, teamMember, err := a.AddUserToTeamByInviteId(inviteId, userID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1124,10 +1118,6 @@ func (a *App) AddTeamMemberByInviteId(inviteId, userID string) (*model.TeamMembe
return nil, model.NewAppError("AddTeamMemberByInviteId", "app.team.invite_id.group_constrained.error", nil, "", http.StatusForbidden) return nil, model.NewAppError("AddTeamMemberByInviteId", "app.team.invite_id.group_constrained.error", nil, "", http.StatusForbidden)
} }
teamMember, err := a.GetTeamMember(team.Id, userID)
if err != nil {
return nil, err
}
return teamMember, nil return teamMember, nil
} }

Просмотреть файл

@@ -76,7 +76,7 @@ func TestAddUserToTeam(t *testing.T) {
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err, "Should add user to the team") require.Nil(t, err, "Should add user to the team")
}) })
@@ -89,7 +89,7 @@ func TestAddUserToTeam(t *testing.T) {
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err, "Should have allowed whitelisted user") require.Nil(t, err, "Should have allowed whitelisted user")
}) })
@@ -103,7 +103,7 @@ func TestAddUserToTeam(t *testing.T) {
require.Nil(t, err, "Error creating user: %s", err) require.Nil(t, err, "Error creating user: %s", err)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.NotNil(t, err, "Should not add restricted user") require.NotNil(t, err, "Should not add restricted user")
require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam") require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
@@ -112,7 +112,7 @@ func TestAddUserToTeam(t *testing.T) {
require.Nil(t, err, "Error creating authservice user: %s", err) require.Nil(t, err, "Error creating authservice user: %s", err)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.NotNil(t, err, "Should not add authservice user") require.NotNil(t, err, "Should not add authservice user")
require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam") require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
@@ -123,7 +123,7 @@ func TestAddUserToTeam(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot.UserId, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot.UserId, "")
assert.Nil(t, err, "should be able to add bot to domain restricted team") assert.Nil(t, err, "should be able to add bot to domain restricted team")
}) })
@@ -136,7 +136,7 @@ func TestAddUserToTeam(t *testing.T) {
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.NotNil(t, err, "Should not add restricted user") require.NotNil(t, err, "Should not add restricted user")
require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam") require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
}) })
@@ -159,13 +159,13 @@ func TestAddUserToTeam(t *testing.T) {
defer th.App.PermanentDeleteUser(&user2) defer th.App.PermanentDeleteUser(&user2)
defer th.App.PermanentDeleteUser(&user3) defer th.App.PermanentDeleteUser(&user3)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser1.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser1.Id, "")
require.Nil(t, err, "Should have allowed whitelisted user1") require.Nil(t, err, "Should have allowed whitelisted user1")
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser2.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser2.Id, "")
require.Nil(t, err, "Should have allowed whitelisted user2") require.Nil(t, err, "Should have allowed whitelisted user2")
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser3.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser3.Id, "")
require.NotNil(t, err, "Should not have allowed restricted user3") require.NotNil(t, err, "Should not have allowed restricted user3")
require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam") require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
}) })
@@ -174,7 +174,7 @@ func TestAddUserToTeam(t *testing.T) {
user := th.CreateUser() user := th.CreateUser()
team := th.CreateTeam() team := th.CreateTeam()
_, err := th.App.AddUserToTeam(team.Id, user.Id, "") _, _, err := th.App.AddUserToTeam(team.Id, user.Id, "")
require.Nil(t, err) require.Nil(t, err)
res, err := th.App.GetSidebarCategories(user.Id, team.Id) res, err := th.App.GetSidebarCategories(user.Id, team.Id)
@@ -195,7 +195,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
rguest := th.CreateGuest() rguest := th.CreateGuest()
t.Run("invalid token", func(t *testing.T) { t.Run("invalid token", func(t *testing.T) {
_, err := th.App.AddUserToTeamByToken(ruser.Id, "123") _, _, err := th.App.AddUserToTeamByToken(ruser.Id, "123")
require.NotNil(t, err, "Should fail on unexisting token") require.NotNil(t, err, "Should fail on unexisting token")
}) })
@@ -208,7 +208,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
defer th.App.DeleteToken(token) defer th.App.DeleteToken(token)
_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.NotNil(t, err, "Should fail on bad token type") require.NotNil(t, err, "Should fail on bad token type")
}) })
@@ -222,7 +222,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
defer th.App.DeleteToken(token) defer th.App.DeleteToken(token)
_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.NotNil(t, err, "Should fail on expired token") require.NotNil(t, err, "Should fail on expired token")
}) })
@@ -234,7 +234,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
defer th.App.DeleteToken(token) defer th.App.DeleteToken(token)
_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.NotNil(t, err, "Should fail on bad team id") require.NotNil(t, err, "Should fail on bad team id")
}) })
@@ -246,7 +246,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
defer th.App.DeleteToken(token) defer th.App.DeleteToken(token)
_, err := th.App.AddUserToTeamByToken(model.NewId(), token.Token) _, _, err := th.App.AddUserToTeamByToken(model.NewId(), token.Token)
require.NotNil(t, err, "Should fail on bad user id") require.NotNil(t, err, "Should fail on bad user id")
}) })
@@ -256,7 +256,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}), model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.Nil(t, err, "Should add user to the team") require.Nil(t, err, "Should add user to the team")
_, nErr := th.App.Srv().Store.Token().GetByToken(token.Token) _, nErr := th.App.Srv().Store.Token().GetByToken(token.Token)
@@ -273,7 +273,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}), model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
assert.NotNil(t, err) assert.NotNil(t, err)
}) })
@@ -283,7 +283,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}), model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
assert.NotNil(t, err) assert.NotNil(t, err)
}) })
@@ -298,7 +298,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}), model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
require.NotNil(t, err) require.NotNil(t, err)
assert.Equal(t, "api.team.join_user_to_team.allowed_domains.app_error", err.Id) assert.Equal(t, "api.team.join_user_to_team.allowed_domains.app_error", err.Id)
}) })
@@ -319,7 +319,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
th.App.InvalidateCacheForUser(rguest.Id) th.App.InvalidateCacheForUser(rguest.Id)
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, appErr := th.App.AddUserToTeamByToken(rguest.Id, token.Token) _, _, appErr := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
require.Nil(t, appErr) require.Nil(t, appErr)
rguest.Email = guestEmail rguest.Email = guestEmail
_, err = th.App.Srv().Store.User().Update(rguest, false) _, err = th.App.Srv().Store.User().Update(rguest, false)
@@ -342,7 +342,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
_, err = th.App.Srv().Store.User().Update(rguest, false) _, err = th.App.Srv().Store.User().Update(rguest, false)
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, appErr := th.App.AddUserToTeamByToken(rguest.Id, token.Token) _, _, appErr := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
require.Nil(t, appErr) require.Nil(t, appErr)
th.BasicTeam.AllowedDomains = "" th.BasicTeam.AllowedDomains = ""
_, err = th.Server.Store.Team().Update(th.BasicTeam) _, err = th.Server.Store.Team().Update(th.BasicTeam)
@@ -356,7 +356,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
require.Nil(t, err, "Should add user to the team") require.Nil(t, err, "Should add user to the team")
_, nErr := th.App.Srv().Store.Token().GetByToken(token.Token) _, nErr := th.App.Srv().Store.Token().GetByToken(token.Token)
@@ -379,7 +379,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.NotNil(t, err, "Should return an error when trying to join a group-constrained team.") require.NotNil(t, err, "Should return an error when trying to join a group-constrained team.")
require.Equal(t, "app.team.invite_token.group_constrained.error", err.Id) require.Equal(t, "app.team.invite_token.group_constrained.error", err.Id)
@@ -403,7 +403,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token) _, _, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token)
require.NotNil(t, err, "Should not add restricted user") require.NotNil(t, err, "Should not add restricted user")
require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam") require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
}) })
@@ -418,7 +418,7 @@ func TestAddUserToTeamByToken(t *testing.T) {
) )
require.NoError(t, th.App.Srv().Store.Token().Save(token)) require.NoError(t, th.App.Srv().Store.Token().Save(token))
_, err := th.App.AddUserToTeamByToken(user.Id, token.Token) _, _, err := th.App.AddUserToTeamByToken(user.Id, token.Token)
require.Nil(t, err) require.Nil(t, err)
res, err := th.App.GetSidebarCategories(user.Id, team.Id) res, err := th.App.GetSidebarCategories(user.Id, team.Id)
@@ -880,7 +880,7 @@ func TestGetTeamMembers(t *testing.T) {
require.NotNil(t, ruser) require.NotNil(t, ruser)
defer th.App.PermanentDeleteUser(&user) defer th.App.PermanentDeleteUser(&user)
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
// Store the users for comparison later // Store the users for comparison later
@@ -1041,7 +1041,7 @@ func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user") _, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user")
@@ -1052,7 +1052,7 @@ func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest") _, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest")
@@ -1063,7 +1063,7 @@ func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateUser(&user) ruser, _ := th.App.CreateUser(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user team_admin") _, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user team_admin")
@@ -1074,7 +1074,7 @@ func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.CreateRole(&model.Role{Name: "custom", DisplayName: "custom", Description: "custom"}) _, err = th.App.CreateRole(&model.Role{Name: "custom", DisplayName: "custom", Description: "custom"})
@@ -1088,7 +1088,7 @@ func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""} user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
ruser, _ := th.App.CreateGuest(&user) ruser, _ := th.App.CreateGuest(&user)
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "") _, _, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
require.Nil(t, err) require.Nil(t, err)
_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest team_user") _, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest team_user")

Просмотреть файл

@@ -96,7 +96,7 @@ func (a *App) CreateUserWithToken(user *model.User, token *model.Token) (*model.
return nil, err return nil, err
} }
if err := a.JoinUserToTeam(team, ruser, ""); err != nil { if _, err := a.JoinUserToTeam(team, ruser, ""); err != nil {
return nil, err return nil, err
} }
@@ -149,7 +149,7 @@ func (a *App) CreateUserWithInviteId(user *model.User, inviteId, redirect string
return nil, err return nil, err
} }
if err := a.JoinUserToTeam(team, ruser, ""); err != nil { if _, err := a.JoinUserToTeam(team, ruser, ""); err != nil {
return nil, err return nil, err
} }

Просмотреть файл

@@ -243,7 +243,7 @@ func addUserToTeam(a *app.App, team *model.Team, user *model.User, userArg strin
CommandPrintErrorln("Can't find user '" + userArg + "'") CommandPrintErrorln("Can't find user '" + userArg + "'")
return return
} }
if err := a.JoinUserToTeam(team, user, ""); err != nil { if _, err := a.JoinUserToTeam(team, user, ""); err != nil {
CommandPrintErrorln("Unable to add '" + userArg + "' to " + team.Name) CommandPrintErrorln("Unable to add '" + userArg + "' to " + team.Name)
return return
} }

Просмотреть файл

@@ -206,7 +206,7 @@ func (th *TestHelper) CreatePost(channel *model.Channel) *model.Post {
func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) { func (th *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
utils.DisableDebugLogForTest() utils.DisableDebugLogForTest()
err := th.App.JoinUserToTeam(team, user, "") _, err := th.App.JoinUserToTeam(team, user, "")
if err != nil { if err != nil {
panic(err) panic(err)
} }

Просмотреть файл

@@ -84,7 +84,7 @@ type slackComment struct {
type Actions struct { type Actions struct {
UpdateActive func(*model.User, bool) (*model.User, *model.AppError) UpdateActive func(*model.User, bool) (*model.User, *model.AppError)
AddUserToChannel func(*model.User, *model.Channel) (*model.ChannelMember, *model.AppError) AddUserToChannel func(*model.User, *model.Channel) (*model.ChannelMember, *model.AppError)
JoinUserToTeam func(*model.Team, *model.User, string) *model.AppError JoinUserToTeam func(*model.Team, *model.User, string) (*model.TeamMember, *model.AppError)
CreateDirectChannel func(string, string, ...model.ChannelOption) (*model.Channel, *model.AppError) CreateDirectChannel func(string, string, ...model.ChannelOption) (*model.Channel, *model.AppError)
CreateGroupChannel func([]string) (*model.Channel, *model.AppError) CreateGroupChannel func([]string) (*model.Channel, *model.AppError)
CreateChannel func(*model.Channel, bool) (*model.Channel, *model.AppError) CreateChannel func(*model.Channel, bool) (*model.Channel, *model.AppError)
@@ -234,7 +234,7 @@ func (si *SlackImporter) slackAddUsers(teamId string, slackusers []slackUser, im
// Check for email conflict and use existing user if found // Check for email conflict and use existing user if found
if existingUser, err := si.store.User().GetByEmail(email); err == nil { if existingUser, err := si.store.User().GetByEmail(email); err == nil {
addedUsers[sUser.Id] = existingUser addedUsers[sUser.Id] = existingUser
if err := si.actions.JoinUserToTeam(team, addedUsers[sUser.Id], ""); err != nil { if _, err := si.actions.JoinUserToTeam(team, addedUsers[sUser.Id], ""); err != nil {
importerLog.WriteString(i18n.T("api.slackimport.slack_add_users.merge_existing_failed", map[string]interface{}{"Email": existingUser.Email, "Username": existingUser.Username})) importerLog.WriteString(i18n.T("api.slackimport.slack_add_users.merge_existing_failed", map[string]interface{}{"Email": existingUser.Email, "Username": existingUser.Username}))
} else { } else {
importerLog.WriteString(i18n.T("api.slackimport.slack_add_users.merge_existing", map[string]interface{}{"Email": existingUser.Email, "Username": existingUser.Username})) importerLog.WriteString(i18n.T("api.slackimport.slack_add_users.merge_existing", map[string]interface{}{"Email": existingUser.Email, "Username": existingUser.Username}))
@@ -695,7 +695,7 @@ func (si *SlackImporter) oldImportUser(team *model.Team, user *model.User) *mode
mlog.Warn("Failed to set email verified.", mlog.Err(err)) mlog.Warn("Failed to set email verified.", mlog.Err(err))
} }
if err := si.actions.JoinUserToTeam(team, user, ""); err != nil { if _, err := si.actions.JoinUserToTeam(team, user, ""); err != nil {
mlog.Warn("Failed to join team when importing.", mlog.Err(err)) mlog.Warn("Failed to join team when importing.", mlog.Err(err))
} }