MM-14753: Verifies that user can join teams and channels in spite of group constraints. (#10529)
* MM-147753: Verifies that users are allowed to be members of a team or a channel, based on group constraints, prior to allowing the API to add them. * MM-14753: Allow methods to return meaningful results for deleted teams or channels. * MM-14753: Renames methods to differentiate from permissions and other team and channel restrictions. * MM-14753: Only check if users are team/channel members if team/channel is group constrained. * MM-14753: Updates test function names. * MM-14753: Changes a few method signatures. * MM-14753: Small refactor and adds missing returns. * MM-14753: Changes method names from Get* to Filter* name prefixes. * MM-14753: Renames error variables. * MM-14753: Updates method names for consistency with join table names. * MM-14753: Adds case for non AppError return. * Update i18n/en.json
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
43fa7e0548
Коммит
7bde0378cd
84
app/user.go
84
app/user.go
@@ -596,6 +596,24 @@ func (a *App) GetUsersWithoutTeam(offset int, limit int) ([]*model.User, *model.
|
||||
return result.Data.([]*model.User), nil
|
||||
}
|
||||
|
||||
// GetTeamGroupUsers returns the users who are associated to the team via GroupTeams and GroupMembers.
|
||||
func (a *App) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) {
|
||||
result := <-a.Srv.Store.User().GetTeamGroupUsers(teamID)
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.User), nil
|
||||
}
|
||||
|
||||
// GetChannelGroupUsers returns the users who are associated to the channel via GroupChannels and GroupMembers.
|
||||
func (a *App) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) {
|
||||
result := <-a.Srv.Store.User().GetChannelGroupUsers(channelID)
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.User), nil
|
||||
}
|
||||
|
||||
func (a *App) GetUsersByIds(userIds []string, asAdmin bool) ([]*model.User, *model.AppError) {
|
||||
result := <-a.Srv.Store.User().GetProfileByIds(userIds, true)
|
||||
if result.Err != nil {
|
||||
@@ -1853,3 +1871,69 @@ func (a *App) UpdateOAuthUserAttrs(userData io.Reader, user *model.User, provide
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// FilterNonGroupTeamMembers returns the subset of the given user IDs of the users who are not members of groups
|
||||
// associated to the team.
|
||||
func (a *App) FilterNonGroupTeamMembers(userIDs []string, team *model.Team) ([]string, error) {
|
||||
teamGroupUsers, err := a.GetTeamGroupUsers(team.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// possible if no groups associated or no group members in any of the associated groups
|
||||
if len(teamGroupUsers) == 0 {
|
||||
return userIDs, nil
|
||||
}
|
||||
|
||||
nonMemberIDs := []string{}
|
||||
|
||||
for _, userID := range userIDs {
|
||||
userIsMember := false
|
||||
|
||||
for _, pu := range teamGroupUsers {
|
||||
if pu.Id == userID {
|
||||
userIsMember = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !userIsMember {
|
||||
nonMemberIDs = append(nonMemberIDs, userID)
|
||||
}
|
||||
}
|
||||
|
||||
return nonMemberIDs, nil
|
||||
}
|
||||
|
||||
// FilterNonGroupChannelMembers returns the subset of the given user IDs of the users who are not members of groups
|
||||
// associated to the channel.
|
||||
func (a *App) FilterNonGroupChannelMembers(userIDs []string, channel *model.Channel) ([]string, error) {
|
||||
channelGroupUsers, err := a.GetChannelGroupUsers(channel.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// possible if no groups associated or no group members in any of the associated groups
|
||||
if len(channelGroupUsers) == 0 {
|
||||
return userIDs, nil
|
||||
}
|
||||
|
||||
nonMemberIDs := []string{}
|
||||
|
||||
for _, userID := range userIDs {
|
||||
userIsMember := false
|
||||
|
||||
for _, pu := range channelGroupUsers {
|
||||
if pu.Id == userID {
|
||||
userIsMember = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !userIsMember {
|
||||
nonMemberIDs = append(nonMemberIDs, userID)
|
||||
}
|
||||
}
|
||||
|
||||
return nonMemberIDs, nil
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user