From 39700834b6a5bad9d6075d138372c2676aaccbad Mon Sep 17 00:00:00 2001 From: Tim Scheuermann Date: Tue, 1 Nov 2022 09:37:58 +0100 Subject: [PATCH] MM-47795 Match teams, channels, and users case insensitively on import (#21458) --- app/import_functions.go | 112 ++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/app/import_functions.go b/app/import_functions.go index 976acea62c..bf6d073f72 100644 --- a/app/import_functions.go +++ b/app/import_functions.go @@ -745,16 +745,19 @@ func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]imports.U return err } - teamThemePreferencesByID := map[string]model.Preferences{} - channels := map[string][]imports.UserChannelImportData{} - teamsByID := map[string]*model.Team{} - teamMemberByTeamID := map[string]*model.TeamMember{} - newTeamMembers := []*model.TeamMember{} - oldTeamMembers := []*model.TeamMember{} - rolesByTeamId := map[string]string{} - isGuestByTeamId := map[string]bool{} - isUserByTeamId := map[string]bool{} - isAdminByTeamId := map[string]bool{} + var ( + teamThemePreferencesByID = map[string]model.Preferences{} + channels = map[string][]imports.UserChannelImportData{} + teamsByID = map[string]*model.Team{} + teamMemberByTeamID = map[string]*model.TeamMember{} + newTeamMembers = []*model.TeamMember{} + oldTeamMembers = []*model.TeamMember{} + rolesByTeamId = map[string]string{} + isGuestByTeamId = map[string]bool{} + isUserByTeamId = map[string]bool{} + isAdminByTeamId = map[string]bool{} + ) + existingMemberships, nErr := a.Srv().Store().Team().GetTeamsForUser(context.Background(), user.Id, "", true) if nErr != nil { return model.NewAppError("importUserTeams", "app.team.get_members.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr) @@ -764,7 +767,7 @@ func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]imports.U existingMembershipsByTeamId[teamMembership.TeamId] = teamMembership } for _, tdata := range *data { - team := allTeams[*tdata.Name] + team := allTeams[strings.ToLower(*tdata.Name)] // Team-specific theme Preferences. if tdata.Theme != nil { @@ -905,15 +908,18 @@ func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Te return err } - channelsByID := map[string]*model.Channel{} - channelMemberByChannelID := map[string]*model.ChannelMember{} - newChannelMembers := []*model.ChannelMember{} - oldChannelMembers := []*model.ChannelMember{} - rolesByChannelId := map[string]string{} - channelPreferencesByID := map[string]model.Preferences{} - isGuestByChannelId := map[string]bool{} - isUserByChannelId := map[string]bool{} - isAdminByChannelId := map[string]bool{} + var ( + channelsByID = map[string]*model.Channel{} + channelMemberByChannelID = map[string]*model.ChannelMember{} + newChannelMembers = []*model.ChannelMember{} + oldChannelMembers = []*model.ChannelMember{} + rolesByChannelId = map[string]string{} + channelPreferencesByID = map[string]model.Preferences{} + isGuestByChannelId = map[string]bool{} + isUserByChannelId = map[string]bool{} + isAdminByChannelId = map[string]bool{} + ) + existingMemberships, nErr := a.Srv().Store().Channel().GetMembersForUser(team.Id, user.Id) if nErr != nil { return model.NewAppError("importUserChannels", "app.channel.get_members.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr) @@ -923,7 +929,7 @@ func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Te existingMembershipsByChannelId[channelMembership.ChannelId] = channelMembership } for _, cdata := range *data { - channel, ok := allChannels[*cdata.Name] + channel, ok := allChannels[strings.ToLower(*cdata.Name)] if !ok { return model.NewAppError("BulkImport", "app.import.import_user_channels.channel_not_found.error", nil, "", http.StatusInternalServerError) } @@ -1107,13 +1113,15 @@ func (a *App) importReplies(c request.CTX, data []imports.ReplyImportData, post return err } - postsWithData := []postAndData{} - postsForCreateList := []*model.Post{} - postsForOverwriteList := []*model.Post{} + var ( + postsWithData = []postAndData{} + postsForCreateList = []*model.Post{} + postsForOverwriteList = []*model.Post{} + ) for _, replyData := range data { replyData := replyData - user := users[*replyData.User] + user := users[strings.ToLower(*replyData.User)] // Check if this post already exists. replies, nErr := a.Srv().Store().Post().GetPostsCreatedAt(post.ChannelId, *replyData.CreateAt) @@ -1285,7 +1293,7 @@ func (a *App) getUsersByUsernames(usernames []string) (map[string]*model.User, * users := make(map[string]*model.User) for _, user := range allUsers { - users[user.Username] = user + users[strings.ToLower(user.Username)] = user } return users, nil } @@ -1298,7 +1306,7 @@ func (a *App) getTeamsByNames(names []string) (map[string]*model.Team, *model.Ap teams := make(map[string]*model.Team) for _, team := range allTeams { - teams[team.Name] = team + teams[strings.ToLower(team.Name)] = team } return teams, nil } @@ -1311,7 +1319,7 @@ func (a *App) getChannelsByNames(names []string, teamID string) (map[string]*mod channels := make(map[string]*model.Channel) for _, channel := range allChannels { - channels[channel.Name] = channel + channels[strings.ToLower(channel.Name)] = channel } return channels, nil } @@ -1320,17 +1328,18 @@ func (a *App) getChannelsByNames(names []string, teamID string) (map[string]*mod func (a *App) getChannelsForPosts(teams map[string]*model.Team, data []*imports.PostImportData) (map[string]map[string]*model.Channel, *model.AppError) { teamChannels := make(map[string]map[string]*model.Channel) for _, postData := range data { - teamName := *postData.Team + teamName := strings.ToLower(*postData.Team) if _, ok := teamChannels[teamName]; !ok { teamChannels[teamName] = make(map[string]*model.Channel) } - if channel, ok := teamChannels[teamName][*postData.Channel]; !ok || channel == nil { + channelName := strings.ToLower(*postData.Channel) + if channel, ok := teamChannels[teamName][channelName]; !ok || channel == nil { var err error channel, err = a.Srv().Store().Channel().GetByName(teams[teamName].Id, *postData.Channel, true) if err != nil { return nil, model.NewAppError("BulkImport", "app.import.import_post.channel_not_found.error", map[string]any{"ChannelName": *postData.Channel}, "", http.StatusBadRequest).Wrap(err) } - teamChannels[teamName][*postData.Channel] = channel + teamChannels[teamName][channelName] = channel } } return teamChannels, nil @@ -1386,16 +1395,19 @@ func (a *App) importMultiplePostLines(c request.CTX, lines []imports.LineImportW if err != nil { return 0, err } - postsWithData := []postAndData{} - postsForCreateList := []*model.Post{} - postsForCreateMap := map[string]int{} - postsForOverwriteList := []*model.Post{} - postsForOverwriteMap := map[string]int{} + + var ( + postsWithData = []postAndData{} + postsForCreateList = []*model.Post{} + postsForCreateMap = map[string]int{} + postsForOverwriteList = []*model.Post{} + postsForOverwriteMap = map[string]int{} + ) for _, line := range lines { - team := teams[*line.Post.Team] + team := teams[strings.ToLower(*line.Post.Team)] channel := channels[*line.Post.Team][*line.Post.Channel] - user := users[*line.Post.User] + user := users[strings.ToLower(*line.Post.User)] // Check if this post already exists. posts, nErr := a.Srv().Store().Post().GetPostsCreatedAt(channel.Id, *line.Post.CreateAt) @@ -1495,7 +1507,7 @@ func (a *App) importMultiplePostLines(c request.CTX, lines []imports.LineImportW var preferences model.Preferences for _, username := range *postWithData.postData.FlaggedBy { - user := users[username] + user := users[strings.ToLower(username)] preferences = append(preferences, model.Preference{ UserId: user.Id, @@ -1582,7 +1594,7 @@ func (a *App) importDirectChannel(c request.CTX, data *imports.DirectChannelImpo return err } for _, user := range *data.Members { - userIDs = append(userIDs, userMap[user].Id) + userIDs = append(userIDs, userMap[strings.ToLower(user)].Id) } var channel *model.Channel @@ -1615,7 +1627,7 @@ func (a *App) importDirectChannel(c request.CTX, data *imports.DirectChannelImpo if data.FavoritedBy != nil { for _, favoriter := range *data.FavoritedBy { preferences = append(preferences, model.Preference{ - UserId: userMap[favoriter].Id, + UserId: userMap[strings.ToLower(favoriter)].Id, Category: model.PreferenceCategoryFavoriteChannel, Name: channel.Id, Value: "true", @@ -1676,17 +1688,19 @@ func (a *App) importMultipleDirectPostLines(c request.CTX, lines []imports.LineI return 0, err } - postsWithData := []postAndData{} - postsForCreateList := []*model.Post{} - postsForCreateMap := map[string]int{} - postsForOverwriteList := []*model.Post{} - postsForOverwriteMap := map[string]int{} + var ( + postsWithData = []postAndData{} + postsForCreateList = []*model.Post{} + postsForCreateMap = map[string]int{} + postsForOverwriteList = []*model.Post{} + postsForOverwriteMap = map[string]int{} + ) for _, line := range lines { var userIDs []string var err *model.AppError for _, username := range *line.DirectPost.ChannelMembers { - user := users[username] + user := users[strings.ToLower(username)] userIDs = append(userIDs, user.Id) } @@ -1706,7 +1720,7 @@ func (a *App) importMultipleDirectPostLines(c request.CTX, lines []imports.LineI channel = ch } - user := users[*line.DirectPost.User] + user := users[strings.ToLower(*line.DirectPost.User)] // Check if this post already exists. posts, nErr := a.Srv().Store().Post().GetPostsCreatedAt(channel.Id, *line.DirectPost.CreateAt) @@ -1804,7 +1818,7 @@ func (a *App) importMultipleDirectPostLines(c request.CTX, lines []imports.LineI var preferences model.Preferences for _, username := range *postWithData.directPostData.FlaggedBy { - user := users[username] + user := users[strings.ToLower(username)] preferences = append(preferences, model.Preference{ UserId: user.Id,