From e39ab5c7dcfd6f16264b4a601aca7fa5a572dccf Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Mon, 10 Sep 2018 07:38:04 -0400 Subject: MM-12007 Add max dimensions to emoji images (#9379) --- api4/emoji_test.go | 19 +++++++++++++++---- app/emoji.go | 13 ++++++++++--- i18n/en.json | 4 ++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/api4/emoji_test.go b/api4/emoji_test.go index 1a9dc8e0f..e3aca4497 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -9,6 +9,7 @@ import ( _ "image/gif" "testing" + "github.com/mattermost/mattermost-server/app" "github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/utils" @@ -105,16 +106,26 @@ func TestCreateEmoji(t *testing.T) { t.Fatal("create with wrong name") } + // try to create an emoji that's too wide + emoji = &model.Emoji{ + CreatorId: th.BasicUser.Id, + Name: model.NewId(), + } + + newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, app.MaxEmojiOriginalWidth+1), "image.gif") + if resp.Error == nil { + t.Fatal("should fail - emoji is too wide") + } + // try to create an emoji that's too tall emoji = &model.Emoji{ CreatorId: th.BasicUser.Id, Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 1000), "image.gif") - CheckNoError(t, resp) - if newEmoji.Name != emoji.Name { - t.Fatal("create with wrong name") + newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, app.MaxEmojiOriginalHeight+1, 10), "image.gif") + if resp.Error == nil { + t.Fatal("should fail - emoji is too tall") } // try to create an emoji that's too large diff --git a/app/emoji.go b/app/emoji.go index b07331e65..864dc31bf 100644 --- a/app/emoji.go +++ b/app/emoji.go @@ -23,9 +23,11 @@ import ( ) const ( - MaxEmojiFileSize = 1 << 20 // 1 MB - MaxEmojiWidth = 128 - MaxEmojiHeight = 128 + MaxEmojiFileSize = 1 << 20 // 1 MB + MaxEmojiWidth = 128 + MaxEmojiHeight = 128 + MaxEmojiOriginalWidth = 1028 + MaxEmojiOriginalHeight = 1028 ) func (a *App) CreateEmoji(sessionUserId string, emoji *model.Emoji, multiPartImageData *multipart.Form) (*model.Emoji, *model.AppError) { @@ -85,6 +87,11 @@ func (a *App) UploadEmojiImage(id string, imageData *multipart.FileHeader) *mode // make sure the file is an image and is within the required dimensions if config, _, err := image.DecodeConfig(bytes.NewReader(buf.Bytes())); err != nil { return model.NewAppError("uploadEmojiImage", "api.emoji.upload.image.app_error", nil, "", http.StatusBadRequest) + } else if config.Width > MaxEmojiOriginalWidth || config.Height > MaxEmojiOriginalHeight { + return model.NewAppError("uploadEmojiImage", "api.emoji.upload.large_image.too_large.app_error", map[string]interface{}{ + "MaxWidth": MaxEmojiOriginalWidth, + "MaxHeight": MaxEmojiOriginalHeight, + }, "", http.StatusBadRequest) } else if config.Width > MaxEmojiWidth || config.Height > MaxEmojiHeight { data := buf.Bytes() newbuf := bytes.NewBuffer(nil) diff --git a/i18n/en.json b/i18n/en.json index 5345fa0cf..0ad1722fc 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1008,6 +1008,10 @@ "id": "api.emoji.upload.image.app_error", "translation": "Unable to create emoji. File must be a PNG, JPEG, or GIF." }, + { + "id": "api.emoji.upload.large_image.too_large.app_error", + "translation": "Unable to create emoji. Image must be smaller than {{.MaxWidth}} by {{.MaxHeight}}." + }, { "id": "api.emoji.upload.large_image.decode_error", "translation": "Unable to create emoji. An error occurred when trying to decode the image." -- cgit v1.2.3-1-g7c22