From f520aa1f4d18a65919c22240a4d0352022d6ca1b Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 30 May 2017 16:12:24 -0700 Subject: Support AWS Signature V2 for Mattermost for S3 storage. (#6462) Certain S3 compatible servers only use Legacy Signature (AWS Signature V2), current code only supports signature v4. This PR adds facility to click a button on the UI to enable legacy signature with S3 compatible servers. --- app/file.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'app/file.go') diff --git a/app/file.go b/app/file.go index 3b7a6860c..f46dd50ec 100644 --- a/app/file.go +++ b/app/file.go @@ -56,13 +56,23 @@ const ( MaxImageSize = 6048 * 4032 // 24 megapixels, roughly 36MB as a raw image ) +// Similar to s3.New() but allows initialization of signature v2 or signature v4 client. +// If signV2 input is false, function always returns signature v4. +func s3New(endpoint, accessKey, secretKey string, secure bool, signV2 bool) (*s3.Client, error) { + if signV2 { + return s3.NewV2(endpoint, accessKey, secretKey, secure) + } + return s3.NewV4(endpoint, accessKey, secretKey, secure) +} + func ReadFile(path string) ([]byte, *model.AppError) { if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 { endpoint := utils.Cfg.FileSettings.AmazonS3Endpoint accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL - s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) + signV2 := *utils.Cfg.FileSettings.AmazonS3SignV2 + s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2) if err != nil { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.s3.app_error", nil, err.Error()) } @@ -94,7 +104,8 @@ func MoveFile(oldPath, newPath string) *model.AppError { accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL - s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) + signV2 := *utils.Cfg.FileSettings.AmazonS3SignV2 + s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2) if err != nil { return model.NewLocAppError("moveFile", "api.file.write_file.s3.app_error", nil, err.Error()) } @@ -128,10 +139,12 @@ func WriteFile(f []byte, path string) *model.AppError { accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL - s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) + signV2 := *utils.Cfg.FileSettings.AmazonS3SignV2 + s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2) if err != nil { return model.NewLocAppError("WriteFile", "api.file.write_file.s3.app_error", nil, err.Error()) } + bucket := utils.Cfg.FileSettings.AmazonS3Bucket ext := filepath.Ext(path) -- cgit v1.2.3-1-g7c22