Guest accounts feature (#11428)
* MM-14139: Creating permissions for invite/promote/demote guests (#10778) * MM-14139: Creating permissions for invite/promote/demote guests * Fixing tests * Adding invite guest api endpoint (#10792) * Adding invite guest api endpoint * Adding i18n * Adding some tests * WIP * Migrating Token.Extra info to bigger size (2048) * Fixing tests * Adding client function for invite guests * Adding send guests invites tests * Renaming file from guest to guest_invite * Adding Promote/Demote users from/to guest endpoints (#10791) * Adding Promote/Demote users from/to guest endpoints * Adding i18n translations * Adding the client functions * Using getQueryBuilder function * Addressing PR review comments * Adding default channels to users on promte from guest (#10851) * Adding default channels to users on promte from guest * Addressing PR review comments * Fixing merge problems * Sending websockets events on promote/demote (#11403) * Sending websockets events on promote/demote * Fixing merge problems * Fixing govet shadowing problem * Fixing feature branch tests * Avoiding leaking users data through websockets for guest accounts (#11489) * Avoiding leaking users data through websockets for guest accounts * Adding tests and fixing code error * Fixing i18n * Allow to enable/disable guests and other extra config settings (#11481) * Allow to enable/disable guests and other extra config settings * Fixing tests and moving license and config validation to api level * Update api4/role_test.go Co-Authored-By: George Goldberg <george@gberg.me> * Update api4/role_test.go Co-Authored-By: George Goldberg <george@gberg.me> * Fixing typo * fixing tests * Managing correctly the guest channel leave behavior (#11578) * MM-15134: Removing guests from teams or system on leave channels if needed * WIP * No deactivating the guest user when leave the last team * Adding a couple of tests * Fixing shadow variables * Fixing tests * fixing tests * fixing shadow variables * Adding guest counts for channel stats (#11646) * Adding guest counts for channel stats * Adding tests * Fixing tests * Fixing guest domain restrictions (#11660) * Adding needed migration for the database * Fixing migration
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
fdde7c8287
Коммит
fe8a0f6485
273
app/user_test.go
273
app/user_test.go
@@ -561,7 +561,7 @@ func TestCreateUserWithToken(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: ""}
|
||||
|
||||
t.Run("invalid token", func(t *testing.T) {
|
||||
if _, err := th.App.CreateUserWithToken(&user, "123"); err == nil {
|
||||
if _, err := th.App.CreateUserWithToken(&user, &model.Token{Token: "123"}); err == nil {
|
||||
t.Fatal("Should fail on unexisting token")
|
||||
}
|
||||
})
|
||||
@@ -573,7 +573,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
)
|
||||
require.Nil(t, th.App.Srv.Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
if _, err := th.App.CreateUserWithToken(&user, token.Token); err == nil {
|
||||
if _, err := th.App.CreateUserWithToken(&user, token); err == nil {
|
||||
t.Fatal("Should fail on bad token type")
|
||||
}
|
||||
})
|
||||
@@ -583,10 +583,10 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
TOKEN_TYPE_TEAM_INVITATION,
|
||||
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "email": user.Email}),
|
||||
)
|
||||
token.CreateAt = model.GetMillis() - TEAM_INVITATION_EXPIRY_TIME - 1
|
||||
token.CreateAt = model.GetMillis() - INVITATION_EXPIRY_TIME - 1
|
||||
require.Nil(t, th.App.Srv.Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
if _, err := th.App.CreateUserWithToken(&user, token.Token); err == nil {
|
||||
if _, err := th.App.CreateUserWithToken(&user, token); err == nil {
|
||||
t.Fatal("Should fail on expired token")
|
||||
}
|
||||
})
|
||||
@@ -598,28 +598,60 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
)
|
||||
require.Nil(t, th.App.Srv.Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
if _, err := th.App.CreateUserWithToken(&user, token.Token); err == nil {
|
||||
if _, err := th.App.CreateUserWithToken(&user, token); err == nil {
|
||||
t.Fatal("Should fail on bad team id")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("valid request", func(t *testing.T) {
|
||||
t.Run("valid regular user request", func(t *testing.T) {
|
||||
invitationEmail := model.NewId() + "other-email@test.com"
|
||||
token := model.NewToken(
|
||||
TOKEN_TYPE_TEAM_INVITATION,
|
||||
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail}),
|
||||
)
|
||||
require.Nil(t, th.App.Srv.Store.Token().Save(token))
|
||||
newUser, err := th.App.CreateUserWithToken(&user, token.Token)
|
||||
newUser, err := th.App.CreateUserWithToken(&user, token)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
t.Fatal("Should add user to the team")
|
||||
}
|
||||
assert.False(t, newUser.IsGuest())
|
||||
if newUser.Email != invitationEmail {
|
||||
t.Fatal("The user email must be the invitation one")
|
||||
}
|
||||
|
||||
_, err = th.App.Srv.Store.Token().GetByToken(token.Token)
|
||||
require.NotNil(t, err, "The token must be deleted after be used")
|
||||
|
||||
members, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, newUser.Id)
|
||||
require.Nil(t, err)
|
||||
assert.Len(t, *members, 2)
|
||||
})
|
||||
|
||||
t.Run("valid guest request", func(t *testing.T) {
|
||||
invitationEmail := model.NewId() + "other-email@test.com"
|
||||
token := model.NewToken(
|
||||
TOKEN_TYPE_GUEST_INVITATION,
|
||||
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail, "channels": th.BasicChannel.Id}),
|
||||
)
|
||||
require.Nil(t, th.App.Srv.Store.Token().Save(token))
|
||||
guest := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||
newGuest, err := th.App.CreateUserWithToken(&guest, token)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
t.Fatal("Should add user to the team")
|
||||
}
|
||||
assert.True(t, newGuest.IsGuest())
|
||||
if newGuest.Email != invitationEmail {
|
||||
t.Fatal("The user email must be the invitation one")
|
||||
}
|
||||
_, err = th.App.Srv.Store.Token().GetByToken(token.Token)
|
||||
require.NotNil(t, err, "The token must be deleted after be used")
|
||||
|
||||
members, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, newGuest.Id)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, *members, 1)
|
||||
assert.Equal(t, (*members)[0].ChannelId, th.BasicChannel.Id)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -870,10 +902,6 @@ func TestGetViewUsersRestrictionsForTeam(t *testing.T) {
|
||||
|
||||
team2channel1 := th.CreateChannel(team2)
|
||||
th.CreateChannel(team2) // Another channel
|
||||
team2offtopic, err := th.App.GetChannelByName("off-topic", team2.Id, false)
|
||||
require.Nil(t, err)
|
||||
team2townsquare, err := th.App.GetChannelByName("town-square", team2.Id, false)
|
||||
require.Nil(t, err)
|
||||
|
||||
th.App.AddUserToChannel(user1, team1channel1)
|
||||
th.App.AddUserToChannel(user1, team1channel2)
|
||||
@@ -929,6 +957,227 @@ func TestGetViewUsersRestrictionsForTeam(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
|
||||
assert.NotNil(t, restrictions)
|
||||
assert.ElementsMatch(t, []string{team1townsquare.Id, team1offtopic.Id, team1channel1.Id, team1channel2.Id, team2townsquare.Id, team2offtopic.Id, team2channel1.Id}, restrictions)
|
||||
assert.ElementsMatch(t, []string{team1townsquare.Id, team1offtopic.Id, team1channel1.Id, team1channel2.Id}, restrictions)
|
||||
})
|
||||
}
|
||||
|
||||
func TestPromoteGuestToUser(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
t.Run("Must fail with regular user", func(t *testing.T) {
|
||||
require.Equal(t, "system_user", th.BasicUser.Roles)
|
||||
err := th.App.PromoteGuestToUser(th.BasicUser, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
user, err := th.App.GetUser(th.BasicUser.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_user", user.Roles)
|
||||
})
|
||||
|
||||
t.Run("Must work with guest user without teams or channels", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
|
||||
err := th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_user", guest.Roles)
|
||||
})
|
||||
|
||||
t.Run("Must work with guest user with teams but no channels", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
th.LinkUserToTeam(guest, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeGuest)
|
||||
require.False(t, teamMember.SchemeUser)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_user", guest.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
})
|
||||
|
||||
t.Run("Must work with guest user with teams and channels", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
th.LinkUserToTeam(guest, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeGuest)
|
||||
require.False(t, teamMember.SchemeUser)
|
||||
|
||||
channelMember := th.AddUserToChannel(guest, th.BasicChannel)
|
||||
require.True(t, channelMember.SchemeGuest)
|
||||
require.False(t, channelMember.SchemeUser)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_user", guest.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
channelMember, err = th.App.GetChannelMember(th.BasicChannel.Id, guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
})
|
||||
|
||||
t.Run("Must add the default channels", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
th.LinkUserToTeam(guest, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeGuest)
|
||||
require.False(t, teamMember.SchemeUser)
|
||||
|
||||
channelMember := th.AddUserToChannel(guest, th.BasicChannel)
|
||||
require.True(t, channelMember.SchemeGuest)
|
||||
require.False(t, channelMember.SchemeUser)
|
||||
|
||||
channelMembers, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, guest.Id)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, *channelMembers, 1)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_user", guest.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
channelMember, err = th.App.GetChannelMember(th.BasicChannel.Id, guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
|
||||
channelMembers, err = th.App.GetChannelMembersForUser(th.BasicTeam.Id, guest.Id)
|
||||
require.Nil(t, err)
|
||||
assert.Len(t, *channelMembers, 3)
|
||||
})
|
||||
}
|
||||
|
||||
func TestDemoteUserToGuest(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
t.Run("Must fail with guest user", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
err := th.App.DemoteUserToGuest(guest)
|
||||
require.Nil(t, err)
|
||||
|
||||
user, err := th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_guest", user.Roles)
|
||||
})
|
||||
|
||||
t.Run("Must work with user without teams or channels", func(t *testing.T) {
|
||||
user := th.CreateUser()
|
||||
require.Equal(t, "system_user", user.Roles)
|
||||
|
||||
err := th.App.DemoteUserToGuest(user)
|
||||
require.Nil(t, err)
|
||||
user, err = th.App.GetUser(user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_guest", user.Roles)
|
||||
})
|
||||
|
||||
t.Run("Must work with user with teams but no channels", func(t *testing.T) {
|
||||
user := th.CreateUser()
|
||||
require.Equal(t, "system_user", user.Roles)
|
||||
th.LinkUserToTeam(user, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeUser)
|
||||
require.False(t, teamMember.SchemeGuest)
|
||||
|
||||
err = th.App.DemoteUserToGuest(user)
|
||||
require.Nil(t, err)
|
||||
user, err = th.App.GetUser(user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_guest", user.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeUser)
|
||||
assert.True(t, teamMember.SchemeGuest)
|
||||
})
|
||||
|
||||
t.Run("Must work with user user with teams and channels", func(t *testing.T) {
|
||||
user := th.CreateUser()
|
||||
require.Equal(t, "system_user", user.Roles)
|
||||
th.LinkUserToTeam(user, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeUser)
|
||||
require.False(t, teamMember.SchemeGuest)
|
||||
|
||||
channelMember := th.AddUserToChannel(user, th.BasicChannel)
|
||||
require.True(t, channelMember.SchemeUser)
|
||||
require.False(t, channelMember.SchemeGuest)
|
||||
|
||||
err = th.App.DemoteUserToGuest(user)
|
||||
require.Nil(t, err)
|
||||
user, err = th.App.GetUser(user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_guest", user.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeUser)
|
||||
assert.True(t, teamMember.SchemeGuest)
|
||||
channelMember, err = th.App.GetChannelMember(th.BasicChannel.Id, user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeUser)
|
||||
assert.True(t, teamMember.SchemeGuest)
|
||||
})
|
||||
|
||||
t.Run("Must respect the current channels not removing defaults", func(t *testing.T) {
|
||||
user := th.CreateUser()
|
||||
require.Equal(t, "system_user", user.Roles)
|
||||
th.LinkUserToTeam(user, th.BasicTeam)
|
||||
teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
require.True(t, teamMember.SchemeUser)
|
||||
require.False(t, teamMember.SchemeGuest)
|
||||
|
||||
channelMember := th.AddUserToChannel(user, th.BasicChannel)
|
||||
require.True(t, channelMember.SchemeUser)
|
||||
require.False(t, channelMember.SchemeGuest)
|
||||
|
||||
channelMembers, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, *channelMembers, 3)
|
||||
|
||||
err = th.App.DemoteUserToGuest(user)
|
||||
require.Nil(t, err)
|
||||
user, err = th.App.GetUser(user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "system_guest", user.Roles)
|
||||
teamMember, err = th.App.GetTeamMember(th.BasicTeam.Id, user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeUser)
|
||||
assert.True(t, teamMember.SchemeGuest)
|
||||
channelMember, err = th.App.GetChannelMember(th.BasicChannel.Id, user.Id)
|
||||
assert.Nil(t, err)
|
||||
assert.False(t, teamMember.SchemeUser)
|
||||
assert.True(t, teamMember.SchemeGuest)
|
||||
|
||||
channelMembers, err = th.App.GetChannelMembersForUser(th.BasicTeam.Id, user.Id)
|
||||
require.Nil(t, err)
|
||||
assert.Len(t, *channelMembers, 3)
|
||||
})
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user