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  }