MM-38774 - partial fix for: Community running out of memory (#18445)
* prevent invalid images from entering generateMiniPreview in the future * fixing err, err2, imgErr * linting * load actual pngs and gifs in tests * consistent style
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
f27f7bfe79
Коммит
b0f26cedf2
@@ -775,8 +775,14 @@ func TestGetFileHeaders(t *testing.T) {
|
||||
t.Skip("skipping because no file driver is enabled")
|
||||
}
|
||||
|
||||
testHeaders := func(data []byte, filename string, expectedContentType string, getInline bool) func(*testing.T) {
|
||||
testHeaders := func(data []byte, filename string, expectedContentType string, getInline bool, loadFile bool) func(*testing.T) {
|
||||
return func(t *testing.T) {
|
||||
if loadFile {
|
||||
var err error
|
||||
data, err = testutils.ReadTestFile(filename)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
fileResp, _, err := client.UploadFile(data, channel.Id, filename)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -803,20 +809,20 @@ func TestGetFileHeaders(t *testing.T) {
|
||||
|
||||
data := []byte("ABC")
|
||||
|
||||
t.Run("png", testHeaders(data, "test.png", "image/png", true))
|
||||
t.Run("gif", testHeaders(data, "test.gif", "image/gif", true))
|
||||
t.Run("mp4", testHeaders(data, "test.mp4", "video/mp4", true))
|
||||
t.Run("mp3", testHeaders(data, "test.mp3", "audio/mpeg", true))
|
||||
t.Run("pdf", testHeaders(data, "test.pdf", "application/pdf", false))
|
||||
t.Run("txt", testHeaders(data, "test.txt", "text/plain", false))
|
||||
t.Run("html", testHeaders(data, "test.html", "text/plain", false))
|
||||
t.Run("js", testHeaders(data, "test.js", "text/plain", false))
|
||||
t.Run("go", testHeaders(data, "test.go", "application/octet-stream", false))
|
||||
t.Run("zip", testHeaders(data, "test.zip", "application/zip", false))
|
||||
t.Run("png", testHeaders(data, "test.png", "image/png", true, true))
|
||||
t.Run("gif", testHeaders(data, "testgif.gif", "image/gif", true, true))
|
||||
t.Run("mp4", testHeaders(data, "test.mp4", "video/mp4", true, false))
|
||||
t.Run("mp3", testHeaders(data, "test.mp3", "audio/mpeg", true, false))
|
||||
t.Run("pdf", testHeaders(data, "test.pdf", "application/pdf", false, false))
|
||||
t.Run("txt", testHeaders(data, "test.txt", "text/plain", false, false))
|
||||
t.Run("html", testHeaders(data, "test.html", "text/plain", false, false))
|
||||
t.Run("js", testHeaders(data, "test.js", "text/plain", false, false))
|
||||
t.Run("go", testHeaders(data, "test.go", "application/octet-stream", false, false))
|
||||
t.Run("zip", testHeaders(data, "test.zip", "application/zip", false, false))
|
||||
// Not every platform can recognize these
|
||||
//t.Run("exe", testHeaders(data, "test.exe", "application/x-ms", false))
|
||||
t.Run("no extension", testHeaders(data, "test", "application/octet-stream", false))
|
||||
t.Run("no extension 2", testHeaders([]byte("<html></html>"), "test", "application/octet-stream", false))
|
||||
t.Run("no extension", testHeaders(data, "test", "application/octet-stream", false, false))
|
||||
t.Run("no extension 2", testHeaders([]byte("<html></html>"), "test", "application/octet-stream", false, false))
|
||||
}
|
||||
|
||||
func TestGetFileThumbnail(t *testing.T) {
|
||||
|
||||
28
app/file.go
28
app/file.go
@@ -1118,28 +1118,38 @@ func (a *App) generatePreviewImage(img image.Image, previewPath string) {
|
||||
// will save fileinfo with the preview added
|
||||
func (a *App) generateMiniPreview(fi *model.FileInfo) {
|
||||
if fi.IsImage() && fi.MiniPreview == nil {
|
||||
file, err := a.FileReader(fi.Path)
|
||||
if err != nil {
|
||||
mlog.Debug("error reading image file", mlog.Err(err))
|
||||
file, appErr := a.FileReader(fi.Path)
|
||||
if appErr != nil {
|
||||
mlog.Debug("error reading image file", mlog.Err(appErr))
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
img, release, imgErr := prepareImage(a.srv.imgDecoder, file)
|
||||
if imgErr != nil {
|
||||
mlog.Debug("generateMiniPreview: prepareImage failed", mlog.Err(imgErr),
|
||||
img, release, err := prepareImage(a.srv.imgDecoder, file)
|
||||
if err != nil {
|
||||
mlog.Debug("generateMiniPreview: prepareImage failed", mlog.Err(err),
|
||||
mlog.String("fileinfo_id", fi.Id), mlog.String("channel_id", fi.ChannelId),
|
||||
mlog.String("creator_id", fi.CreatorId))
|
||||
|
||||
// Since this file is not a valid image (for whatever reason), prevent this fileInfo
|
||||
// from entering generateMiniPreview in the future
|
||||
fi.UpdateAt = model.GetMillis()
|
||||
fi.MimeType = "invalid-" + fi.MimeType
|
||||
if _, err = a.Srv().Store.FileInfo().Upsert(fi); err != nil {
|
||||
mlog.Debug("Invalidating FileInfo failed", mlog.Err(err))
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
defer release()
|
||||
if miniPreview, err := imaging.GenerateMiniPreviewImage(img,
|
||||
var miniPreview []byte
|
||||
if miniPreview, err = imaging.GenerateMiniPreviewImage(img,
|
||||
miniPreviewImageWidth, miniPreviewImageHeight, jpegEncQuality); err != nil {
|
||||
mlog.Info("Unable to generate mini preview image", mlog.Err(err))
|
||||
} else {
|
||||
fi.MiniPreview = &miniPreview
|
||||
}
|
||||
if _, appErr := a.Srv().Store.FileInfo().Upsert(fi); appErr != nil {
|
||||
mlog.Debug("creating mini preview failed", mlog.Err(appErr))
|
||||
if _, err = a.Srv().Store.FileInfo().Upsert(fi); err != nil {
|
||||
mlog.Debug("creating mini preview failed", mlog.Err(err))
|
||||
} else {
|
||||
a.Srv().Store.FileInfo().InvalidateFileInfosForPostCache(fi.PostId, false)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user