[MM-38705] Move import validators into own package (#20914)

Этот коммит содержится в:
Tim Scheuermann
2022-08-31 13:29:37 +02:00
коммит произвёл GitHub
родитель a5ea445bf9
Коммит aef5165cdc
9 изменённых файлов: 895 добавлений и 867 удалений

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

@@ -15,6 +15,7 @@ import (
"github.com/pkg/errors"
"github.com/mattermost/mattermost-server/v6/app/imports"
"github.com/mattermost/mattermost-server/v6/app/request"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/shared/mlog"
@@ -23,7 +24,7 @@ import (
// We use this map to identify the exportable preferences.
// Here we link the preference category and name, to the name of the relevant field in the import struct.
var exportablePreferences = map[ComparablePreference]string{{
var exportablePreferences = map[imports.ComparablePreference]string{{
Category: model.PreferenceCategoryTheme,
Name: "",
}: "Theme", {
@@ -141,7 +142,7 @@ func (a *App) BulkExport(ctx request.CTX, writer io.Writer, outPath string, opts
return nil
}
func (a *App) exportWriteLine(w io.Writer, line *LineImportData) *model.AppError {
func (a *App) exportWriteLine(w io.Writer, line *imports.LineImportData) *model.AppError {
b, err := json.Marshal(line)
if err != nil {
return model.NewAppError("BulkExport", "app.export.export_write_line.json_marshall.error", nil, "", http.StatusBadRequest).Wrap(err)
@@ -156,7 +157,7 @@ func (a *App) exportWriteLine(w io.Writer, line *LineImportData) *model.AppError
func (a *App) exportVersion(writer io.Writer) *model.AppError {
version := 1
versionLine := &LineImportData{
versionLine := &imports.LineImportData{
Type: "version",
Version: &version,
}
@@ -271,7 +272,7 @@ func (a *App) exportAllUsers(writer io.Writer) *model.AppError {
pref.Value = ""
}
}
id, ok := exportablePreferences[ComparablePreference{
id, ok := exportablePreferences[imports.ComparablePreference{
Category: pref.Category,
Name: pref.Name,
}]
@@ -306,8 +307,8 @@ func (a *App) exportAllUsers(writer io.Writer) *model.AppError {
return nil
}
func (a *App) buildUserTeamAndChannelMemberships(userID string) (*[]UserTeamImportData, *model.AppError) {
var memberships []UserTeamImportData
func (a *App) buildUserTeamAndChannelMemberships(userID string) (*[]imports.UserTeamImportData, *model.AppError) {
var memberships []imports.UserTeamImportData
members, err := a.Srv().Store.Team().GetTeamMembersForExport(userID)
@@ -343,8 +344,8 @@ func (a *App) buildUserTeamAndChannelMemberships(userID string) (*[]UserTeamImpo
return &memberships, nil
}
func (a *App) buildUserChannelMemberships(userID string, teamID string) (*[]UserChannelImportData, *model.AppError) {
var memberships []UserChannelImportData
func (a *App) buildUserChannelMemberships(userID string, teamID string) (*[]imports.UserChannelImportData, *model.AppError) {
var memberships []imports.UserChannelImportData
members, nErr := a.Srv().Store.Channel().GetChannelMembersForExport(userID, teamID)
if nErr != nil {
@@ -363,7 +364,7 @@ func (a *App) buildUserChannelMemberships(userID string, teamID string) (*[]User
return &memberships, nil
}
func (a *App) buildUserNotifyProps(notifyProps model.StringMap) *UserNotifyPropsImportData {
func (a *App) buildUserNotifyProps(notifyProps model.StringMap) *imports.UserNotifyPropsImportData {
getProp := func(key string) *string {
if v, ok := notifyProps[key]; ok {
@@ -372,7 +373,7 @@ func (a *App) buildUserNotifyProps(notifyProps model.StringMap) *UserNotifyProps
return nil
}
return &UserNotifyPropsImportData{
return &imports.UserNotifyPropsImportData{
Desktop: getProp(model.DesktopNotifyProp),
DesktopSound: getProp(model.DesktopSoundNotifyProp),
Email: getProp(model.EmailNotifyProp),
@@ -384,8 +385,8 @@ func (a *App) buildUserNotifyProps(notifyProps model.StringMap) *UserNotifyProps
}
}
func (a *App) exportAllPosts(ctx request.CTX, writer io.Writer, withAttachments bool) ([]AttachmentImportData, *model.AppError) {
var attachments []AttachmentImportData
func (a *App) exportAllPosts(ctx request.CTX, writer io.Writer, withAttachments bool) ([]imports.AttachmentImportData, *model.AppError) {
var attachments []imports.AttachmentImportData
afterId := strings.Repeat("0", 26)
for {
@@ -418,7 +419,7 @@ func (a *App) exportAllPosts(ctx request.CTX, writer io.Writer, withAttachments
}
postLine.Post.Replies = &replies
postLine.Post.Reactions = &[]ReactionImportData{}
postLine.Post.Reactions = &[]imports.ReactionImportData{}
if post.HasReactions {
postLine.Post.Reactions, err = a.BuildPostReactions(ctx, post.Id)
if err != nil {
@@ -445,9 +446,9 @@ func (a *App) exportAllPosts(ctx request.CTX, writer io.Writer, withAttachments
}
}
func (a *App) buildPostReplies(ctx request.CTX, postID string, withAttachments bool) ([]ReplyImportData, []AttachmentImportData, *model.AppError) {
var replies []ReplyImportData
var attachments []AttachmentImportData
func (a *App) buildPostReplies(ctx request.CTX, postID string, withAttachments bool) ([]imports.ReplyImportData, []imports.AttachmentImportData, *model.AppError) {
var replies []imports.ReplyImportData
var attachments []imports.AttachmentImportData
replyPosts, nErr := a.Srv().Store.Post().GetRepliesForExport(postID)
if nErr != nil {
@@ -481,7 +482,7 @@ func (a *App) buildPostReplies(ctx request.CTX, postID string, withAttachments b
}
func (a *App) BuildPostReactions(ctx request.CTX, postID string) (*[]ReactionImportData, *model.AppError) {
var reactionsOfPost []ReactionImportData
var reactionsOfPost []imports.ReactionImportData
reactions, nErr := a.Srv().Store.Reaction().GetForPost(postID, true)
if nErr != nil {
@@ -505,15 +506,15 @@ func (a *App) BuildPostReactions(ctx request.CTX, postID string) (*[]ReactionImp
}
func (a *App) buildPostAttachments(postID string) ([]AttachmentImportData, *model.AppError) {
func (a *App) buildPostAttachments(postID string) ([]imports.AttachmentImportData, *model.AppError) {
infos, nErr := a.Srv().Store.FileInfo().GetForPost(postID, false, false, false)
if nErr != nil {
return nil, model.NewAppError("buildPostAttachments", "app.file_info.get_for_post.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
}
attachments := make([]AttachmentImportData, 0, len(infos))
attachments := make([]imports.AttachmentImportData, 0, len(infos))
for _, info := range infos {
attachments = append(attachments, AttachmentImportData{Path: &info.Path})
attachments = append(attachments, imports.AttachmentImportData{Path: &info.Path})
}
return attachments, nil
@@ -635,8 +636,8 @@ func (a *App) exportAllDirectChannels(writer io.Writer) *model.AppError {
return nil
}
func (a *App) exportAllDirectPosts(ctx request.CTX, writer io.Writer, withAttachments bool) ([]AttachmentImportData, *model.AppError) {
var attachments []AttachmentImportData
func (a *App) exportAllDirectPosts(ctx request.CTX, writer io.Writer, withAttachments bool) ([]imports.AttachmentImportData, *model.AppError) {
var attachments []imports.AttachmentImportData
afterId := strings.Repeat("0", 26)
for {
posts, err := a.Srv().Store.Post().GetDirectPostParentsForExportAfter(1000, afterId)
@@ -657,7 +658,7 @@ func (a *App) exportAllDirectPosts(ctx request.CTX, writer io.Writer, withAttach
}
// Handle attachments.
var postAttachments []AttachmentImportData
var postAttachments []imports.AttachmentImportData
var err *model.AppError
if len(post.FileIds) > 0 {
postAttachments, err = a.buildPostAttachments(post.Id)

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

@@ -6,13 +6,14 @@ package app
import (
"strings"
"github.com/mattermost/mattermost-server/v6/app/imports"
"github.com/mattermost/mattermost-server/v6/model"
)
func ImportLineFromTeam(team *model.TeamForExport) *LineImportData {
return &LineImportData{
func ImportLineFromTeam(team *model.TeamForExport) *imports.LineImportData {
return &imports.LineImportData{
Type: "team",
Team: &TeamImportData{
Team: &imports.TeamImportData{
Name: &team.Name,
DisplayName: &team.DisplayName,
Type: &team.Type,
@@ -23,10 +24,10 @@ func ImportLineFromTeam(team *model.TeamForExport) *LineImportData {
}
}
func ImportLineFromChannel(channel *model.ChannelForExport) *LineImportData {
return &LineImportData{
func ImportLineFromChannel(channel *model.ChannelForExport) *imports.LineImportData {
return &imports.LineImportData{
Type: "channel",
Channel: &ChannelImportData{
Channel: &imports.ChannelImportData{
Team: &channel.TeamName,
Name: &channel.Name,
DisplayName: &channel.DisplayName,
@@ -38,30 +39,30 @@ func ImportLineFromChannel(channel *model.ChannelForExport) *LineImportData {
}
}
func ImportLineFromDirectChannel(channel *model.DirectChannelForExport) *LineImportData {
func ImportLineFromDirectChannel(channel *model.DirectChannelForExport) *imports.LineImportData {
channelMembers := *channel.Members
if len(channelMembers) == 1 {
channelMembers = []string{channelMembers[0], channelMembers[0]}
}
return &LineImportData{
return &imports.LineImportData{
Type: "direct_channel",
DirectChannel: &DirectChannelImportData{
DirectChannel: &imports.DirectChannelImportData{
Header: &channel.Header,
Members: &channelMembers,
},
}
}
func ImportLineFromUser(user *model.User, exportedPrefs map[string]*string) *LineImportData {
func ImportLineFromUser(user *model.User, exportedPrefs map[string]*string) *imports.LineImportData {
// Bulk Importer doesn't accept "empty string" for AuthService.
var authService *string
if user.AuthService != "" {
authService = &user.AuthService
}
return &LineImportData{
return &imports.LineImportData{
Type: "user",
User: &UserImportData{
User: &imports.UserImportData{
Username: &user.Username,
Email: &user.Email,
AuthService: authService,
@@ -88,7 +89,7 @@ func ImportLineFromUser(user *model.User, exportedPrefs map[string]*string) *Lin
}
}
func ImportUserTeamDataFromTeamMember(member *model.TeamMemberForExport) *UserTeamImportData {
func ImportUserTeamDataFromTeamMember(member *model.TeamMemberForExport) *imports.UserTeamImportData {
rolesList := strings.Fields(member.Roles)
if member.SchemeAdmin {
rolesList = append(rolesList, model.TeamAdminRoleId)
@@ -100,13 +101,13 @@ func ImportUserTeamDataFromTeamMember(member *model.TeamMemberForExport) *UserTe
rolesList = append(rolesList, model.TeamGuestRoleId)
}
roles := strings.Join(rolesList, " ")
return &UserTeamImportData{
return &imports.UserTeamImportData{
Name: &member.TeamName,
Roles: &roles,
}
}
func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelMemberForExport, preferences *model.Preferences) *UserChannelImportData {
func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelMemberForExport, preferences *model.Preferences) *imports.UserChannelImportData {
rolesList := strings.Fields(member.Roles)
if member.SchemeAdmin {
rolesList = append(rolesList, model.ChannelAdminRoleId)
@@ -118,7 +119,7 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM
rolesList = append(rolesList, model.ChannelGuestRoleId)
}
props := member.NotifyProps
notifyProps := UserChannelNotifyPropsImportData{}
notifyProps := imports.UserChannelNotifyPropsImportData{}
desktop, exist := props[model.DesktopNotifyProp]
if exist {
@@ -141,7 +142,7 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM
}
roles := strings.Join(rolesList, " ")
return &UserChannelImportData{
return &imports.UserChannelImportData{
Name: &member.ChannelName,
Roles: &roles,
NotifyProps: &notifyProps,
@@ -149,10 +150,10 @@ func ImportUserChannelDataFromChannelMemberAndPreferences(member *model.ChannelM
}
}
func ImportLineForPost(post *model.PostForExport) *LineImportData {
return &LineImportData{
func ImportLineForPost(post *model.PostForExport) *imports.LineImportData {
return &imports.LineImportData{
Type: "post",
Post: &PostImportData{
Post: &imports.PostImportData{
Team: &post.TeamName,
Channel: &post.ChannelName,
User: &post.Username,
@@ -165,14 +166,14 @@ func ImportLineForPost(post *model.PostForExport) *LineImportData {
}
}
func ImportLineForDirectPost(post *model.DirectPostForExport) *LineImportData {
func ImportLineForDirectPost(post *model.DirectPostForExport) *imports.LineImportData {
channelMembers := *post.ChannelMembers
if len(channelMembers) == 1 {
channelMembers = []string{channelMembers[0], channelMembers[0]}
}
return &LineImportData{
return &imports.LineImportData{
Type: "direct_post",
DirectPost: &DirectPostImportData{
DirectPost: &imports.DirectPostImportData{
ChannelMembers: &channelMembers,
User: &post.User,
Type: &post.Type,
@@ -184,8 +185,8 @@ func ImportLineForDirectPost(post *model.DirectPostForExport) *LineImportData {
}
}
func ImportReplyFromPost(post *model.ReplyForExport) *ReplyImportData {
return &ReplyImportData{
func ImportReplyFromPost(post *model.ReplyForExport) *imports.ReplyImportData {
return &imports.ReplyImportData{
User: &post.Username,
Type: &post.Type,
Message: &post.Message,
@@ -194,18 +195,18 @@ func ImportReplyFromPost(post *model.ReplyForExport) *ReplyImportData {
}
}
func ImportReactionFromPost(user *model.User, reaction *model.Reaction) *ReactionImportData {
return &ReactionImportData{
func ImportReactionFromPost(user *model.User, reaction *model.Reaction) *imports.ReactionImportData {
return &imports.ReactionImportData{
User: &user.Username,
EmojiName: &reaction.EmojiName,
CreateAt: &reaction.CreateAt,
}
}
func ImportLineFromEmoji(emoji *model.Emoji, filePath string) *LineImportData {
return &LineImportData{
func ImportLineFromEmoji(emoji *model.Emoji, filePath string) *imports.LineImportData {
return &imports.LineImportData{
Type: "emoji",
Emoji: &EmojiImportData{
Emoji: &imports.EmojiImportData{
Name: &emoji.Name,
Image: &filePath,
},

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

@@ -15,17 +15,20 @@ import (
"strings"
"sync"
"github.com/mattermost/mattermost-server/v6/app/imports"
"github.com/mattermost/mattermost-server/v6/app/request"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/shared/mlog"
)
type ReactionImportData = imports.ReactionImportData // part of the app interface
const (
importMultiplePostsThreshold = 1000
maxScanTokenSize = 16 * 1024 * 1024 // Need to set a higher limit than default because some customers cross the limit. See MM-22314
)
func stopOnError(c request.CTX, err LineImportWorkerError) bool {
func stopOnError(c request.CTX, err imports.LineImportWorkerError) bool {
switch err.Error.Id {
case "api.file.upload_file.large_image.app_error":
c.Logger().Warn("Large image import error", mlog.Err(err.Error))
@@ -38,7 +41,7 @@ func stopOnError(c request.CTX, err LineImportWorkerError) bool {
}
}
func processAttachmentPaths(files *[]AttachmentImportData, basePath string, filesMap map[string]*zip.File) error {
func processAttachmentPaths(files *[]imports.AttachmentImportData, basePath string, filesMap map[string]*zip.File) error {
if files == nil {
return nil
}
@@ -58,11 +61,11 @@ func processAttachmentPaths(files *[]AttachmentImportData, basePath string, file
return nil
}
func processAttachments(line *LineImportData, basePath string, filesMap map[string]*zip.File) error {
func processAttachments(line *imports.LineImportData, basePath string, filesMap map[string]*zip.File) error {
var ok bool
switch line.Type {
case "post", "direct_post":
var replies []ReplyImportData
var replies []imports.ReplyImportData
if line.Type == "direct_post" {
if err := processAttachmentPaths(line.DirectPost.Attachments, basePath, filesMap); err != nil {
return err
@@ -108,48 +111,48 @@ func processAttachments(line *LineImportData, basePath string, filesMap map[stri
return nil
}
func (a *App) bulkImportWorker(c request.CTX, dryRun bool, wg *sync.WaitGroup, lines <-chan LineImportWorkerData, errors chan<- LineImportWorkerError) {
postLines := []LineImportWorkerData{}
directPostLines := []LineImportWorkerData{}
func (a *App) bulkImportWorker(c request.CTX, dryRun bool, wg *sync.WaitGroup, lines <-chan imports.LineImportWorkerData, errors chan<- imports.LineImportWorkerError) {
postLines := []imports.LineImportWorkerData{}
directPostLines := []imports.LineImportWorkerData{}
for line := range lines {
switch {
case line.LineImportData.Type == "post":
postLines = append(postLines, line)
if line.Post == nil {
errors <- LineImportWorkerError{model.NewAppError("BulkImport", "app.import.import_line.null_post.error", nil, "", http.StatusBadRequest), line.LineNumber}
errors <- imports.LineImportWorkerError{Error: model.NewAppError("BulkImport", "app.import.import_line.null_post.error", nil, "", http.StatusBadRequest), LineNumber: line.LineNumber}
}
if len(postLines) >= importMultiplePostsThreshold {
if errLine, err := a.importMultiplePostLines(c, postLines, dryRun); err != nil {
errors <- LineImportWorkerError{err, errLine}
errors <- imports.LineImportWorkerError{Error: err, LineNumber: errLine}
}
postLines = []LineImportWorkerData{}
postLines = []imports.LineImportWorkerData{}
}
case line.LineImportData.Type == "direct_post":
directPostLines = append(directPostLines, line)
if line.DirectPost == nil {
errors <- LineImportWorkerError{model.NewAppError("BulkImport", "app.import.import_line.null_direct_post.error", nil, "", http.StatusBadRequest), line.LineNumber}
errors <- imports.LineImportWorkerError{Error: model.NewAppError("BulkImport", "app.import.import_line.null_direct_post.error", nil, "", http.StatusBadRequest), LineNumber: line.LineNumber}
}
if len(directPostLines) >= importMultiplePostsThreshold {
if errLine, err := a.importMultipleDirectPostLines(c, directPostLines, dryRun); err != nil {
errors <- LineImportWorkerError{err, errLine}
errors <- imports.LineImportWorkerError{Error: err, LineNumber: errLine}
}
directPostLines = []LineImportWorkerData{}
directPostLines = []imports.LineImportWorkerData{}
}
default:
if err := a.importLine(c, line.LineImportData, dryRun); err != nil {
errors <- LineImportWorkerError{err, line.LineNumber}
errors <- imports.LineImportWorkerError{Error: err, LineNumber: line.LineNumber}
}
}
}
if len(postLines) > 0 {
if errLine, err := a.importMultiplePostLines(c, postLines, dryRun); err != nil {
errors <- LineImportWorkerError{err, errLine}
errors <- imports.LineImportWorkerError{Error: err, LineNumber: errLine}
}
}
if len(directPostLines) > 0 {
if errLine, err := a.importMultipleDirectPostLines(c, directPostLines, dryRun); err != nil {
errors <- LineImportWorkerError{err, errLine}
errors <- imports.LineImportWorkerError{Error: err, LineNumber: errLine}
}
}
wg.Done()
@@ -177,9 +180,9 @@ func (a *App) bulkImport(c request.CTX, jsonlReader io.Reader, attachmentsReader
a.Srv().Store.LockToMaster()
defer a.Srv().Store.UnlockFromMaster()
errorsChan := make(chan LineImportWorkerError, (2*workers)+1) // size chosen to ensure it never gets filled up completely.
errorsChan := make(chan imports.LineImportWorkerError, (2*workers)+1) // size chosen to ensure it never gets filled up completely.
var wg sync.WaitGroup
var linesChan chan LineImportWorkerData
var linesChan chan imports.LineImportWorkerData
lastLineType := ""
var attachedFiles map[string]*zip.File
@@ -194,7 +197,7 @@ func (a *App) bulkImport(c request.CTX, jsonlReader io.Reader, attachmentsReader
decoder := json.NewDecoder(bytes.NewReader(scanner.Bytes()))
lineNumber++
var line LineImportData
var line imports.LineImportData
if err := decoder.Decode(&line); err != nil {
return model.NewAppError("BulkImport", "app.import.bulk_import.json_decode.error", nil, "", http.StatusBadRequest).Wrap(err), lineNumber
}
@@ -234,7 +237,7 @@ func (a *App) bulkImport(c request.CTX, jsonlReader io.Reader, attachmentsReader
// Set up the workers and channel for this type.
lastLineType = line.Type
linesChan = make(chan LineImportWorkerData, workers)
linesChan = make(chan imports.LineImportWorkerData, workers)
for i := 0; i < workers; i++ {
wg.Add(1)
go a.bulkImportWorker(c, dryRun, &wg, linesChan, errorsChan)
@@ -242,7 +245,7 @@ func (a *App) bulkImport(c request.CTX, jsonlReader io.Reader, attachmentsReader
}
select {
case linesChan <- LineImportWorkerData{line, lineNumber}:
case linesChan <- imports.LineImportWorkerData{LineImportData: line, LineNumber: lineNumber}:
case err := <-errorsChan:
if stopOnError(c, err) {
close(linesChan)
@@ -273,7 +276,7 @@ func (a *App) bulkImport(c request.CTX, jsonlReader io.Reader, attachmentsReader
return nil, 0
}
func processImportDataFileVersionLine(line LineImportData) (int, *model.AppError) {
func processImportDataFileVersionLine(line imports.LineImportData) (int, *model.AppError) {
if line.Type != "version" || line.Version == nil {
return -1, model.NewAppError("BulkImport", "app.import.process_import_data_file_version_line.invalid_version.error", nil, "", http.StatusBadRequest)
}
@@ -281,7 +284,7 @@ func processImportDataFileVersionLine(line LineImportData) (int, *model.AppError
return *line.Version, nil
}
func (a *App) importLine(c request.CTX, line LineImportData, dryRun bool) *model.AppError {
func (a *App) importLine(c request.CTX, line imports.LineImportData, dryRun bool) *model.AppError {
switch {
case line.Type == "scheme":
if line.Scheme == nil {

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

@@ -15,6 +15,7 @@ import (
"path"
"strings"
"github.com/mattermost/mattermost-server/v6/app/imports"
"github.com/mattermost/mattermost-server/v6/app/request"
"github.com/mattermost/mattermost-server/v6/app/teams"
"github.com/mattermost/mattermost-server/v6/app/users"
@@ -30,8 +31,8 @@ import (
// still enforced.
//
func (a *App) importScheme(data *SchemeImportData, dryRun bool) *model.AppError {
if err := validateSchemeImportData(data); err != nil {
func (a *App) importScheme(data *imports.SchemeImportData, dryRun bool) *model.AppError {
if err := imports.ValidateSchemeImportData(data); err != nil {
return err
}
@@ -77,7 +78,7 @@ func (a *App) importScheme(data *SchemeImportData, dryRun bool) *model.AppError
}
if data.DefaultTeamGuestRole == nil {
data.DefaultTeamGuestRole = &RoleImportData{
data.DefaultTeamGuestRole = &imports.RoleImportData{
DisplayName: model.NewString("Team Guest Role for Scheme"),
}
}
@@ -99,7 +100,7 @@ func (a *App) importScheme(data *SchemeImportData, dryRun bool) *model.AppError
}
if data.DefaultChannelGuestRole == nil {
data.DefaultChannelGuestRole = &RoleImportData{
data.DefaultChannelGuestRole = &imports.RoleImportData{
DisplayName: model.NewString("Channel Guest Role for Scheme"),
}
}
@@ -112,9 +113,9 @@ func (a *App) importScheme(data *SchemeImportData, dryRun bool) *model.AppError
return nil
}
func (a *App) importRole(data *RoleImportData, dryRun bool, isSchemeRole bool) *model.AppError {
func (a *App) importRole(data *imports.RoleImportData, dryRun bool, isSchemeRole bool) *model.AppError {
if !isSchemeRole {
if err := validateRoleImportData(data); err != nil {
if err := imports.ValidateRoleImportData(data); err != nil {
return err
}
}
@@ -158,8 +159,8 @@ func (a *App) importRole(data *RoleImportData, dryRun bool, isSchemeRole bool) *
return err
}
func (a *App) importTeam(c request.CTX, data *TeamImportData, dryRun bool) *model.AppError {
if err := validateTeamImportData(data); err != nil {
func (a *App) importTeam(c request.CTX, data *imports.TeamImportData, dryRun bool) *model.AppError {
if err := imports.ValidateTeamImportData(data); err != nil {
return err
}
@@ -226,8 +227,8 @@ func (a *App) importTeam(c request.CTX, data *TeamImportData, dryRun bool) *mode
return nil
}
func (a *App) importChannel(c request.CTX, data *ChannelImportData, dryRun bool) *model.AppError {
if err := validateChannelImportData(data); err != nil {
func (a *App) importChannel(c request.CTX, data *imports.ChannelImportData, dryRun bool) *model.AppError {
if err := imports.ValidateChannelImportData(data); err != nil {
return err
}
@@ -291,8 +292,8 @@ func (a *App) importChannel(c request.CTX, data *ChannelImportData, dryRun bool)
return nil
}
func (a *App) importUser(c request.CTX, data *UserImportData, dryRun bool) *model.AppError {
if err := validateUserImportData(data); err != nil {
func (a *App) importUser(c request.CTX, data *imports.UserImportData, dryRun bool) *model.AppError {
if err := imports.ValidateUserImportData(data); err != nil {
return err
}
@@ -730,7 +731,7 @@ func (a *App) importUser(c request.CTX, data *UserImportData, dryRun bool) *mode
return a.importUserTeams(c, savedUser, data.Teams)
}
func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]UserTeamImportData) *model.AppError {
func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]imports.UserTeamImportData) *model.AppError {
if data == nil {
return nil
}
@@ -745,7 +746,7 @@ func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]UserTeamI
}
teamThemePreferencesByID := map[string]model.Preferences{}
channels := map[string][]UserChannelImportData{}
channels := map[string][]imports.UserChannelImportData{}
teamsByID := map[string]*model.Team{}
teamMemberByTeamID := map[string]*model.TeamMember{}
newTeamMembers := []*model.TeamMember{}
@@ -820,7 +821,7 @@ func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]UserTeamI
channels[team.Id] = append(channels[team.Id], *tdata.Channels...)
}
if !user.IsGuest() {
channels[team.Id] = append(channels[team.Id], UserChannelImportData{Name: model.NewString(model.DefaultChannelName)})
channels[team.Id] = append(channels[team.Id], imports.UserChannelImportData{Name: model.NewString(model.DefaultChannelName)})
}
teamsByID[team.Id] = team
@@ -890,7 +891,7 @@ func (a *App) importUserTeams(c request.CTX, user *model.User, data *[]UserTeamI
return nil
}
func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Team, data *[]UserChannelImportData) *model.AppError {
func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Team, data *[]imports.UserChannelImportData) *model.AppError {
if data == nil {
return nil
}
@@ -1060,8 +1061,8 @@ func (a *App) importUserChannels(c request.CTX, user *model.User, team *model.Te
return nil
}
func (a *App) importReaction(data *ReactionImportData, post *model.Post) *model.AppError {
if err := validateReactionImportData(data, post.CreateAt); err != nil {
func (a *App) importReaction(data *imports.ReactionImportData, post *model.Post) *model.AppError {
if err := imports.ValidateReactionImportData(data, post.CreateAt); err != nil {
return err
}
@@ -1090,12 +1091,12 @@ func (a *App) importReaction(data *ReactionImportData, post *model.Post) *model.
return nil
}
func (a *App) importReplies(c request.CTX, data []ReplyImportData, post *model.Post, teamID string) *model.AppError {
func (a *App) importReplies(c request.CTX, data []imports.ReplyImportData, post *model.Post, teamID string) *model.AppError {
var err *model.AppError
usernames := []string{}
for _, replyData := range data {
replyData := replyData
if err = validateReplyImportData(&replyData, post.CreateAt, a.MaxPostSize()); err != nil {
if err = imports.ValidateReplyImportData(&replyData, post.CreateAt, a.MaxPostSize()); err != nil {
return err
}
usernames = append(usernames, *replyData.User)
@@ -1192,7 +1193,7 @@ func (a *App) importReplies(c request.CTX, data []ReplyImportData, post *model.P
return nil
}
func (a *App) importAttachment(c request.CTX, data *AttachmentImportData, post *model.Post, teamID string) (*model.FileInfo, *model.AppError) {
func (a *App) importAttachment(c request.CTX, data *imports.AttachmentImportData, post *model.Post, teamID string) (*model.FileInfo, *model.AppError) {
var (
name string
file io.Reader
@@ -1264,9 +1265,9 @@ func (a *App) importAttachment(c request.CTX, data *AttachmentImportData, post *
type postAndData struct {
post *model.Post
postData *PostImportData
directPostData *DirectPostImportData
replyData *ReplyImportData
postData *imports.PostImportData
directPostData *imports.DirectPostImportData
replyData *imports.ReplyImportData
team *model.Team
lineNumber int
}
@@ -1316,7 +1317,7 @@ func (a *App) getChannelsByNames(names []string, teamID string) (map[string]*mod
}
// getChannelsForPosts returns map[teamName]map[channelName]*model.Channel
func (a *App) getChannelsForPosts(teams map[string]*model.Team, data []*PostImportData) (map[string]map[string]*model.Channel, *model.AppError) {
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
@@ -1343,13 +1344,13 @@ func getPostStrID(post *model.Post) string {
// importMultiplePostLines will return an error and the line that
// caused it whenever possible
func (a *App) importMultiplePostLines(c request.CTX, lines []LineImportWorkerData, dryRun bool) (int, *model.AppError) {
func (a *App) importMultiplePostLines(c request.CTX, lines []imports.LineImportWorkerData, dryRun bool) (int, *model.AppError) {
if len(lines) == 0 {
return 0, nil
}
for _, line := range lines {
if err := validatePostImportData(line.Post, a.MaxPostSize()); err != nil {
if err := imports.ValidatePostImportData(line.Post, a.MaxPostSize()); err != nil {
return line.LineNumber, err
}
}
@@ -1361,7 +1362,7 @@ func (a *App) importMultiplePostLines(c request.CTX, lines []LineImportWorkerDat
usernames := []string{}
teamNames := make([]string, len(lines))
postsData := make([]*PostImportData, len(lines))
postsData := make([]*imports.PostImportData, len(lines))
for i, line := range lines {
usernames = append(usernames, *line.Post.User)
if line.Post.FlaggedBy != nil {
@@ -1532,7 +1533,7 @@ func (a *App) importMultiplePostLines(c request.CTX, lines []LineImportWorkerDat
}
// uploadAttachments imports new attachments and returns current attachments of the post as a map
func (a *App) uploadAttachments(c request.CTX, attachments *[]AttachmentImportData, post *model.Post, teamID string) map[string]bool {
func (a *App) uploadAttachments(c request.CTX, attachments *[]imports.AttachmentImportData, post *model.Post, teamID string) map[string]bool {
if attachments == nil {
return nil
}
@@ -1564,9 +1565,9 @@ func (a *App) updateFileInfoWithPostId(post *model.Post) {
}
}
}
func (a *App) importDirectChannel(c request.CTX, data *DirectChannelImportData, dryRun bool) *model.AppError {
func (a *App) importDirectChannel(c request.CTX, data *imports.DirectChannelImportData, dryRun bool) *model.AppError {
var err *model.AppError
if err = validateDirectChannelImportData(data); err != nil {
if err = imports.ValidateDirectChannelImportData(data); err != nil {
return err
}
@@ -1645,13 +1646,13 @@ func (a *App) importDirectChannel(c request.CTX, data *DirectChannelImportData,
// importMultipleDirectPostLines will return an error and the line
// that caused it whenever possible
func (a *App) importMultipleDirectPostLines(c request.CTX, lines []LineImportWorkerData, dryRun bool) (int, *model.AppError) {
func (a *App) importMultipleDirectPostLines(c request.CTX, lines []imports.LineImportWorkerData, dryRun bool) (int, *model.AppError) {
if len(lines) == 0 {
return 0, nil
}
for _, line := range lines {
if err := validateDirectPostImportData(line.DirectPost, a.MaxPostSize()); err != nil {
if err := imports.ValidateDirectPostImportData(line.DirectPost, a.MaxPostSize()); err != nil {
return line.LineNumber, err
}
}
@@ -1840,8 +1841,8 @@ func (a *App) importMultipleDirectPostLines(c request.CTX, lines []LineImportWor
return 0, nil
}
func (a *App) importEmoji(data *EmojiImportData, dryRun bool) *model.AppError {
aerr := validateEmojiImportData(data)
func (a *App) importEmoji(data *imports.EmojiImportData, dryRun bool) *model.AppError {
aerr := imports.ValidateEmojiImportData(data)
if aerr != nil {
if aerr.Id == "model.emoji.system_emoji_name.app_error" {
mlog.Warn("Skipping emoji import due to name conflict with system emoji", mlog.String("emoji_name", *data.Name))

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@@ -16,6 +16,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/mattermost/mattermost-server/v6/app/imports"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/utils"
"github.com/mattermost/mattermost-server/v6/utils/fileutils"
@@ -83,7 +84,7 @@ func TestImportImportLine(t *testing.T) {
defer th.TearDown()
// Try import line with an invalid type.
line := LineImportData{
line := imports.LineImportData{
Type: "gibberish",
}
@@ -130,29 +131,29 @@ func TestStopOnError(t *testing.T) {
th := Setup(t)
defer th.TearDown()
assert.True(t, stopOnError(th.Context, LineImportWorkerError{
model.NewAppError("test", "app.import.attachment.bad_file.error", nil, "", http.StatusBadRequest),
1,
assert.True(t, stopOnError(th.Context, imports.LineImportWorkerError{
Error: model.NewAppError("test", "app.import.attachment.bad_file.error", nil, "", http.StatusBadRequest),
LineNumber: 1,
}))
assert.True(t, stopOnError(th.Context, LineImportWorkerError{
model.NewAppError("test", "app.import.attachment.file_upload.error", nil, "", http.StatusBadRequest),
1,
assert.True(t, stopOnError(th.Context, imports.LineImportWorkerError{
Error: model.NewAppError("test", "app.import.attachment.file_upload.error", nil, "", http.StatusBadRequest),
LineNumber: 1,
}))
assert.False(t, stopOnError(th.Context, LineImportWorkerError{
model.NewAppError("test", "api.file.upload_file.large_image.app_error", nil, "", http.StatusBadRequest),
1,
assert.False(t, stopOnError(th.Context, imports.LineImportWorkerError{
Error: model.NewAppError("test", "api.file.upload_file.large_image.app_error", nil, "", http.StatusBadRequest),
LineNumber: 1,
}))
assert.False(t, stopOnError(th.Context, LineImportWorkerError{
model.NewAppError("test", "app.import.validate_direct_channel_import_data.members_too_few.error", nil, "", http.StatusBadRequest),
1,
assert.False(t, stopOnError(th.Context, imports.LineImportWorkerError{
Error: model.NewAppError("test", "app.import.validate_direct_channel_import_data.members_too_few.error", nil, "", http.StatusBadRequest),
LineNumber: 1,
}))
assert.False(t, stopOnError(th.Context, LineImportWorkerError{
model.NewAppError("test", "app.import.validate_direct_channel_import_data.members_too_many.error", nil, "", http.StatusBadRequest),
1,
assert.False(t, stopOnError(th.Context, imports.LineImportWorkerError{
Error: model.NewAppError("test", "app.import.validate_direct_channel_import_data.members_too_many.error", nil, "", http.StatusBadRequest),
LineNumber: 1,
}))
}
@@ -246,7 +247,7 @@ func TestImportBulkImport(t *testing.T) {
}
func TestImportProcessImportDataFileVersionLine(t *testing.T) {
data := LineImportData{
data := imports.LineImportData{
Type: "version",
Version: ptrInt(1),
}
@@ -284,8 +285,8 @@ func AssertFileIdsInPost(files []*model.FileInfo, th *TestHelper, t *testing.T)
}
func TestProcessAttachments(t *testing.T) {
genAttachments := func() *[]AttachmentImportData {
return &[]AttachmentImportData{
genAttachments := func() *[]imports.AttachmentImportData {
return &[]imports.AttachmentImportData{
{
Path: model.NewString("file.jpg"),
},
@@ -295,36 +296,36 @@ func TestProcessAttachments(t *testing.T) {
}
}
line := LineImportData{
line := imports.LineImportData{
Type: "post",
Post: &PostImportData{
Post: &imports.PostImportData{
Attachments: genAttachments(),
},
}
line2 := LineImportData{
line2 := imports.LineImportData{
Type: "direct_post",
DirectPost: &DirectPostImportData{
DirectPost: &imports.DirectPostImportData{
Attachments: genAttachments(),
},
}
userLine := LineImportData{
userLine := imports.LineImportData{
Type: "user",
User: &UserImportData{
User: &imports.UserImportData{
ProfileImage: model.NewString("profile.jpg"),
},
}
emojiLine := LineImportData{
emojiLine := imports.LineImportData{
Type: "emoji",
Emoji: &EmojiImportData{
Emoji: &imports.EmojiImportData{
Image: model.NewString("emoji.png"),
},
}
t.Run("empty path", func(t *testing.T) {
expected := &[]AttachmentImportData{
expected := &[]imports.AttachmentImportData{
{
Path: model.NewString("file.jpg"),
},
@@ -341,7 +342,7 @@ func TestProcessAttachments(t *testing.T) {
})
t.Run("valid path", func(t *testing.T) {
expected := &[]AttachmentImportData{
expected := &[]imports.AttachmentImportData{
{
Path: model.NewString("/tmp/file.jpg"),
},

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

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package app
package imports
import (
"archive/zip"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package app
package imports
import (
"encoding/json"
@@ -14,7 +14,7 @@ import (
"github.com/mattermost/mattermost-server/v6/shared/mlog"
)
func validateSchemeImportData(data *SchemeImportData) *model.AppError {
func ValidateSchemeImportData(data *SchemeImportData) *model.AppError {
if data.Scope == nil {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.null_scope.error", nil, "", http.StatusBadRequest)
@@ -46,37 +46,37 @@ func validateSchemeImportData(data *SchemeImportData) *model.AppError {
}
if data.DefaultTeamAdminRole != nil {
if err := validateRoleImportData(data.DefaultTeamAdminRole); err != nil {
if err := ValidateRoleImportData(data.DefaultTeamAdminRole); err != nil {
return err
}
}
if data.DefaultTeamUserRole != nil {
if err := validateRoleImportData(data.DefaultTeamUserRole); err != nil {
if err := ValidateRoleImportData(data.DefaultTeamUserRole); err != nil {
return err
}
}
if data.DefaultTeamGuestRole != nil {
if err := validateRoleImportData(data.DefaultTeamGuestRole); err != nil {
if err := ValidateRoleImportData(data.DefaultTeamGuestRole); err != nil {
return err
}
}
if data.DefaultChannelAdminRole != nil {
if err := validateRoleImportData(data.DefaultChannelAdminRole); err != nil {
if err := ValidateRoleImportData(data.DefaultChannelAdminRole); err != nil {
return err
}
}
if data.DefaultChannelUserRole != nil {
if err := validateRoleImportData(data.DefaultChannelUserRole); err != nil {
if err := ValidateRoleImportData(data.DefaultChannelUserRole); err != nil {
return err
}
}
if data.DefaultChannelGuestRole != nil {
if err := validateRoleImportData(data.DefaultChannelGuestRole); err != nil {
if err := ValidateRoleImportData(data.DefaultChannelGuestRole); err != nil {
return err
}
}
@@ -84,7 +84,7 @@ func validateSchemeImportData(data *SchemeImportData) *model.AppError {
return nil
}
func validateRoleImportData(data *RoleImportData) *model.AppError {
func ValidateRoleImportData(data *RoleImportData) *model.AppError {
if data.Name == nil || !model.IsValidRoleName(*data.Name) {
return model.NewAppError("BulkImport", "app.import.validate_role_import_data.name_invalid.error", nil, "", http.StatusBadRequest)
@@ -117,7 +117,7 @@ func validateRoleImportData(data *RoleImportData) *model.AppError {
return nil
}
func validateTeamImportData(data *TeamImportData) *model.AppError {
func ValidateTeamImportData(data *TeamImportData) *model.AppError {
if data.Name == nil {
return model.NewAppError("BulkImport", "app.import.validate_team_import_data.name_missing.error", nil, "", http.StatusBadRequest)
@@ -152,7 +152,7 @@ func validateTeamImportData(data *TeamImportData) *model.AppError {
return nil
}
func validateChannelImportData(data *ChannelImportData) *model.AppError {
func ValidateChannelImportData(data *ChannelImportData) *model.AppError {
if data.Team == nil {
return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.team_missing.error", nil, "", http.StatusBadRequest)
@@ -193,7 +193,7 @@ func validateChannelImportData(data *ChannelImportData) *model.AppError {
return nil
}
func validateUserImportData(data *UserImportData) *model.AppError {
func ValidateUserImportData(data *UserImportData) *model.AppError {
if data.ProfileImage != nil {
if _, err := os.Stat(*data.ProfileImage); os.IsNotExist(err) {
return model.NewAppError("BulkImport", "app.import.validate_user_import_data.profile_image.error", nil, "", http.StatusBadRequest)
@@ -306,13 +306,13 @@ func validateUserImportData(data *UserImportData) *model.AppError {
}
if data.Teams != nil {
return validateUserTeamsImportData(data.Teams)
return ValidateUserTeamsImportData(data.Teams)
}
return nil
}
func validateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError {
func ValidateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError {
if data == nil {
return nil
}
@@ -327,7 +327,7 @@ func validateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError {
}
if tdata.Channels != nil {
if err := validateUserChannelsImportData(tdata.Channels); err != nil {
if err := ValidateUserChannelsImportData(tdata.Channels); err != nil {
return err
}
}
@@ -343,7 +343,7 @@ func validateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError {
return nil
}
func validateUserChannelsImportData(data *[]UserChannelImportData) *model.AppError {
func ValidateUserChannelsImportData(data *[]UserChannelImportData) *model.AppError {
if data == nil {
return nil
}
@@ -375,7 +375,7 @@ func validateUserChannelsImportData(data *[]UserChannelImportData) *model.AppErr
return nil
}
func validateReactionImportData(data *ReactionImportData, parentCreateAt int64) *model.AppError {
func ValidateReactionImportData(data *ReactionImportData, parentCreateAt int64) *model.AppError {
if data.User == nil {
return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.user_missing.error", nil, "", http.StatusBadRequest)
}
@@ -397,7 +397,7 @@ func validateReactionImportData(data *ReactionImportData, parentCreateAt int64)
return nil
}
func validateReplyImportData(data *ReplyImportData, parentCreateAt int64, maxPostSize int) *model.AppError {
func ValidateReplyImportData(data *ReplyImportData, parentCreateAt int64, maxPostSize int) *model.AppError {
if data.User == nil {
return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.user_missing.error", nil, "", http.StatusBadRequest)
}
@@ -419,7 +419,7 @@ func validateReplyImportData(data *ReplyImportData, parentCreateAt int64, maxPos
return nil
}
func validatePostImportData(data *PostImportData, maxPostSize int) *model.AppError {
func ValidatePostImportData(data *PostImportData, maxPostSize int) *model.AppError {
if data.Team == nil {
return model.NewAppError("BulkImport", "app.import.validate_post_import_data.team_missing.error", nil, "", http.StatusBadRequest)
}
@@ -447,14 +447,14 @@ func validatePostImportData(data *PostImportData, maxPostSize int) *model.AppErr
if data.Reactions != nil {
for _, reaction := range *data.Reactions {
reaction := reaction
validateReactionImportData(&reaction, *data.CreateAt)
ValidateReactionImportData(&reaction, *data.CreateAt)
}
}
if data.Replies != nil {
for _, reply := range *data.Replies {
reply := reply
validateReplyImportData(&reply, *data.CreateAt, maxPostSize)
ValidateReplyImportData(&reply, *data.CreateAt, maxPostSize)
}
}
@@ -465,7 +465,7 @@ func validatePostImportData(data *PostImportData, maxPostSize int) *model.AppErr
return nil
}
func validateDirectChannelImportData(data *DirectChannelImportData) *model.AppError {
func ValidateDirectChannelImportData(data *DirectChannelImportData) *model.AppError {
if data.Members == nil {
return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.members_required.error", nil, "", http.StatusBadRequest)
}
@@ -500,7 +500,7 @@ func validateDirectChannelImportData(data *DirectChannelImportData) *model.AppEr
return nil
}
func validateDirectPostImportData(data *DirectPostImportData, maxPostSize int) *model.AppError {
func ValidateDirectPostImportData(data *DirectPostImportData, maxPostSize int) *model.AppError {
if data.ChannelMembers == nil {
return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.channel_members_required.error", nil, "", http.StatusBadRequest)
}
@@ -547,23 +547,23 @@ func validateDirectPostImportData(data *DirectPostImportData, maxPostSize int) *
if data.Reactions != nil {
for _, reaction := range *data.Reactions {
reaction := reaction
validateReactionImportData(&reaction, *data.CreateAt)
ValidateReactionImportData(&reaction, *data.CreateAt)
}
}
if data.Replies != nil {
for _, reply := range *data.Replies {
reply := reply
validateReplyImportData(&reply, *data.CreateAt, maxPostSize)
ValidateReplyImportData(&reply, *data.CreateAt, maxPostSize)
}
}
return nil
}
// validateEmojiImportData validates emoji data and returns if the import name
// ValidateEmojiImportData validates emoji data and returns if the import name
// conflicts with a system emoji.
func validateEmojiImportData(data *EmojiImportData) *model.AppError {
func ValidateEmojiImportData(data *EmojiImportData) *model.AppError {
if data == nil {
return model.NewAppError("BulkImport", "app.import.validate_emoji_import_data.empty.error", nil, "", http.StatusBadRequest)
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу