* MM-38982: fixes SVG uploading

Uploading SVG files was "almost" treated like an image in some places,
resulting in not showing the SVG on the client.
This is happening because when we fail to generate a mini preview for an
image, we prepend "invalid-" to the MimeType.

This commit adds a check to guard against SVG files in methods that make
no sense for SVGs.

* Reverts invalid-{mimetype} fix

* Uses fileInfo.IsSvg() where it can
Этот коммит содержится в:
Kyriakos Z
2022-05-20 17:26:21 +03:00
коммит произвёл GitHub
родитель 2a9f78536f
Коммит 9a67ae9ac6
5 изменённых файлов: 12 добавлений и 17 удалений

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

@@ -249,7 +249,7 @@ func (a *App) getInfoForFilename(post *model.Post, teamID, channelID, userID, ol
info.UpdateAt = post.UpdateAt info.UpdateAt = post.UpdateAt
info.Path = path info.Path = path
if info.IsImage() { if info.IsImage() && !info.IsSvg() {
nameWithoutExtension := name[:strings.LastIndex(name, ".")] nameWithoutExtension := name[:strings.LastIndex(name, ".")]
info.PreviewPath = pathPrefix + nameWithoutExtension + "_preview.jpg" info.PreviewPath = pathPrefix + nameWithoutExtension + "_preview.jpg"
info.ThumbnailPath = pathPrefix + nameWithoutExtension + "_thumb.jpg" info.ThumbnailPath = pathPrefix + nameWithoutExtension + "_thumb.jpg"
@@ -752,7 +752,7 @@ func (a *App) UploadFileX(c *request.Context, channelID, name string, input io.R
func (t *UploadFileTask) preprocessImage() *model.AppError { func (t *UploadFileTask) preprocessImage() *model.AppError {
// If SVG, attempt to extract dimensions and then return // If SVG, attempt to extract dimensions and then return
if t.fileinfo.MimeType == "image/svg+xml" { if t.fileinfo.IsSvg() {
svgInfo, err := imaging.ParseSVG(t.teeInput) svgInfo, err := imaging.ParseSVG(t.teeInput)
if err != nil { if err != nil {
mlog.Warn("Failed to parse SVG", mlog.Err(err)) mlog.Warn("Failed to parse SVG", mlog.Err(err))
@@ -809,7 +809,7 @@ func (t *UploadFileTask) preprocessImage() *model.AppError {
func (t *UploadFileTask) postprocessImage(file io.Reader) { func (t *UploadFileTask) postprocessImage(file io.Reader) {
// don't try to process SVG files // don't try to process SVG files
if t.fileinfo.MimeType == "image/svg+xml" { if t.fileinfo.IsSvg() {
return return
} }
@@ -937,7 +937,7 @@ func (a *App) DoUploadFileExpectModification(c *request.Context, now time.Time,
pathPrefix := now.Format("20060102") + "/teams/" + teamID + "/channels/" + channelID + "/users/" + userID + "/" + info.Id + "/" pathPrefix := now.Format("20060102") + "/teams/" + teamID + "/channels/" + channelID + "/users/" + userID + "/" + info.Id + "/"
info.Path = pathPrefix + filename info.Path = pathPrefix + filename
if info.IsImage() { if info.IsImage() && !info.IsSvg() {
if limitErr := checkImageResolutionLimit(info.Width, info.Height, *a.Config().FileSettings.MaxImageResolution); limitErr != nil { if limitErr := checkImageResolutionLimit(info.Width, info.Height, *a.Config().FileSettings.MaxImageResolution); limitErr != nil {
err := model.NewAppError("uploadFile", "api.file.upload_file.large_image.app_error", map[string]interface{}{"Filename": filename}, limitErr.Error(), http.StatusBadRequest) err := model.NewAppError("uploadFile", "api.file.upload_file.large_image.app_error", map[string]interface{}{"Filename": filename}, limitErr.Error(), http.StatusBadRequest)
return nil, data, err return nil, data, err
@@ -1081,7 +1081,7 @@ func (a *App) generatePreviewImage(img image.Image, previewPath string) {
// generateMiniPreview updates mini preview if needed // generateMiniPreview updates mini preview if needed
// will save fileinfo with the preview added // will save fileinfo with the preview added
func (a *App) generateMiniPreview(fi *model.FileInfo) { func (a *App) generateMiniPreview(fi *model.FileInfo) {
if fi.IsImage() && fi.MiniPreview == nil { if fi.IsImage() && !fi.IsSvg() && fi.MiniPreview == nil {
file, appErr := a.FileReader(fi.Path) file, appErr := a.FileReader(fi.Path)
if appErr != nil { if appErr != nil {
mlog.Debug("error reading image file", mlog.Err(appErr)) mlog.Debug("error reading image file", mlog.Err(appErr))
@@ -1093,15 +1093,6 @@ func (a *App) generateMiniPreview(fi *model.FileInfo) {
mlog.Debug("generateMiniPreview: prepareImage failed", mlog.Err(err), mlog.Debug("generateMiniPreview: prepareImage failed", mlog.Err(err),
mlog.String("fileinfo_id", fi.Id), mlog.String("channel_id", fi.ChannelId), mlog.String("fileinfo_id", fi.Id), mlog.String("channel_id", fi.ChannelId),
mlog.String("creator_id", fi.CreatorId)) 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 return
} }
defer release() defer release()

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

@@ -1233,7 +1233,7 @@ func (a *App) importAttachment(c *request.Context, data *AttachmentImportData, p
return nil, appErr return nil, appErr
} }
if fileInfo.IsImage() { if fileInfo.IsImage() && !fileInfo.IsSvg() {
a.HandleImages([]string{fileInfo.PreviewPath}, []string{fileInfo.ThumbnailPath}, [][]byte{fileData}) a.HandleImages([]string{fileInfo.PreviewPath}, []string{fileInfo.ThumbnailPath}, [][]byte{fileData})
} }

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

@@ -263,7 +263,7 @@ func (a *App) UploadData(c *request.Context, us *model.UploadSession, rd io.Read
} }
// image post-processing // image post-processing
if info.IsImage() { if info.IsImage() && !info.IsSvg() {
if limitErr := checkImageResolutionLimit(info.Width, info.Height, *a.Config().FileSettings.MaxImageResolution); limitErr != nil { if limitErr := checkImageResolutionLimit(info.Width, info.Height, *a.Config().FileSettings.MaxImageResolution); limitErr != nil {
return nil, model.NewAppError("uploadData", "app.upload.upload_data.large_image.app_error", return nil, model.NewAppError("uploadData", "app.upload.upload_data.large_image.app_error",
map[string]interface{}{"Filename": us.Filename, "Width": info.Width, "Height": info.Height}, "", http.StatusBadRequest) map[string]interface{}{"Filename": us.Filename, "Width": info.Width, "Height": info.Height}, "", http.StatusBadRequest)

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

@@ -107,6 +107,10 @@ func (fi *FileInfo) IsImage() bool {
return strings.HasPrefix(fi.MimeType, "image") return strings.HasPrefix(fi.MimeType, "image")
} }
func (fi *FileInfo) IsSvg() bool {
return fi.MimeType == "image/svg+xml"
}
func NewInfo(name string) *FileInfo { func NewInfo(name string) *FileInfo {
info := &FileInfo{ info := &FileInfo{
Name: name, Name: name,

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

@@ -791,7 +791,7 @@ func (si *SlackImporter) oldImportFile(timestamp time.Time, file io.Reader, team
return nil, err return nil, err
} }
if fileInfo.IsImage() && fileInfo.MimeType != "image/svg+xml" { if fileInfo.IsImage() && !fileInfo.IsSvg() {
img, release, err := si.actions.PrepareImage(data) img, release, err := si.actions.PrepareImage(data)
if err != nil { if err != nil {
return nil, err return nil, err