github.com/adacta-ru/mattermost-server/v6@v6.0.0/app/brand.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 "bytes" 8 "image" 9 _ "image/gif" 10 _ "image/jpeg" 11 "image/png" 12 "mime/multipart" 13 "net/http" 14 "time" 15 16 "github.com/adacta-ru/mattermost-server/v6/model" 17 ) 18 19 const ( 20 BRAND_FILE_PATH = "brand/" 21 BRAND_FILE_NAME = "image.png" 22 ) 23 24 func (a *App) SaveBrandImage(imageData *multipart.FileHeader) *model.AppError { 25 if len(*a.Config().FileSettings.DriverName) == 0 { 26 return model.NewAppError("SaveBrandImage", "api.admin.upload_brand_image.storage.app_error", nil, "", http.StatusNotImplemented) 27 } 28 29 file, err := imageData.Open() 30 if err != nil { 31 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.open.app_error", nil, err.Error(), http.StatusBadRequest) 32 } 33 defer file.Close() 34 35 // Decode image config first to check dimensions before loading the whole thing into memory later on 36 config, _, err := image.DecodeConfig(file) 37 if err != nil { 38 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.decode_config.app_error", nil, err.Error(), http.StatusBadRequest) 39 } 40 41 // This casting is done to prevent overflow on 32 bit systems (not needed 42 // in 64 bits systems because images can't have more than 32 bits height or 43 // width) 44 if int64(config.Width)*int64(config.Height) > model.MaxImageSize { 45 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.too_large.app_error", nil, "", http.StatusBadRequest) 46 } 47 48 file.Seek(0, 0) 49 50 img, _, err := image.Decode(file) 51 if err != nil { 52 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.decode.app_error", nil, err.Error(), http.StatusBadRequest) 53 } 54 55 buf := new(bytes.Buffer) 56 err = png.Encode(buf, img) 57 if err != nil { 58 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.encode.app_error", nil, err.Error(), http.StatusInternalServerError) 59 } 60 61 t := time.Now() 62 a.MoveFile(BRAND_FILE_PATH+BRAND_FILE_NAME, BRAND_FILE_PATH+t.Format("2006-01-02T15:04:05")+".png") 63 64 if _, err := a.WriteFile(buf, BRAND_FILE_PATH+BRAND_FILE_NAME); err != nil { 65 return model.NewAppError("SaveBrandImage", "brand.save_brand_image.save_image.app_error", nil, "", http.StatusInternalServerError) 66 } 67 68 return nil 69 } 70 71 func (a *App) GetBrandImage() ([]byte, *model.AppError) { 72 if len(*a.Config().FileSettings.DriverName) == 0 { 73 return nil, model.NewAppError("GetBrandImage", "api.admin.get_brand_image.storage.app_error", nil, "", http.StatusNotImplemented) 74 } 75 76 img, err := a.ReadFile(BRAND_FILE_PATH + BRAND_FILE_NAME) 77 if err != nil { 78 return nil, err 79 } 80 81 return img, nil 82 } 83 84 func (a *App) DeleteBrandImage() *model.AppError { 85 filePath := BRAND_FILE_PATH + BRAND_FILE_NAME 86 87 fileExists, err := a.FileExists(filePath) 88 89 if err != nil { 90 return err 91 } 92 93 if !fileExists { 94 return model.NewAppError("DeleteBrandImage", "api.admin.delete_brand_image.storage.not_found", nil, "", http.StatusNotFound) 95 } 96 97 return a.RemoveFile(filePath) 98 }