github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/app/import_validators.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package app 5 6 import ( 7 "encoding/json" 8 "net/http" 9 "os" 10 "strings" 11 "unicode/utf8" 12 13 "github.com/mattermost/mattermost-server/v5/model" 14 ) 15 16 func validateSchemeImportData(data *SchemeImportData) *model.AppError { 17 18 if data.Scope == nil { 19 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.null_scope.error", nil, "", http.StatusBadRequest) 20 } 21 22 switch *data.Scope { 23 case model.SCHEME_SCOPE_TEAM: 24 if data.DefaultTeamAdminRole == nil || data.DefaultTeamUserRole == nil || data.DefaultChannelAdminRole == nil || data.DefaultChannelUserRole == nil { 25 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.wrong_roles_for_scope.error", nil, "", http.StatusBadRequest) 26 } 27 case model.SCHEME_SCOPE_CHANNEL: 28 if data.DefaultTeamAdminRole != nil || data.DefaultTeamUserRole != nil || data.DefaultChannelAdminRole == nil || data.DefaultChannelUserRole == nil { 29 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.wrong_roles_for_scope.error", nil, "", http.StatusBadRequest) 30 } 31 default: 32 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.unknown_scheme.error", nil, "", http.StatusBadRequest) 33 } 34 35 if data.Name == nil || !model.IsValidSchemeName(*data.Name) { 36 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.name_invalid.error", nil, "", http.StatusBadRequest) 37 } 38 39 if data.DisplayName == nil || *data.DisplayName == "" || len(*data.DisplayName) > model.SCHEME_DISPLAY_NAME_MAX_LENGTH { 40 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.display_name_invalid.error", nil, "", http.StatusBadRequest) 41 } 42 43 if data.Description != nil && len(*data.Description) > model.SCHEME_DESCRIPTION_MAX_LENGTH { 44 return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.description_invalid.error", nil, "", http.StatusBadRequest) 45 } 46 47 if data.DefaultTeamAdminRole != nil { 48 if err := validateRoleImportData(data.DefaultTeamAdminRole); err != nil { 49 return err 50 } 51 } 52 53 if data.DefaultTeamUserRole != nil { 54 if err := validateRoleImportData(data.DefaultTeamUserRole); err != nil { 55 return err 56 } 57 } 58 59 if data.DefaultTeamGuestRole != nil { 60 if err := validateRoleImportData(data.DefaultTeamGuestRole); err != nil { 61 return err 62 } 63 } 64 65 if data.DefaultChannelAdminRole != nil { 66 if err := validateRoleImportData(data.DefaultChannelAdminRole); err != nil { 67 return err 68 } 69 } 70 71 if data.DefaultChannelUserRole != nil { 72 if err := validateRoleImportData(data.DefaultChannelUserRole); err != nil { 73 return err 74 } 75 } 76 77 if data.DefaultChannelGuestRole != nil { 78 if err := validateRoleImportData(data.DefaultChannelGuestRole); err != nil { 79 return err 80 } 81 } 82 83 return nil 84 } 85 86 func validateRoleImportData(data *RoleImportData) *model.AppError { 87 88 if data.Name == nil || !model.IsValidRoleName(*data.Name) { 89 return model.NewAppError("BulkImport", "app.import.validate_role_import_data.name_invalid.error", nil, "", http.StatusBadRequest) 90 } 91 92 if data.DisplayName == nil || *data.DisplayName == "" || len(*data.DisplayName) > model.ROLE_DISPLAY_NAME_MAX_LENGTH { 93 return model.NewAppError("BulkImport", "app.import.validate_role_import_data.display_name_invalid.error", nil, "", http.StatusBadRequest) 94 } 95 96 if data.Description != nil && len(*data.Description) > model.ROLE_DESCRIPTION_MAX_LENGTH { 97 return model.NewAppError("BulkImport", "app.import.validate_role_import_data.description_invalid.error", nil, "", http.StatusBadRequest) 98 } 99 100 if data.Permissions != nil { 101 for _, permission := range *data.Permissions { 102 permissionValidated := false 103 for _, p := range append(model.AllPermissions, model.DeprecatedPermissions...) { 104 if permission == p.Id { 105 permissionValidated = true 106 break 107 } 108 } 109 110 if !permissionValidated { 111 return model.NewAppError("BulkImport", "app.import.validate_role_import_data.invalid_permission.error", nil, "permission"+permission, http.StatusBadRequest) 112 } 113 } 114 } 115 116 return nil 117 } 118 119 func validateTeamImportData(data *TeamImportData) *model.AppError { 120 121 if data.Name == nil { 122 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.name_missing.error", nil, "", http.StatusBadRequest) 123 } else if len(*data.Name) > model.TEAM_NAME_MAX_LENGTH { 124 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.name_length.error", nil, "", http.StatusBadRequest) 125 } else if model.IsReservedTeamName(*data.Name) { 126 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.name_reserved.error", nil, "", http.StatusBadRequest) 127 } else if !model.IsValidTeamName(*data.Name) { 128 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.name_characters.error", nil, "", http.StatusBadRequest) 129 } 130 131 if data.DisplayName == nil { 132 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.display_name_missing.error", nil, "", http.StatusBadRequest) 133 } else if utf8.RuneCountInString(*data.DisplayName) == 0 || utf8.RuneCountInString(*data.DisplayName) > model.TEAM_DISPLAY_NAME_MAX_RUNES { 134 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.display_name_length.error", nil, "", http.StatusBadRequest) 135 } 136 137 if data.Type == nil { 138 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.type_missing.error", nil, "", http.StatusBadRequest) 139 } else if *data.Type != model.TEAM_OPEN && *data.Type != model.TEAM_INVITE { 140 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.type_invalid.error", nil, "", http.StatusBadRequest) 141 } 142 143 if data.Description != nil && len(*data.Description) > model.TEAM_DESCRIPTION_MAX_LENGTH { 144 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.description_length.error", nil, "", http.StatusBadRequest) 145 } 146 147 if data.Scheme != nil && !model.IsValidSchemeName(*data.Scheme) { 148 return model.NewAppError("BulkImport", "app.import.validate_team_import_data.scheme_invalid.error", nil, "", http.StatusBadRequest) 149 } 150 151 return nil 152 } 153 154 func validateChannelImportData(data *ChannelImportData) *model.AppError { 155 156 if data.Team == nil { 157 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.team_missing.error", nil, "", http.StatusBadRequest) 158 } 159 160 if data.Name == nil { 161 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.name_missing.error", nil, "", http.StatusBadRequest) 162 } else if len(*data.Name) > model.CHANNEL_NAME_MAX_LENGTH { 163 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.name_length.error", nil, "", http.StatusBadRequest) 164 } else if !model.IsValidChannelIdentifier(*data.Name) { 165 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.name_characters.error", nil, "", http.StatusBadRequest) 166 } 167 168 if data.DisplayName == nil { 169 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.display_name_missing.error", nil, "", http.StatusBadRequest) 170 } else if utf8.RuneCountInString(*data.DisplayName) == 0 || utf8.RuneCountInString(*data.DisplayName) > model.CHANNEL_DISPLAY_NAME_MAX_RUNES { 171 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.display_name_length.error", nil, "", http.StatusBadRequest) 172 } 173 174 if data.Type == nil { 175 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.type_missing.error", nil, "", http.StatusBadRequest) 176 } else if *data.Type != model.CHANNEL_OPEN && *data.Type != model.CHANNEL_PRIVATE { 177 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.type_invalid.error", nil, "", http.StatusBadRequest) 178 } 179 180 if data.Header != nil && utf8.RuneCountInString(*data.Header) > model.CHANNEL_HEADER_MAX_RUNES { 181 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.header_length.error", nil, "", http.StatusBadRequest) 182 } 183 184 if data.Purpose != nil && utf8.RuneCountInString(*data.Purpose) > model.CHANNEL_PURPOSE_MAX_RUNES { 185 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.purpose_length.error", nil, "", http.StatusBadRequest) 186 } 187 188 if data.Scheme != nil && !model.IsValidSchemeName(*data.Scheme) { 189 return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.scheme_invalid.error", nil, "", http.StatusBadRequest) 190 } 191 192 return nil 193 } 194 195 func validateUserImportData(data *UserImportData) *model.AppError { 196 if data.ProfileImage != nil { 197 if _, err := os.Stat(*data.ProfileImage); os.IsNotExist(err) { 198 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.profile_image.error", nil, "", http.StatusBadRequest) 199 } 200 } 201 202 if data.Username == nil { 203 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.username_missing.error", nil, "", http.StatusBadRequest) 204 } else if !model.IsValidUsername(*data.Username) { 205 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.username_invalid.error", nil, "", http.StatusBadRequest) 206 } 207 208 if data.Email == nil { 209 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.email_missing.error", nil, "", http.StatusBadRequest) 210 } else if *data.Email == "" || len(*data.Email) > model.USER_EMAIL_MAX_LENGTH { 211 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.email_length.error", nil, "", http.StatusBadRequest) 212 } 213 214 if data.AuthData != nil && data.Password != nil { 215 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.auth_data_and_password.error", nil, "", http.StatusBadRequest) 216 } 217 218 if data.AuthData != nil && len(*data.AuthData) > model.USER_AUTH_DATA_MAX_LENGTH { 219 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.auth_data_length.error", nil, "", http.StatusBadRequest) 220 } 221 222 blank := func(str *string) bool { 223 if str == nil { 224 return true 225 } 226 return *str == "" 227 } 228 229 if (!blank(data.AuthService) && blank(data.AuthData)) || (blank(data.AuthService) && !blank(data.AuthData)) { 230 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.auth_data_and_service_dependency.error", nil, "", http.StatusBadRequest) 231 } 232 233 if data.Password != nil && *data.Password == "" { 234 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.password_length.error", nil, "", http.StatusBadRequest) 235 } 236 237 if data.Password != nil && len(*data.Password) > model.USER_PASSWORD_MAX_LENGTH { 238 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.password_length.error", nil, "", http.StatusBadRequest) 239 } 240 241 if data.Nickname != nil && utf8.RuneCountInString(*data.Nickname) > model.USER_NICKNAME_MAX_RUNES { 242 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.nickname_length.error", nil, "", http.StatusBadRequest) 243 } 244 245 if data.FirstName != nil && utf8.RuneCountInString(*data.FirstName) > model.USER_FIRST_NAME_MAX_RUNES { 246 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.first_name_length.error", nil, "", http.StatusBadRequest) 247 } 248 249 if data.LastName != nil && utf8.RuneCountInString(*data.LastName) > model.USER_LAST_NAME_MAX_RUNES { 250 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.last_name_length.error", nil, "", http.StatusBadRequest) 251 } 252 253 if data.Position != nil && utf8.RuneCountInString(*data.Position) > model.USER_POSITION_MAX_RUNES { 254 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.position_length.error", nil, "", http.StatusBadRequest) 255 } 256 257 if data.Roles != nil && !model.IsValidUserRoles(*data.Roles) { 258 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.roles_invalid.error", nil, "", http.StatusBadRequest) 259 } 260 261 if data.NotifyProps != nil { 262 if data.NotifyProps.Desktop != nil && !model.IsValidUserNotifyLevel(*data.NotifyProps.Desktop) { 263 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_desktop_invalid.error", nil, "", http.StatusBadRequest) 264 } 265 266 if data.NotifyProps.DesktopSound != nil && !model.IsValidTrueOrFalseString(*data.NotifyProps.DesktopSound) { 267 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_desktop_sound_invalid.error", nil, "", http.StatusBadRequest) 268 } 269 270 if data.NotifyProps.Email != nil && !model.IsValidTrueOrFalseString(*data.NotifyProps.Email) { 271 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_email_invalid.error", nil, "", http.StatusBadRequest) 272 } 273 274 if data.NotifyProps.Mobile != nil && !model.IsValidUserNotifyLevel(*data.NotifyProps.Mobile) { 275 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_mobile_invalid.error", nil, "", http.StatusBadRequest) 276 } 277 278 if data.NotifyProps.MobilePushStatus != nil && !model.IsValidPushStatusNotifyLevel(*data.NotifyProps.MobilePushStatus) { 279 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_mobile_push_status_invalid.error", nil, "", http.StatusBadRequest) 280 } 281 282 if data.NotifyProps.ChannelTrigger != nil && !model.IsValidTrueOrFalseString(*data.NotifyProps.ChannelTrigger) { 283 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_channel_trigger_invalid.error", nil, "", http.StatusBadRequest) 284 } 285 286 if data.NotifyProps.CommentsTrigger != nil && !model.IsValidCommentsNotifyLevel(*data.NotifyProps.CommentsTrigger) { 287 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.notify_props_comments_trigger_invalid.error", nil, "", http.StatusBadRequest) 288 } 289 } 290 291 if data.UseMarkdownPreview != nil && !model.IsValidTrueOrFalseString(*data.UseMarkdownPreview) { 292 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.advanced_props_feature_markdown_preview.error", nil, "", http.StatusBadRequest) 293 } 294 295 if data.UseFormatting != nil && !model.IsValidTrueOrFalseString(*data.UseFormatting) { 296 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.advanced_props_formatting.error", nil, "", http.StatusBadRequest) 297 } 298 299 if data.ShowUnreadSection != nil && !model.IsValidTrueOrFalseString(*data.ShowUnreadSection) { 300 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.advanced_props_show_unread_section.error", nil, "", http.StatusBadRequest) 301 } 302 303 if data.EmailInterval != nil && !model.IsValidEmailBatchingInterval(*data.EmailInterval) { 304 return model.NewAppError("BulkImport", "app.import.validate_user_import_data.advanced_props_email_interval.error", nil, "", http.StatusBadRequest) 305 } 306 307 if data.Teams != nil { 308 return validateUserTeamsImportData(data.Teams) 309 } 310 311 return nil 312 } 313 314 func validateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError { 315 if data == nil { 316 return nil 317 } 318 319 for _, tdata := range *data { 320 if tdata.Name == nil { 321 return model.NewAppError("BulkImport", "app.import.validate_user_teams_import_data.team_name_missing.error", nil, "", http.StatusBadRequest) 322 } 323 324 if tdata.Roles != nil && !model.IsValidUserRoles(*tdata.Roles) { 325 return model.NewAppError("BulkImport", "app.import.validate_user_teams_import_data.invalid_roles.error", nil, "", http.StatusBadRequest) 326 } 327 328 if tdata.Channels != nil { 329 if err := validateUserChannelsImportData(tdata.Channels); err != nil { 330 return err 331 } 332 } 333 334 if tdata.Theme != nil && 0 < len(strings.Trim(*tdata.Theme, " \t\r")) { 335 var unused map[string]string 336 if err := json.NewDecoder(strings.NewReader(*tdata.Theme)).Decode(&unused); err != nil { 337 return model.NewAppError("BulkImport", "app.import.validate_user_teams_import_data.invalid_team_theme.error", nil, err.Error(), http.StatusBadRequest) 338 } 339 } 340 } 341 342 return nil 343 } 344 345 func validateUserChannelsImportData(data *[]UserChannelImportData) *model.AppError { 346 if data == nil { 347 return nil 348 } 349 350 for _, cdata := range *data { 351 if cdata.Name == nil { 352 return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.channel_name_missing.error", nil, "", http.StatusBadRequest) 353 } 354 355 if cdata.Roles != nil && !model.IsValidUserRoles(*cdata.Roles) { 356 return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.invalid_roles.error", nil, "", http.StatusBadRequest) 357 } 358 359 if cdata.NotifyProps != nil { 360 if cdata.NotifyProps.Desktop != nil && !model.IsChannelNotifyLevelValid(*cdata.NotifyProps.Desktop) { 361 return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.invalid_notify_props_desktop.error", nil, "", http.StatusBadRequest) 362 } 363 364 if cdata.NotifyProps.Mobile != nil && !model.IsChannelNotifyLevelValid(*cdata.NotifyProps.Mobile) { 365 return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.invalid_notify_props_mobile.error", nil, "", http.StatusBadRequest) 366 } 367 368 if cdata.NotifyProps.MarkUnread != nil && !model.IsChannelMarkUnreadLevelValid(*cdata.NotifyProps.MarkUnread) { 369 return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.invalid_notify_props_mark_unread.error", nil, "", http.StatusBadRequest) 370 } 371 } 372 } 373 374 return nil 375 } 376 377 func validateReactionImportData(data *ReactionImportData, parentCreateAt int64) *model.AppError { 378 if data.User == nil { 379 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.user_missing.error", nil, "", http.StatusBadRequest) 380 } 381 382 if data.EmojiName == nil { 383 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.emoji_name_missing.error", nil, "", http.StatusBadRequest) 384 } else if utf8.RuneCountInString(*data.EmojiName) > model.EMOJI_NAME_MAX_LENGTH { 385 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.emoji_name_length.error", nil, "", http.StatusBadRequest) 386 } 387 388 if data.CreateAt == nil { 389 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_missing.error", nil, "", http.StatusBadRequest) 390 } else if *data.CreateAt == 0 { 391 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_zero.error", nil, "", http.StatusBadRequest) 392 } else if *data.CreateAt < parentCreateAt { 393 return model.NewAppError("BulkImport", "app.import.validate_reaction_import_data.create_at_before_parent.error", nil, "", http.StatusBadRequest) 394 } 395 396 return nil 397 } 398 399 func validateReplyImportData(data *ReplyImportData, parentCreateAt int64, maxPostSize int) *model.AppError { 400 if data.User == nil { 401 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.user_missing.error", nil, "", http.StatusBadRequest) 402 } 403 404 if data.Message == nil { 405 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.message_missing.error", nil, "", http.StatusBadRequest) 406 } else if utf8.RuneCountInString(*data.Message) > maxPostSize { 407 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.message_length.error", nil, "", http.StatusBadRequest) 408 } 409 410 if data.CreateAt == nil { 411 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_missing.error", nil, "", http.StatusBadRequest) 412 } else if *data.CreateAt == 0 { 413 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_zero.error", nil, "", http.StatusBadRequest) 414 } else if *data.CreateAt < parentCreateAt { 415 return model.NewAppError("BulkImport", "app.import.validate_reply_import_data.create_at_before_parent.error", nil, "", http.StatusBadRequest) 416 } 417 418 return nil 419 } 420 421 func validatePostImportData(data *PostImportData, maxPostSize int) *model.AppError { 422 if data.Team == nil { 423 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.team_missing.error", nil, "", http.StatusBadRequest) 424 } 425 426 if data.Channel == nil { 427 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.channel_missing.error", nil, "", http.StatusBadRequest) 428 } 429 430 if data.User == nil { 431 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.user_missing.error", nil, "", http.StatusBadRequest) 432 } 433 434 if data.Message == nil { 435 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.message_missing.error", nil, "", http.StatusBadRequest) 436 } else if utf8.RuneCountInString(*data.Message) > maxPostSize { 437 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.message_length.error", nil, "", http.StatusBadRequest) 438 } 439 440 if data.CreateAt == nil { 441 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.create_at_missing.error", nil, "", http.StatusBadRequest) 442 } else if *data.CreateAt == 0 { 443 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.create_at_zero.error", nil, "", http.StatusBadRequest) 444 } 445 446 if data.Reactions != nil { 447 for _, reaction := range *data.Reactions { 448 reaction := reaction 449 validateReactionImportData(&reaction, *data.CreateAt) 450 } 451 } 452 453 if data.Replies != nil { 454 for _, reply := range *data.Replies { 455 reply := reply 456 validateReplyImportData(&reply, *data.CreateAt, maxPostSize) 457 } 458 } 459 460 if data.Props != nil && utf8.RuneCountInString(model.StringInterfaceToJson(*data.Props)) > model.POST_PROPS_MAX_RUNES { 461 return model.NewAppError("BulkImport", "app.import.validate_post_import_data.props_too_large.error", nil, "", http.StatusBadRequest) 462 } 463 464 return nil 465 } 466 467 func validateDirectChannelImportData(data *DirectChannelImportData) *model.AppError { 468 if data.Members == nil { 469 return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.members_required.error", nil, "", http.StatusBadRequest) 470 } 471 472 if len(*data.Members) != 2 { 473 if len(*data.Members) < model.CHANNEL_GROUP_MIN_USERS { 474 return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.members_too_few.error", nil, "", http.StatusBadRequest) 475 } else if len(*data.Members) > model.CHANNEL_GROUP_MAX_USERS { 476 return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.members_too_many.error", nil, "", http.StatusBadRequest) 477 } 478 } 479 480 if data.Header != nil && utf8.RuneCountInString(*data.Header) > model.CHANNEL_HEADER_MAX_RUNES { 481 return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.header_length.error", nil, "", http.StatusBadRequest) 482 } 483 484 if data.FavoritedBy != nil { 485 for _, favoriter := range *data.FavoritedBy { 486 found := false 487 for _, member := range *data.Members { 488 if favoriter == member { 489 found = true 490 break 491 } 492 } 493 if !found { 494 return model.NewAppError("BulkImport", "app.import.validate_direct_channel_import_data.unknown_favoriter.error", map[string]interface{}{"Username": favoriter}, "", http.StatusBadRequest) 495 } 496 } 497 } 498 499 return nil 500 } 501 502 func validateDirectPostImportData(data *DirectPostImportData, maxPostSize int) *model.AppError { 503 if data.ChannelMembers == nil { 504 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.channel_members_required.error", nil, "", http.StatusBadRequest) 505 } 506 507 if len(*data.ChannelMembers) != 2 { 508 if len(*data.ChannelMembers) < model.CHANNEL_GROUP_MIN_USERS { 509 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.channel_members_too_few.error", nil, "", http.StatusBadRequest) 510 } else if len(*data.ChannelMembers) > model.CHANNEL_GROUP_MAX_USERS { 511 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.channel_members_too_many.error", nil, "", http.StatusBadRequest) 512 } 513 } 514 515 if data.User == nil { 516 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.user_missing.error", nil, "", http.StatusBadRequest) 517 } 518 519 if data.Message == nil { 520 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.message_missing.error", nil, "", http.StatusBadRequest) 521 } else if utf8.RuneCountInString(*data.Message) > maxPostSize { 522 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.message_length.error", nil, "", http.StatusBadRequest) 523 } 524 525 if data.CreateAt == nil { 526 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.create_at_missing.error", nil, "", http.StatusBadRequest) 527 } else if *data.CreateAt == 0 { 528 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.create_at_zero.error", nil, "", http.StatusBadRequest) 529 } 530 531 if data.FlaggedBy != nil { 532 for _, flagger := range *data.FlaggedBy { 533 found := false 534 for _, member := range *data.ChannelMembers { 535 if flagger == member { 536 found = true 537 break 538 } 539 } 540 if !found { 541 return model.NewAppError("BulkImport", "app.import.validate_direct_post_import_data.unknown_flagger.error", map[string]interface{}{"Username": flagger}, "", http.StatusBadRequest) 542 } 543 } 544 } 545 546 if data.Reactions != nil { 547 for _, reaction := range *data.Reactions { 548 reaction := reaction 549 validateReactionImportData(&reaction, *data.CreateAt) 550 } 551 } 552 553 if data.Replies != nil { 554 for _, reply := range *data.Replies { 555 reply := reply 556 validateReplyImportData(&reply, *data.CreateAt, maxPostSize) 557 } 558 } 559 560 return nil 561 } 562 563 func validateEmojiImportData(data *EmojiImportData) *model.AppError { 564 if data == nil { 565 return model.NewAppError("BulkImport", "app.import.validate_emoji_import_data.empty.error", nil, "", http.StatusBadRequest) 566 } 567 568 if data.Name == nil || *data.Name == "" { 569 return model.NewAppError("BulkImport", "app.import.validate_emoji_import_data.name_missing.error", nil, "", http.StatusBadRequest) 570 } 571 572 if err := model.IsValidEmojiName(*data.Name); err != nil { 573 return err 574 } 575 576 if data.Image == nil || *data.Image == "" { 577 return model.NewAppError("BulkImport", "app.import.validate_emoji_import_data.image_missing.error", nil, "", http.StatusBadRequest) 578 } 579 580 return nil 581 }