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.
Этот коммит содержится в:
коммит произвёл
Corey Hulen
родитель
d409c7c1c6
Коммит
f520aa1f4d
@@ -244,6 +244,7 @@ func trackConfig() {
|
||||
"enable_public_links": utils.Cfg.FileSettings.EnablePublicLink,
|
||||
"driver_name": utils.Cfg.FileSettings.DriverName,
|
||||
"amazon_s3_ssl": *utils.Cfg.FileSettings.AmazonS3SSL,
|
||||
"amazon_s3_signv2": *utils.Cfg.FileSettings.AmazonS3SignV2,
|
||||
"thumbnail_width": utils.Cfg.FileSettings.ThumbnailWidth,
|
||||
"thumbnail_height": utils.Cfg.FileSettings.ThumbnailHeight,
|
||||
"preview_width": utils.Cfg.FileSettings.PreviewWidth,
|
||||
|
||||
19
app/file.go
19
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)
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user