MM-15021: Adding new builtin system schema for Guests (#10601)
* MM-15021: Adding new builtin system schema for Guests * Fixing tests * Setting properly the permissions * Adding guests to sampledata * Restrict more roles updates in the app layer for guests * Adding comment to explain that permissions migration must go at the end * Setting the default guest role for custom scheme during migration * Fixing import and export * Creating scheme guest roles on migration * Fixing tests * Fixing tests * Fixing tests
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
987360f325
Коммит
584ec68755
@@ -71,7 +71,8 @@ func (a *App) JoinDefaultChannels(teamId string, user *model.User, shouldBeAdmin
|
||||
cm := &model.ChannelMember{
|
||||
ChannelId: channel.Id,
|
||||
UserId: user.Id,
|
||||
SchemeUser: true,
|
||||
SchemeGuest: user.IsGuest(),
|
||||
SchemeUser: !user.IsGuest(),
|
||||
SchemeAdmin: shouldBeAdmin,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
}
|
||||
@@ -213,10 +214,16 @@ func (a *App) CreateChannel(channel *model.Channel, addMember bool) (*model.Chan
|
||||
sc := result.Data.(*model.Channel)
|
||||
|
||||
if addMember {
|
||||
user, err := a.Srv.Store.User().Get(channel.CreatorId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cm := &model.ChannelMember{
|
||||
ChannelId: sc.Id,
|
||||
UserId: channel.CreatorId,
|
||||
SchemeUser: true,
|
||||
UserId: user.Id,
|
||||
SchemeGuest: user.IsGuest(),
|
||||
SchemeUser: !user.IsGuest(),
|
||||
SchemeAdmin: true,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
}
|
||||
@@ -450,7 +457,8 @@ func (a *App) createGroupChannel(userIds []string, creatorId string) (*model.Cha
|
||||
UserId: user.Id,
|
||||
ChannelId: group.Id,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
SchemeUser: true,
|
||||
SchemeGuest: user.IsGuest(),
|
||||
SchemeUser: !user.IsGuest(),
|
||||
}
|
||||
|
||||
if result := <-a.Srv.Store.Channel().SaveMember(cm); result.Err != nil {
|
||||
@@ -616,35 +624,35 @@ func (a *App) PatchChannel(channel *model.Channel, patch *model.ChannelPatch, us
|
||||
return channel, nil
|
||||
}
|
||||
|
||||
func (a *App) GetSchemeRolesForChannel(channelId string) (string, string, *model.AppError) {
|
||||
func (a *App) GetSchemeRolesForChannel(channelId string) (string, string, string, *model.AppError) {
|
||||
channel, err := a.GetChannel(channelId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
|
||||
if channel.SchemeId != nil && len(*channel.SchemeId) != 0 {
|
||||
var scheme *model.Scheme
|
||||
scheme, err = a.GetScheme(*channel.SchemeId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
return scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, nil
|
||||
return scheme.DefaultChannelGuestRole, scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, nil
|
||||
}
|
||||
|
||||
team, err := a.GetTeam(channel.TeamId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
|
||||
if team.SchemeId != nil && len(*team.SchemeId) != 0 {
|
||||
scheme, err := a.GetScheme(*team.SchemeId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
return scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, nil
|
||||
return scheme.DefaultChannelGuestRole, scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, nil
|
||||
}
|
||||
|
||||
return model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID, nil
|
||||
return model.CHANNEL_GUEST_ROLE_ID, model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID, nil
|
||||
}
|
||||
|
||||
func (a *App) UpdateChannelMemberRoles(channelId string, userId string, newRoles string) (*model.ChannelMember, *model.AppError) {
|
||||
@@ -654,12 +662,15 @@ func (a *App) UpdateChannelMemberRoles(channelId string, userId string, newRoles
|
||||
return nil, err
|
||||
}
|
||||
|
||||
schemeUserRole, schemeAdminRole, err := a.GetSchemeRolesForChannel(channelId)
|
||||
schemeGuestRole, schemeUserRole, schemeAdminRole, err := a.GetSchemeRolesForChannel(channelId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
prevSchemeGuestValue := member.SchemeGuest
|
||||
|
||||
var newExplicitRoles []string
|
||||
member.SchemeGuest = false
|
||||
member.SchemeUser = false
|
||||
member.SchemeAdmin = false
|
||||
|
||||
@@ -680,6 +691,8 @@ func (a *App) UpdateChannelMemberRoles(channelId string, userId string, newRoles
|
||||
member.SchemeAdmin = true
|
||||
case schemeUserRole:
|
||||
member.SchemeUser = true
|
||||
case schemeGuestRole:
|
||||
member.SchemeGuest = true
|
||||
default:
|
||||
// If not part of the scheme for this channel, then it is not allowed to apply it as an explicit role.
|
||||
return nil, model.NewAppError("UpdateChannelMemberRoles", "api.channel.update_channel_member_roles.scheme_role.app_error", nil, "role_name="+roleName, http.StatusBadRequest)
|
||||
@@ -687,6 +700,14 @@ func (a *App) UpdateChannelMemberRoles(channelId string, userId string, newRoles
|
||||
}
|
||||
}
|
||||
|
||||
if member.SchemeUser && member.SchemeGuest {
|
||||
return nil, model.NewAppError("UpdateChannelMemberRoles", "api.channel.update_channel_member_roles.guest_and_user.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if prevSchemeGuestValue != member.SchemeGuest {
|
||||
return nil, model.NewAppError("UpdateChannelMemberRoles", "api.channel.update_channel_member_roles.changing_guest_role.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
member.ExplicitRoles = strings.Join(newExplicitRoles, " ")
|
||||
|
||||
result := <-a.Srv.Store.Channel().UpdateMember(member)
|
||||
@@ -699,7 +720,7 @@ func (a *App) UpdateChannelMemberRoles(channelId string, userId string, newRoles
|
||||
return member, nil
|
||||
}
|
||||
|
||||
func (a *App) UpdateChannelMemberSchemeRoles(channelId string, userId string, isSchemeUser bool, isSchemeAdmin bool) (*model.ChannelMember, *model.AppError) {
|
||||
func (a *App) UpdateChannelMemberSchemeRoles(channelId string, userId string, isSchemeGuest bool, isSchemeUser bool, isSchemeAdmin bool) (*model.ChannelMember, *model.AppError) {
|
||||
member, err := a.GetChannelMember(channelId, userId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -707,10 +728,15 @@ func (a *App) UpdateChannelMemberSchemeRoles(channelId string, userId string, is
|
||||
|
||||
member.SchemeAdmin = isSchemeAdmin
|
||||
member.SchemeUser = isSchemeUser
|
||||
member.SchemeGuest = isSchemeGuest
|
||||
|
||||
if member.SchemeUser && member.SchemeGuest {
|
||||
return nil, model.NewAppError("UpdateChannelMemberSchemeRoles", "api.channel.update_channel_member_roles.guest_and_user.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
// If the migration is not completed, we also need to check the default channel_admin/channel_user roles are not present in the roles field.
|
||||
if err = a.IsPhase2MigrationCompleted(); err != nil {
|
||||
member.ExplicitRoles = RemoveRoles([]string{model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID}, member.ExplicitRoles)
|
||||
member.ExplicitRoles = RemoveRoles([]string{model.CHANNEL_GUEST_ROLE_ID, model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID}, member.ExplicitRoles)
|
||||
}
|
||||
|
||||
result := <-a.Srv.Store.Channel().UpdateMember(member)
|
||||
@@ -871,7 +897,8 @@ func (a *App) addUserToChannel(user *model.User, channel *model.Channel, teamMem
|
||||
ChannelId: channel.Id,
|
||||
UserId: user.Id,
|
||||
NotifyProps: model.GetDefaultChannelNotifyProps(),
|
||||
SchemeUser: true,
|
||||
SchemeGuest: user.IsGuest(),
|
||||
SchemeUser: !user.IsGuest(),
|
||||
}
|
||||
if result := <-a.Srv.Store.Channel().SaveMember(newMember); result.Err != nil {
|
||||
mlog.Error(fmt.Sprintf("Failed to add member user_id=%v channel_id=%v err=%v", user.Id, channel.Id, result.Err), mlog.String("user_id", user.Id))
|
||||
|
||||
@@ -812,3 +812,86 @@ func TestGetPublicChannelsForTeam(t *testing.T) {
|
||||
channels := append(*channelList, *channelList2...)
|
||||
assert.ElementsMatch(t, expectedChannels, channels)
|
||||
}
|
||||
|
||||
func TestUpdateChannelMemberRolesChangingGuest(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
t.Run("from guest to user", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateChannelMemberRoles(th.BasicChannel.Id, ruser.Id, "channel_user"); err == nil {
|
||||
t.Fatal("Should fail when try to modify the guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from user to guest", func(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: ""}
|
||||
ruser, _ := th.App.CreateUser(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateChannelMemberRoles(th.BasicChannel.Id, ruser.Id, "channel_guest"); err == nil {
|
||||
t.Fatal("Should fail when try to modify the guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from user to admin", func(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: ""}
|
||||
ruser, _ := th.App.CreateUser(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateChannelMemberRoles(th.BasicChannel.Id, ruser.Id, "channel_user channel_admin"); err != nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from guest to guest plus custom", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.CreateRole(&model.Role{Name: "custom", DisplayName: "custom", Description: "custom"})
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateChannelMemberRoles(th.BasicChannel.Id, ruser.Id, "channel_guest custom"); err != nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("a guest cant have user role", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.AddUserToChannel(ruser, th.BasicChannel)
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateChannelMemberRoles(th.BasicChannel.Id, ruser.Id, "channel_guest channel_user"); err == nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -739,6 +739,11 @@ func (a *App) trackPermissions() {
|
||||
teamUserPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
teamGuestPermissions := ""
|
||||
if role, err := a.GetRoleByName(model.TEAM_GUEST_ROLE_ID); err == nil {
|
||||
teamGuestPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
channelAdminPermissions := ""
|
||||
if role, err := a.GetRoleByName(model.CHANNEL_ADMIN_ROLE_ID); err == nil {
|
||||
channelAdminPermissions = strings.Join(role.Permissions, " ")
|
||||
@@ -746,7 +751,12 @@ func (a *App) trackPermissions() {
|
||||
|
||||
channelUserPermissions := ""
|
||||
if role, err := a.GetRoleByName(model.CHANNEL_USER_ROLE_ID); err == nil {
|
||||
systemAdminPermissions = strings.Join(role.Permissions, " ")
|
||||
channelUserPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
channelGuestPermissions := ""
|
||||
if role, err := a.GetRoleByName(model.CHANNEL_GUEST_ROLE_ID); err == nil {
|
||||
channelGuestPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
a.SendDiagnostic(TRACK_PERMISSIONS_SYSTEM_SCHEME, map[string]interface{}{
|
||||
@@ -754,8 +764,10 @@ func (a *App) trackPermissions() {
|
||||
"system_user_permissions": systemUserPermissions,
|
||||
"team_admin_permissions": teamAdminPermissions,
|
||||
"team_user_permissions": teamUserPermissions,
|
||||
"team_guest_permissions": teamGuestPermissions,
|
||||
"channel_admin_permissions": channelAdminPermissions,
|
||||
"channel_user_permissions": channelUserPermissions,
|
||||
"channel_guest_permissions": channelGuestPermissions,
|
||||
})
|
||||
|
||||
if schemes, err := a.GetSchemes(model.SCHEME_SCOPE_TEAM, 0, 100); err == nil {
|
||||
@@ -770,6 +782,11 @@ func (a *App) trackPermissions() {
|
||||
teamUserPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
teamGuestPermissions := ""
|
||||
if role, err := a.GetRoleByName(scheme.DefaultTeamGuestRole); err == nil {
|
||||
teamGuestPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
channelAdminPermissions := ""
|
||||
if role, err := a.GetRoleByName(scheme.DefaultChannelAdminRole); err == nil {
|
||||
channelAdminPermissions = strings.Join(role.Permissions, " ")
|
||||
@@ -777,7 +794,12 @@ func (a *App) trackPermissions() {
|
||||
|
||||
channelUserPermissions := ""
|
||||
if role, err := a.GetRoleByName(scheme.DefaultChannelUserRole); err == nil {
|
||||
systemAdminPermissions = strings.Join(role.Permissions, " ")
|
||||
channelUserPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
channelGuestPermissions := ""
|
||||
if role, err := a.GetRoleByName(scheme.DefaultChannelGuestRole); err == nil {
|
||||
channelGuestPermissions = strings.Join(role.Permissions, " ")
|
||||
}
|
||||
|
||||
var count int64 = 0
|
||||
@@ -789,8 +811,10 @@ func (a *App) trackPermissions() {
|
||||
"scheme_id": scheme.Id,
|
||||
"team_admin_permissions": teamAdminPermissions,
|
||||
"team_user_permissions": teamUserPermissions,
|
||||
"team_guest_permissions": teamGuestPermissions,
|
||||
"channel_admin_permissions": channelAdminPermissions,
|
||||
"channel_user_permissions": channelUserPermissions,
|
||||
"channel_guest_permissions": channelGuestPermissions,
|
||||
"team_count": count,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -91,6 +91,9 @@ func ImportUserTeamDataFromTeamMember(member *model.TeamMemberForExport) *UserTe
|
||||
if member.SchemeUser {
|
||||
rolesList = append(rolesList, model.TEAM_USER_ROLE_ID)
|
||||
}
|
||||
if member.SchemeGuest {
|
||||
rolesList = append(rolesList, model.TEAM_GUEST_ROLE_ID)
|
||||
}
|
||||
roles := strings.Join(rolesList, " ")
|
||||
return &UserTeamImportData{
|
||||
Name: &member.TeamName,
|
||||
@@ -106,6 +109,9 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM
|
||||
if member.SchemeUser {
|
||||
rolesList = append(rolesList, model.CHANNEL_USER_ROLE_ID)
|
||||
}
|
||||
if member.SchemeGuest {
|
||||
rolesList = append(rolesList, model.CHANNEL_GUEST_ROLE_ID)
|
||||
}
|
||||
props := member.NotifyProps
|
||||
notifyProps := UserChannelNotifyPropsImportData{}
|
||||
|
||||
|
||||
@@ -144,6 +144,14 @@ func (me *TestHelper) CreateTeam() *model.Team {
|
||||
}
|
||||
|
||||
func (me *TestHelper) CreateUser() *model.User {
|
||||
return me.CreateUserOrGuest(false)
|
||||
}
|
||||
|
||||
func (me *TestHelper) CreateGuest() *model.User {
|
||||
return me.CreateUserOrGuest(true)
|
||||
}
|
||||
|
||||
func (me *TestHelper) CreateUserOrGuest(guest bool) *model.User {
|
||||
id := model.NewId()
|
||||
|
||||
user := &model.User{
|
||||
@@ -156,11 +164,20 @@ func (me *TestHelper) CreateUser() *model.User {
|
||||
|
||||
utils.DisableDebugLogForTest()
|
||||
var err *model.AppError
|
||||
if user, err = me.App.CreateUser(user); err != nil {
|
||||
mlog.Error(err.Error())
|
||||
if guest {
|
||||
if user, err = me.App.CreateGuest(user); err != nil {
|
||||
mlog.Error(err.Error())
|
||||
|
||||
time.Sleep(time.Second)
|
||||
panic(err)
|
||||
time.Sleep(time.Second)
|
||||
panic(err)
|
||||
}
|
||||
} else {
|
||||
if user, err = me.App.CreateUser(user); err != nil {
|
||||
mlog.Error(err.Error())
|
||||
|
||||
time.Sleep(time.Second)
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
utils.EnableDebugLogForTest()
|
||||
return user
|
||||
@@ -316,8 +333,10 @@ func (me *TestHelper) CreateScheme() (*model.Scheme, []*model.Role) {
|
||||
roleNames := []string{
|
||||
scheme.DefaultTeamAdminRole,
|
||||
scheme.DefaultTeamUserRole,
|
||||
scheme.DefaultTeamGuestRole,
|
||||
scheme.DefaultChannelAdminRole,
|
||||
scheme.DefaultChannelUserRole,
|
||||
scheme.DefaultChannelGuestRole,
|
||||
}
|
||||
|
||||
var roles []*model.Role
|
||||
|
||||
@@ -68,6 +68,16 @@ func (a *App) ImportScheme(data *SchemeImportData, dryRun bool) *model.AppError
|
||||
if err := a.ImportRole(data.DefaultTeamUserRole, dryRun, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if data.DefaultTeamGuestRole == nil {
|
||||
data.DefaultTeamGuestRole = &RoleImportData{
|
||||
DisplayName: model.NewString("Team Guest Role for Scheme"),
|
||||
}
|
||||
}
|
||||
data.DefaultTeamGuestRole.Name = &scheme.DefaultTeamGuestRole
|
||||
if err := a.ImportRole(data.DefaultTeamGuestRole, dryRun, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if scheme.Scope == model.SCHEME_SCOPE_TEAM || scheme.Scope == model.SCHEME_SCOPE_CHANNEL {
|
||||
@@ -80,6 +90,16 @@ func (a *App) ImportScheme(data *SchemeImportData, dryRun bool) *model.AppError
|
||||
if err := a.ImportRole(data.DefaultChannelUserRole, dryRun, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if data.DefaultChannelGuestRole == nil {
|
||||
data.DefaultChannelGuestRole = &RoleImportData{
|
||||
DisplayName: model.NewString("Channel Guest Role for Scheme"),
|
||||
}
|
||||
}
|
||||
data.DefaultChannelGuestRole.Name = &scheme.DefaultChannelGuestRole
|
||||
if err := a.ImportRole(data.DefaultChannelGuestRole, dryRun, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -647,6 +667,7 @@ func (a *App) ImportUserTeams(user *model.User, data *[]UserTeamImportData) *mod
|
||||
}
|
||||
|
||||
var roles string
|
||||
isSchemeGuest := false
|
||||
isSchemeUser := true
|
||||
isSchemeAdmin := false
|
||||
|
||||
@@ -656,7 +677,10 @@ func (a *App) ImportUserTeams(user *model.User, data *[]UserTeamImportData) *mod
|
||||
rawRoles := *tdata.Roles
|
||||
explicitRoles := []string{}
|
||||
for _, role := range strings.Fields(rawRoles) {
|
||||
if role == model.TEAM_USER_ROLE_ID {
|
||||
if role == model.TEAM_GUEST_ROLE_ID {
|
||||
isSchemeGuest = true
|
||||
isSchemeUser = false
|
||||
} else if role == model.TEAM_USER_ROLE_ID {
|
||||
isSchemeUser = true
|
||||
} else if role == model.TEAM_ADMIN_ROLE_ID {
|
||||
isSchemeAdmin = true
|
||||
@@ -678,8 +702,8 @@ func (a *App) ImportUserTeams(user *model.User, data *[]UserTeamImportData) *mod
|
||||
}
|
||||
}
|
||||
|
||||
if member.SchemeAdmin != isSchemeAdmin || member.SchemeUser != isSchemeUser {
|
||||
a.UpdateTeamMemberSchemeRoles(team.Id, user.Id, isSchemeUser, isSchemeAdmin)
|
||||
if member.SchemeAdmin != isSchemeAdmin || member.SchemeUser != isSchemeUser || member.SchemeGuest != isSchemeGuest {
|
||||
a.UpdateTeamMemberSchemeRoles(team.Id, user.Id, isSchemeGuest, isSchemeUser, isSchemeAdmin)
|
||||
}
|
||||
|
||||
defaultChannel, err := a.GetChannelByName(model.DEFAULT_CHANNEL, team.Id, true)
|
||||
@@ -720,6 +744,7 @@ func (a *App) ImportUserChannels(user *model.User, team *model.Team, teamMember
|
||||
}
|
||||
|
||||
var roles string
|
||||
isSchemeGuest := false
|
||||
isSchemeUser := true
|
||||
isSchemeAdmin := false
|
||||
|
||||
@@ -729,7 +754,10 @@ func (a *App) ImportUserChannels(user *model.User, team *model.Team, teamMember
|
||||
rawRoles := *cdata.Roles
|
||||
explicitRoles := []string{}
|
||||
for _, role := range strings.Fields(rawRoles) {
|
||||
if role == model.CHANNEL_USER_ROLE_ID {
|
||||
if role == model.CHANNEL_GUEST_ROLE_ID {
|
||||
isSchemeGuest = true
|
||||
isSchemeUser = false
|
||||
} else if role == model.CHANNEL_USER_ROLE_ID {
|
||||
isSchemeUser = true
|
||||
} else if role == model.CHANNEL_ADMIN_ROLE_ID {
|
||||
isSchemeAdmin = true
|
||||
@@ -755,8 +783,8 @@ func (a *App) ImportUserChannels(user *model.User, team *model.Team, teamMember
|
||||
}
|
||||
}
|
||||
|
||||
if member.SchemeAdmin != isSchemeAdmin || member.SchemeUser != isSchemeUser {
|
||||
a.UpdateChannelMemberSchemeRoles(channel.Id, user.Id, isSchemeUser, isSchemeAdmin)
|
||||
if member.SchemeAdmin != isSchemeAdmin || member.SchemeUser != isSchemeUser || member.SchemeGuest != isSchemeGuest {
|
||||
a.UpdateChannelMemberSchemeRoles(channel.Id, user.Id, isSchemeGuest, isSchemeUser, isSchemeAdmin)
|
||||
}
|
||||
|
||||
if cdata.NotifyProps != nil {
|
||||
|
||||
@@ -28,6 +28,239 @@ func TestImportImportScheme(t *testing.T) {
|
||||
<-th.App.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2)
|
||||
}()
|
||||
|
||||
// Try importing an invalid scheme in dryRun mode.
|
||||
data := SchemeImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
Scope: ptrStr("team"),
|
||||
DefaultTeamGuestRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultTeamUserRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultTeamAdminRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultChannelGuestRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultChannelUserRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultChannelAdminRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
Description: ptrStr("description"),
|
||||
}
|
||||
|
||||
if err := th.App.ImportScheme(&data, true); err == nil {
|
||||
t.Fatalf("Should have failed to import.")
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
|
||||
t.Fatalf("Scheme should not have imported.")
|
||||
}
|
||||
|
||||
// Try importing a valid scheme in dryRun mode.
|
||||
data.DisplayName = ptrStr("display name")
|
||||
|
||||
if err := th.App.ImportScheme(&data, true); err != nil {
|
||||
t.Fatalf("Should have succeeded.")
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
|
||||
t.Fatalf("Scheme should not have imported.")
|
||||
}
|
||||
|
||||
// Try importing an invalid scheme.
|
||||
data.DisplayName = nil
|
||||
|
||||
if err := th.App.ImportScheme(&data, false); err == nil {
|
||||
t.Fatalf("Should have failed to import.")
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
|
||||
t.Fatalf("Scheme should not have imported.")
|
||||
}
|
||||
|
||||
// Try importing a valid scheme with all params set.
|
||||
data.DisplayName = ptrStr("display name")
|
||||
|
||||
if err := th.App.ImportScheme(&data, false); err != nil {
|
||||
t.Fatalf("Should have succeeded.")
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
|
||||
t.Fatalf("Failed to import scheme: %v", res.Err)
|
||||
} else {
|
||||
scheme := res.Data.(*model.Scheme)
|
||||
assert.Equal(t, *data.Name, scheme.Name)
|
||||
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
|
||||
assert.Equal(t, *data.Description, scheme.Description)
|
||||
assert.Equal(t, *data.Scope, scheme.Scope)
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamAdminRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamUserRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamUserRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelAdminRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelUserRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelUserRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
}
|
||||
|
||||
// Try modifying all the fields and re-importing.
|
||||
data.DisplayName = ptrStr("new display name")
|
||||
data.Description = ptrStr("new description")
|
||||
|
||||
if err := th.App.ImportScheme(&data, false); err != nil {
|
||||
t.Fatalf("Should have succeeded: %v", err)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
|
||||
t.Fatalf("Failed to import scheme: %v", res.Err)
|
||||
} else {
|
||||
scheme := res.Data.(*model.Scheme)
|
||||
assert.Equal(t, *data.Name, scheme.Name)
|
||||
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
|
||||
assert.Equal(t, *data.Description, scheme.Description)
|
||||
assert.Equal(t, *data.Scope, scheme.Scope)
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamAdminRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamUserRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamUserRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelAdminRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelUserRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelUserRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
}
|
||||
|
||||
// Try changing the scope of the scheme and reimporting.
|
||||
data.Scope = ptrStr("channel")
|
||||
|
||||
if err := th.App.ImportScheme(&data, false); err == nil {
|
||||
t.Fatalf("Should have failed to import.")
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
|
||||
t.Fatalf("Failed to import scheme: %v", res.Err)
|
||||
} else {
|
||||
scheme := res.Data.(*model.Scheme)
|
||||
assert.Equal(t, *data.Name, scheme.Name)
|
||||
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
|
||||
assert.Equal(t, *data.Description, scheme.Description)
|
||||
assert.Equal(t, "team", scheme.Scope)
|
||||
}
|
||||
}
|
||||
|
||||
func TestImportImportSchemeWithoutGuestRoles(t *testing.T) {
|
||||
th := Setup(t)
|
||||
defer th.TearDown()
|
||||
|
||||
// Mark the phase 2 permissions migration as completed.
|
||||
<-th.App.Srv.Store.System().Save(&model.System{Name: model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2, Value: "true"})
|
||||
|
||||
defer func() {
|
||||
<-th.App.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2)
|
||||
}()
|
||||
|
||||
// Try importing an invalid scheme in dryRun mode.
|
||||
data := SchemeImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
@@ -115,6 +348,15 @@ func TestImportImportScheme(t *testing.T) {
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
@@ -132,6 +374,15 @@ func TestImportImportScheme(t *testing.T) {
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
}
|
||||
|
||||
// Try modifying all the fields and re-importing.
|
||||
@@ -169,6 +420,15 @@ func TestImportImportScheme(t *testing.T) {
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultTeamGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
@@ -186,6 +446,15 @@ func TestImportImportScheme(t *testing.T) {
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
|
||||
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelGuestRole); res.Err != nil {
|
||||
t.Fatalf("Should have found the imported role.")
|
||||
} else {
|
||||
role := res.Data.(*model.Role)
|
||||
assert.Equal(t, *data.DefaultChannelGuestRole.DisplayName, role.DisplayName)
|
||||
assert.False(t, role.BuiltIn)
|
||||
assert.True(t, role.SchemeManaged)
|
||||
}
|
||||
}
|
||||
|
||||
// Try changing the scope of the scheme and reimporting.
|
||||
@@ -1273,6 +1542,10 @@ func TestImportImportUser(t *testing.T) {
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
Scope: ptrStr("team"),
|
||||
DefaultTeamGuestRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultTeamUserRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
@@ -1281,6 +1554,10 @@ func TestImportImportUser(t *testing.T) {
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultChannelGuestRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
},
|
||||
DefaultChannelUserRole: &RoleImportData{
|
||||
Name: ptrStr(model.NewId()),
|
||||
DisplayName: ptrStr(model.NewId()),
|
||||
@@ -1363,6 +1640,7 @@ func TestImportImportUser(t *testing.T) {
|
||||
}
|
||||
assert.True(t, teamMember.SchemeAdmin)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.Equal(t, "", teamMember.ExplicitRoles)
|
||||
|
||||
channelMember, err = th.App.GetChannelMember(channel.Id, user.Id)
|
||||
@@ -1371,6 +1649,7 @@ func TestImportImportUser(t *testing.T) {
|
||||
}
|
||||
assert.True(t, channelMember.SchemeAdmin)
|
||||
assert.True(t, channelMember.SchemeUser)
|
||||
assert.False(t, channelMember.SchemeGuest)
|
||||
assert.Equal(t, "", channelMember.ExplicitRoles)
|
||||
|
||||
// Test importing deleted user with a valid team & valid channel name in apply mode.
|
||||
@@ -1406,7 +1685,9 @@ func TestImportImportUser(t *testing.T) {
|
||||
t.Fatalf("Failed to get the team member")
|
||||
}
|
||||
|
||||
assert.False(t, teamMember.SchemeAdmin)
|
||||
assert.True(t, teamMember.SchemeUser)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.Equal(t, "", teamMember.ExplicitRoles)
|
||||
|
||||
channelMember, err = th.App.GetChannelMember(channel.Id, user.Id)
|
||||
@@ -1414,9 +1695,58 @@ func TestImportImportUser(t *testing.T) {
|
||||
t.Fatalf("Failed to get the channel member")
|
||||
}
|
||||
|
||||
assert.False(t, teamMember.SchemeAdmin)
|
||||
assert.True(t, channelMember.SchemeUser)
|
||||
assert.False(t, teamMember.SchemeGuest)
|
||||
assert.Equal(t, "", channelMember.ExplicitRoles)
|
||||
|
||||
// Test importing deleted guest with a valid team & valid channel name in apply mode.
|
||||
username = model.NewId()
|
||||
deleteAt = model.GetMillis()
|
||||
deletedGuestData := &UserImportData{
|
||||
Username: &username,
|
||||
DeleteAt: &deleteAt,
|
||||
Email: ptrStr(model.NewId() + "@example.com"),
|
||||
Teams: &[]UserTeamImportData{
|
||||
{
|
||||
Name: &team.Name,
|
||||
Roles: ptrStr("team_guest"),
|
||||
Channels: &[]UserChannelImportData{
|
||||
{
|
||||
Name: &channel.Name,
|
||||
Roles: ptrStr("channel_guest"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
err = th.App.ImportUser(deletedGuestData, false)
|
||||
assert.Nil(t, err)
|
||||
|
||||
user, err = th.App.GetUserByUsername(*deletedGuestData.Username)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to get user from database.")
|
||||
}
|
||||
|
||||
teamMember, err = th.App.GetTeamMember(team.Id, user.Id)
|
||||
if err != nil {
|
||||
t.Fatalf("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, err = th.App.GetChannelMember(channel.Id, user.Id)
|
||||
if err != nil {
|
||||
t.Fatalf("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 TestImportUserDefaultNotifyProps(t *testing.T) {
|
||||
|
||||
@@ -167,8 +167,10 @@ type SchemeImportData struct {
|
||||
Scope *string `json:"scope"`
|
||||
DefaultTeamAdminRole *RoleImportData `json:"default_team_admin_role"`
|
||||
DefaultTeamUserRole *RoleImportData `json:"default_team_user_role"`
|
||||
DefaultTeamGuestRole *RoleImportData `json:"default_team_guest_role"`
|
||||
DefaultChannelAdminRole *RoleImportData `json:"default_channel_admin_role"`
|
||||
DefaultChannelUserRole *RoleImportData `json:"default_channel_user_role"`
|
||||
DefaultChannelGuestRole *RoleImportData `json:"default_channel_guest_role"`
|
||||
}
|
||||
|
||||
type RoleImportData struct {
|
||||
|
||||
@@ -56,6 +56,12 @@ func validateSchemeImportData(data *SchemeImportData) *model.AppError {
|
||||
}
|
||||
}
|
||||
|
||||
if data.DefaultTeamGuestRole != nil {
|
||||
if err := validateRoleImportData(data.DefaultTeamGuestRole); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if data.DefaultChannelAdminRole != nil {
|
||||
if err := validateRoleImportData(data.DefaultChannelAdminRole); err != nil {
|
||||
return err
|
||||
@@ -68,6 +74,12 @@ func validateSchemeImportData(data *SchemeImportData) *model.AppError {
|
||||
}
|
||||
}
|
||||
|
||||
if data.DefaultChannelGuestRole != nil {
|
||||
if err := validateRoleImportData(data.DefaultChannelGuestRole); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,11 @@ func TestImportValidateSchemeImportData(t *testing.T) {
|
||||
DisplayName: ptrStr("display name"),
|
||||
Permissions: &[]string{"invite_user"},
|
||||
},
|
||||
DefaultTeamGuestRole: &RoleImportData{
|
||||
Name: ptrStr("name"),
|
||||
DisplayName: ptrStr("display name"),
|
||||
Permissions: &[]string{"invite_user"},
|
||||
},
|
||||
DefaultChannelAdminRole: &RoleImportData{
|
||||
Name: ptrStr("name"),
|
||||
DisplayName: ptrStr("display name"),
|
||||
@@ -39,6 +44,11 @@ func TestImportValidateSchemeImportData(t *testing.T) {
|
||||
DisplayName: ptrStr("display name"),
|
||||
Permissions: &[]string{"invite_user"},
|
||||
},
|
||||
DefaultChannelGuestRole: &RoleImportData{
|
||||
Name: ptrStr("name"),
|
||||
DisplayName: ptrStr("display name"),
|
||||
Permissions: &[]string{"invite_user"},
|
||||
},
|
||||
}
|
||||
if err := validateSchemeImportData(&data); err != nil {
|
||||
t.Fatal("Validation failed but should have been valid.", err)
|
||||
@@ -164,6 +174,18 @@ func TestImportValidateSchemeImportData(t *testing.T) {
|
||||
t.Fatal("Should have failed due to spurious role.")
|
||||
}
|
||||
|
||||
data.DefaultTeamUserRole = &RoleImportData{
|
||||
Name: ptrStr("name"),
|
||||
DisplayName: ptrStr("display name"),
|
||||
Permissions: &[]string{"invite_user"},
|
||||
}
|
||||
data.DefaultTeamGuestRole = nil
|
||||
if err := validateSchemeImportData(&data); err == nil {
|
||||
t.Fatal("Should have failed due to spurious role.")
|
||||
}
|
||||
|
||||
data.DefaultTeamGuestRole = nil
|
||||
data.DefaultTeamUserRole = nil
|
||||
data.DefaultTeamAdminRole = nil
|
||||
if err := validateSchemeImportData(&data); err != nil {
|
||||
t.Fatal("Should have succeeded.")
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
|
||||
const ADVANCED_PERMISSIONS_MIGRATION_KEY = "AdvancedPermissionsMigrationComplete"
|
||||
const EMOJIS_PERMISSIONS_MIGRATION_KEY = "EmojisPermissionsMigrationComplete"
|
||||
const GUEST_ROLES_CREATION_MIGRATION_KEY = "GuestRolesCreationMigrationComplete"
|
||||
|
||||
// This function migrates the default built in roles from code/config to the database.
|
||||
func (a *App) DoAdvancedPermissionsMigration() {
|
||||
@@ -156,3 +157,108 @@ func (a *App) DoEmojisPermissionsMigration() {
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
}
|
||||
}
|
||||
|
||||
func (a *App) DoGuestRolesCreationMigration() {
|
||||
// If the migration is already marked as completed, don't do it again.
|
||||
if result := <-a.Srv.Store.System().GetByName(GUEST_ROLES_CREATION_MIGRATION_KEY); result.Err == nil {
|
||||
return
|
||||
}
|
||||
|
||||
roles := model.MakeDefaultRoles()
|
||||
|
||||
allSucceeded := true
|
||||
if result := <-a.Srv.Store.Role().GetByName(model.CHANNEL_GUEST_ROLE_ID); result.Err != nil {
|
||||
if result := <-a.Srv.Store.Role().Save(roles[model.CHANNEL_GUEST_ROLE_ID]); result.Err != nil {
|
||||
mlog.Critical("Failed to create new guest role to database.")
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
allSucceeded = false
|
||||
}
|
||||
}
|
||||
if result := <-a.Srv.Store.Role().GetByName(model.TEAM_GUEST_ROLE_ID); result.Err != nil {
|
||||
if result := <-a.Srv.Store.Role().Save(roles[model.TEAM_GUEST_ROLE_ID]); result.Err != nil {
|
||||
mlog.Critical("Failed to create new guest role to database.")
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
allSucceeded = false
|
||||
}
|
||||
}
|
||||
if result := <-a.Srv.Store.Role().GetByName(model.SYSTEM_GUEST_ROLE_ID); result.Err != nil {
|
||||
if result := <-a.Srv.Store.Role().Save(roles[model.SYSTEM_GUEST_ROLE_ID]); result.Err != nil {
|
||||
mlog.Critical("Failed to create new guest role to database.")
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
allSucceeded = false
|
||||
}
|
||||
}
|
||||
|
||||
resultSchemes := <-a.Srv.Store.Scheme().GetAllPage("", 0, 1000000)
|
||||
if resultSchemes.Err != nil {
|
||||
mlog.Critical("Failed to get all schemes.")
|
||||
mlog.Critical(fmt.Sprint(resultSchemes.Err))
|
||||
allSucceeded = false
|
||||
}
|
||||
schemes := resultSchemes.Data.([]*model.Scheme)
|
||||
for _, scheme := range schemes {
|
||||
if scheme.DefaultTeamGuestRole == "" || scheme.DefaultChannelGuestRole == "" {
|
||||
// Team Guest Role
|
||||
teamGuestRole := &model.Role{
|
||||
Name: model.NewId(),
|
||||
DisplayName: fmt.Sprintf("Team Guest Role for Scheme %s", scheme.Name),
|
||||
Permissions: roles[model.TEAM_GUEST_ROLE_ID].Permissions,
|
||||
SchemeManaged: true,
|
||||
}
|
||||
|
||||
if saveRoleResult := <-a.Srv.Store.Role().Save(teamGuestRole); saveRoleResult.Err != nil {
|
||||
mlog.Critical("Failed to create new guest role for custom scheme.")
|
||||
mlog.Critical(fmt.Sprint(saveRoleResult.Err))
|
||||
allSucceeded = false
|
||||
} else {
|
||||
scheme.DefaultTeamGuestRole = saveRoleResult.Data.(*model.Role).Name
|
||||
}
|
||||
|
||||
// Channel Guest Role
|
||||
channelGuestRole := &model.Role{
|
||||
Name: model.NewId(),
|
||||
DisplayName: fmt.Sprintf("Channel Guest Role for Scheme %s", scheme.Name),
|
||||
Permissions: roles[model.CHANNEL_GUEST_ROLE_ID].Permissions,
|
||||
SchemeManaged: true,
|
||||
}
|
||||
|
||||
if saveRoleResult := <-a.Srv.Store.Role().Save(channelGuestRole); saveRoleResult.Err != nil {
|
||||
mlog.Critical("Failed to create new guest role for custom scheme.")
|
||||
mlog.Critical(fmt.Sprint(saveRoleResult.Err))
|
||||
allSucceeded = false
|
||||
} else {
|
||||
scheme.DefaultChannelGuestRole = saveRoleResult.Data.(*model.Role).Name
|
||||
}
|
||||
|
||||
result := <-a.Srv.Store.Scheme().Save(scheme)
|
||||
if result.Err != nil {
|
||||
mlog.Critical("Failed to update custom scheme.")
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
allSucceeded = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !allSucceeded {
|
||||
return
|
||||
}
|
||||
|
||||
system := model.System{
|
||||
Name: GUEST_ROLES_CREATION_MIGRATION_KEY,
|
||||
Value: "true",
|
||||
}
|
||||
|
||||
if result := <-a.Srv.Store.System().Save(&system); result.Err != nil {
|
||||
mlog.Critical("Failed to mark guest roles creation migration as completed.")
|
||||
mlog.Critical(fmt.Sprint(result.Err))
|
||||
}
|
||||
}
|
||||
|
||||
func (a *App) DoAppMigrations() {
|
||||
a.DoAdvancedPermissionsMigration()
|
||||
a.DoEmojisPermissionsMigration()
|
||||
a.DoGuestRolesCreationMigration()
|
||||
// This migration always must be the last, because can be based on previous
|
||||
// migrations. For example, it needs the guest roles migration.
|
||||
a.DoPermissionsMigrations()
|
||||
}
|
||||
|
||||
@@ -58,9 +58,7 @@ func (a *App) ResetPermissionsSystem() *model.AppError {
|
||||
}
|
||||
|
||||
// Now that the permissions system has been reset, re-run the migration to reinitialise it.
|
||||
a.DoAdvancedPermissionsMigration()
|
||||
a.DoEmojisPermissionsMigration()
|
||||
a.DoPermissionsMigrations()
|
||||
a.DoAppMigrations()
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -77,8 +75,10 @@ func (a *App) ExportPermissions(w io.Writer) error {
|
||||
roleNames := []string{
|
||||
scheme.DefaultTeamAdminRole,
|
||||
scheme.DefaultTeamUserRole,
|
||||
scheme.DefaultTeamGuestRole,
|
||||
scheme.DefaultChannelAdminRole,
|
||||
scheme.DefaultChannelUserRole,
|
||||
scheme.DefaultChannelGuestRole,
|
||||
}
|
||||
|
||||
roles := []*model.Role{}
|
||||
@@ -100,8 +100,10 @@ func (a *App) ExportPermissions(w io.Writer) error {
|
||||
Scope: scheme.Scope,
|
||||
TeamAdmin: scheme.DefaultTeamAdminRole,
|
||||
TeamUser: scheme.DefaultTeamUserRole,
|
||||
TeamGuest: scheme.DefaultTeamGuestRole,
|
||||
ChannelAdmin: scheme.DefaultChannelAdminRole,
|
||||
ChannelUser: scheme.DefaultChannelUserRole,
|
||||
ChannelGuest: scheme.DefaultChannelGuestRole,
|
||||
Roles: roles,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -186,8 +188,10 @@ func (a *App) ImportPermissions(jsonl io.Reader) error {
|
||||
roleNameTuples := [][]string{
|
||||
{schemeCreated.DefaultTeamAdminRole, schemeIn.DefaultTeamAdminRole},
|
||||
{schemeCreated.DefaultTeamUserRole, schemeIn.DefaultTeamUserRole},
|
||||
{schemeCreated.DefaultTeamGuestRole, schemeIn.DefaultTeamGuestRole},
|
||||
{schemeCreated.DefaultChannelAdminRole, schemeIn.DefaultChannelAdminRole},
|
||||
{schemeCreated.DefaultChannelUserRole, schemeIn.DefaultChannelUserRole},
|
||||
{schemeCreated.DefaultChannelGuestRole, schemeIn.DefaultChannelGuestRole},
|
||||
}
|
||||
for _, roleNameTuple := range roleNameTuples {
|
||||
if len(roleNameTuple[0]) == 0 || len(roleNameTuple[1]) == 0 {
|
||||
|
||||
@@ -69,8 +69,10 @@ func TestExportPermissions(t *testing.T) {
|
||||
scheme.Scope: func(str string) string { return row["scope"].(string) },
|
||||
scheme.DefaultTeamAdminRole: func(str string) string { return getRoleByName(str) },
|
||||
scheme.DefaultTeamUserRole: func(str string) string { return getRoleByName(str) },
|
||||
scheme.DefaultTeamGuestRole: func(str string) string { return getRoleByName(str) },
|
||||
scheme.DefaultChannelAdminRole: func(str string) string { return getRoleByName(str) },
|
||||
scheme.DefaultChannelUserRole: func(str string) string { return getRoleByName(str) },
|
||||
scheme.DefaultChannelGuestRole: func(str string) string { return getRoleByName(str) },
|
||||
}
|
||||
|
||||
for key, valF := range expectations {
|
||||
@@ -137,6 +139,11 @@ func TestImportPermissions(t *testing.T) {
|
||||
t.Error(appErr)
|
||||
}
|
||||
|
||||
channelGuestRole, appErr := th.App.GetRoleByName(newScheme.DefaultChannelGuestRole)
|
||||
if appErr != nil {
|
||||
t.Error(appErr)
|
||||
}
|
||||
|
||||
expectations := map[string]string{
|
||||
newScheme.DisplayName: displayName,
|
||||
newScheme.Name: name,
|
||||
@@ -144,8 +151,10 @@ func TestImportPermissions(t *testing.T) {
|
||||
newScheme.Scope: scope,
|
||||
newScheme.DefaultTeamAdminRole: "",
|
||||
newScheme.DefaultTeamUserRole: "",
|
||||
newScheme.DefaultTeamGuestRole: "",
|
||||
channelAdminRole.Name: newScheme.DefaultChannelAdminRole,
|
||||
channelUserRole.Name: newScheme.DefaultChannelUserRole,
|
||||
channelGuestRole.Name: newScheme.DefaultChannelGuestRole,
|
||||
}
|
||||
|
||||
for actual, expected := range expectations {
|
||||
|
||||
@@ -61,8 +61,10 @@ func (a *App) CreateScheme(scheme *model.Scheme) (*model.Scheme, *model.AppError
|
||||
// Clear any user-provided values for trusted properties.
|
||||
scheme.DefaultTeamAdminRole = ""
|
||||
scheme.DefaultTeamUserRole = ""
|
||||
scheme.DefaultTeamGuestRole = ""
|
||||
scheme.DefaultChannelAdminRole = ""
|
||||
scheme.DefaultChannelUserRole = ""
|
||||
scheme.DefaultChannelGuestRole = ""
|
||||
scheme.CreateAt = 0
|
||||
scheme.UpdateAt = 0
|
||||
scheme.DeleteAt = 0
|
||||
|
||||
@@ -137,9 +137,7 @@ func (s *Server) RunOldAppInitalization() error {
|
||||
s.FakeApp().LoadLicense()
|
||||
}
|
||||
|
||||
s.FakeApp().DoAdvancedPermissionsMigration()
|
||||
s.FakeApp().DoEmojisPermissionsMigration()
|
||||
s.FakeApp().DoPermissionsMigrations()
|
||||
s.FakeApp().DoAppMigrations()
|
||||
|
||||
s.FakeApp().InitPostMetadata()
|
||||
|
||||
|
||||
43
app/team.go
43
app/team.go
@@ -229,21 +229,21 @@ func (a *App) sendTeamEvent(team *model.Team, event string) {
|
||||
a.Publish(message)
|
||||
}
|
||||
|
||||
func (a *App) GetSchemeRolesForTeam(teamId string) (string, string, *model.AppError) {
|
||||
func (a *App) GetSchemeRolesForTeam(teamId string) (string, string, string, *model.AppError) {
|
||||
team, err := a.GetTeam(teamId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
|
||||
if team.SchemeId != nil && len(*team.SchemeId) != 0 {
|
||||
scheme, err := a.GetScheme(*team.SchemeId)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
return "", "", "", err
|
||||
}
|
||||
return scheme.DefaultTeamUserRole, scheme.DefaultTeamAdminRole, nil
|
||||
return scheme.DefaultTeamGuestRole, scheme.DefaultTeamUserRole, scheme.DefaultTeamAdminRole, nil
|
||||
}
|
||||
|
||||
return model.TEAM_USER_ROLE_ID, model.TEAM_ADMIN_ROLE_ID, nil
|
||||
return model.TEAM_GUEST_ROLE_ID, model.TEAM_USER_ROLE_ID, model.TEAM_ADMIN_ROLE_ID, nil
|
||||
}
|
||||
|
||||
func (a *App) UpdateTeamMemberRoles(teamId string, userId string, newRoles string) (*model.TeamMember, *model.AppError) {
|
||||
@@ -258,12 +258,15 @@ func (a *App) UpdateTeamMemberRoles(teamId string, userId string, newRoles strin
|
||||
return nil, err
|
||||
}
|
||||
|
||||
schemeUserRole, schemeAdminRole, err := a.GetSchemeRolesForTeam(teamId)
|
||||
schemeGuestRole, schemeUserRole, schemeAdminRole, err := a.GetSchemeRolesForTeam(teamId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
prevSchemeGuestValue := member.SchemeGuest
|
||||
|
||||
var newExplicitRoles []string
|
||||
member.SchemeGuest = false
|
||||
member.SchemeUser = false
|
||||
member.SchemeAdmin = false
|
||||
|
||||
@@ -283,13 +286,23 @@ func (a *App) UpdateTeamMemberRoles(teamId string, userId string, newRoles strin
|
||||
member.SchemeAdmin = true
|
||||
case schemeUserRole:
|
||||
member.SchemeUser = true
|
||||
case schemeGuestRole:
|
||||
member.SchemeGuest = true
|
||||
default:
|
||||
// If not part of the scheme for this channel, then it is not allowed to apply it as an explicit role.
|
||||
// If not part of the scheme for this team, then it is not allowed to apply it as an explicit role.
|
||||
return nil, model.NewAppError("UpdateTeamMemberRoles", "api.channel.update_team_member_roles.scheme_role.app_error", nil, "role_name="+roleName, http.StatusBadRequest)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if member.SchemeGuest && member.SchemeUser {
|
||||
return nil, model.NewAppError("UpdateTeamMemberRoles", "api.team.update_team_member_roles.guest_and_user.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if prevSchemeGuestValue != member.SchemeGuest {
|
||||
return nil, model.NewAppError("UpdateTeamMemberRoles", "api.channel.update_team_member_roles.changing_guest_role.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
member.ExplicitRoles = strings.Join(newExplicitRoles, " ")
|
||||
|
||||
result = <-a.Srv.Store.Team().UpdateMember(member)
|
||||
@@ -305,7 +318,7 @@ func (a *App) UpdateTeamMemberRoles(teamId string, userId string, newRoles strin
|
||||
return member, nil
|
||||
}
|
||||
|
||||
func (a *App) UpdateTeamMemberSchemeRoles(teamId string, userId string, isSchemeUser bool, isSchemeAdmin bool) (*model.TeamMember, *model.AppError) {
|
||||
func (a *App) UpdateTeamMemberSchemeRoles(teamId string, userId string, isSchemeGuest bool, isSchemeUser bool, isSchemeAdmin bool) (*model.TeamMember, *model.AppError) {
|
||||
member, err := a.GetTeamMember(teamId, userId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -313,10 +326,15 @@ func (a *App) UpdateTeamMemberSchemeRoles(teamId string, userId string, isScheme
|
||||
|
||||
member.SchemeAdmin = isSchemeAdmin
|
||||
member.SchemeUser = isSchemeUser
|
||||
member.SchemeGuest = isSchemeGuest
|
||||
|
||||
if member.SchemeUser && member.SchemeGuest {
|
||||
return nil, model.NewAppError("UpdateTeamMemberSchemeRoles", "api.team.update_team_member_roles.guest_and_user.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
// If the migration is not completed, we also need to check the default team_admin/team_user roles are not present in the roles field.
|
||||
if err = a.IsPhase2MigrationCompleted(); err != nil {
|
||||
member.ExplicitRoles = RemoveRoles([]string{model.TEAM_USER_ROLE_ID, model.TEAM_ADMIN_ROLE_ID}, member.ExplicitRoles)
|
||||
member.ExplicitRoles = RemoveRoles([]string{model.TEAM_GUEST_ROLE_ID, model.TEAM_USER_ROLE_ID, model.TEAM_ADMIN_ROLE_ID}, member.ExplicitRoles)
|
||||
}
|
||||
|
||||
result := <-a.Srv.Store.Team().UpdateMember(member)
|
||||
@@ -474,9 +492,10 @@ func (a *App) AddUserToTeamByInviteId(inviteId string, userId string) (*model.Te
|
||||
// 3. a pointer to an AppError if something went wrong.
|
||||
func (a *App) joinUserToTeam(team *model.Team, user *model.User) (*model.TeamMember, bool, *model.AppError) {
|
||||
tm := &model.TeamMember{
|
||||
TeamId: team.Id,
|
||||
UserId: user.Id,
|
||||
SchemeUser: true,
|
||||
TeamId: team.Id,
|
||||
UserId: user.Id,
|
||||
SchemeGuest: user.IsGuest(),
|
||||
SchemeUser: !user.IsGuest(),
|
||||
}
|
||||
|
||||
if team.Email == user.Email {
|
||||
|
||||
@@ -780,3 +780,71 @@ func TestGetTeamStats(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
assert.Equal(t, int64(len(members)), teamStats.TotalMemberCount)
|
||||
}
|
||||
|
||||
func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
t.Run("from guest to user", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user"); err == nil {
|
||||
t.Fatal("Should fail when try to modify the guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from user to guest", func(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: ""}
|
||||
ruser, _ := th.App.CreateUser(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest"); err == nil {
|
||||
t.Fatal("Should fail when try to modify the guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from user to admin", func(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: ""}
|
||||
ruser, _ := th.App.CreateUser(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user team_admin"); err != nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("from guest to guest plus custom", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
_, err = th.App.CreateRole(&model.Role{Name: "custom", DisplayName: "custom", Description: "custom"})
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest custom"); err != nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("a guest cant have user role", func(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: ""}
|
||||
ruser, _ := th.App.CreateGuest(&user)
|
||||
|
||||
_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
if _, err := th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest team_user"); err == nil {
|
||||
t.Fatal("Should work when you not modify guest role")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
13
app/user.go
13
app/user.go
@@ -223,11 +223,24 @@ func (a *App) indexUserFromId(userId string) *model.AppError {
|
||||
// CreateUser creates a user and sets several fields of the returned User struct to
|
||||
// their zero values.
|
||||
func (a *App) CreateUser(user *model.User) (*model.User, *model.AppError) {
|
||||
return a.createUserOrGuest(user, false)
|
||||
}
|
||||
|
||||
// CreateGuest creates a guest and sets several fields of the returned User struct to
|
||||
// their zero values.
|
||||
func (a *App) CreateGuest(user *model.User) (*model.User, *model.AppError) {
|
||||
return a.createUserOrGuest(user, true)
|
||||
}
|
||||
|
||||
func (a *App) createUserOrGuest(user *model.User, guest bool) (*model.User, *model.AppError) {
|
||||
if !user.IsLDAPUser() && !user.IsSAMLUser() && !CheckUserDomain(user, *a.Config().TeamSettings.RestrictCreationToDomains) {
|
||||
return nil, model.NewAppError("CreateUser", "api.user.create_user.accepted_domain.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
user.Roles = model.SYSTEM_USER_ROLE_ID
|
||||
if guest {
|
||||
user.Roles = model.SYSTEM_GUEST_ROLE_ID
|
||||
}
|
||||
|
||||
// Below is a special case where the first user in the entire
|
||||
// system is granted the system_admin role
|
||||
|
||||
Ссылка в новой задаче
Block a user