Merge pull request #40 from mattermost/image-fix
HELIUM profile image now generates on each call if S3 is not configured
Этот коммит содержится в:
72
api/user.go
72
api/user.go
@@ -567,7 +567,7 @@ func getAudits(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createProfileImage(username string, userId string) *image.RGBA {
|
func createProfileImage(username string, userId string) ([]byte, *model.AppError) {
|
||||||
|
|
||||||
colors := []color.NRGBA{
|
colors := []color.NRGBA{
|
||||||
{197, 8, 126, 255},
|
{197, 8, 126, 255},
|
||||||
@@ -634,16 +634,17 @@ func createProfileImage(username string, userId string) *image.RGBA {
|
|||||||
gc.Translate(width, height)
|
gc.Translate(width, height)
|
||||||
gc.SetFillColor(image.White)
|
gc.SetFillColor(image.White)
|
||||||
gc.FillString(initials)
|
gc.FillString(initials)
|
||||||
return i
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
|
||||||
|
if imgErr := png.Encode(buf, i); imgErr != nil {
|
||||||
|
return nil, model.NewAppError("getProfileImage", "Could not encode default profile image", imgErr.Error())
|
||||||
|
} else {
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
|
func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||||
if !utils.IsS3Configured() {
|
|
||||||
c.Err = model.NewAppError("getProfileImage", "Unable to get image. Amazon S3 not configured. ", "")
|
|
||||||
c.Err.StatusCode = http.StatusNotImplemented
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
params := mux.Vars(r)
|
params := mux.Vars(r)
|
||||||
id := params["id"]
|
id := params["id"]
|
||||||
|
|
||||||
@@ -651,36 +652,41 @@ func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
c.Err = result.Err
|
c.Err = result.Err
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
var auth aws.Auth
|
|
||||||
auth.AccessKey = utils.Cfg.AWSSettings.S3AccessKeyId
|
|
||||||
auth.SecretKey = utils.Cfg.AWSSettings.S3SecretAccessKey
|
|
||||||
|
|
||||||
s := s3.New(auth, aws.Regions[utils.Cfg.AWSSettings.S3Region])
|
|
||||||
bucket := s.Bucket(utils.Cfg.AWSSettings.S3Bucket)
|
|
||||||
|
|
||||||
path := "teams/" + c.Session.TeamId + "/users/" + id + "/profile.png"
|
|
||||||
|
|
||||||
var img []byte
|
var img []byte
|
||||||
|
var err *model.AppError
|
||||||
|
|
||||||
if data, getErr := bucket.Get(path); getErr != nil {
|
if !utils.IsS3Configured() {
|
||||||
rawImg := createProfileImage(result.Data.(*model.User).Username, id)
|
img, err = createProfileImage(result.Data.(*model.User).Username, id)
|
||||||
buf := new(bytes.Buffer)
|
if err != nil {
|
||||||
|
c.Err = err
|
||||||
if imgErr := png.Encode(buf, rawImg); imgErr != nil {
|
|
||||||
c.Err = model.NewAppError("getProfileImage", "Could not encode default profile image", imgErr.Error())
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
img = buf.Bytes()
|
|
||||||
}
|
|
||||||
|
|
||||||
options := s3.Options{}
|
|
||||||
if err := bucket.Put(path, buf.Bytes(), "image", s3.Private, options); err != nil {
|
|
||||||
c.Err = model.NewAppError("getImage", "Couldn't upload default profile image", err.Error())
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
img = data
|
var auth aws.Auth
|
||||||
|
auth.AccessKey = utils.Cfg.AWSSettings.S3AccessKeyId
|
||||||
|
auth.SecretKey = utils.Cfg.AWSSettings.S3SecretAccessKey
|
||||||
|
|
||||||
|
s := s3.New(auth, aws.Regions[utils.Cfg.AWSSettings.S3Region])
|
||||||
|
bucket := s.Bucket(utils.Cfg.AWSSettings.S3Bucket)
|
||||||
|
|
||||||
|
path := "teams/" + c.Session.TeamId + "/users/" + id + "/profile.png"
|
||||||
|
|
||||||
|
if data, getErr := bucket.Get(path); getErr != nil {
|
||||||
|
img, err = createProfileImage(result.Data.(*model.User).Username, id)
|
||||||
|
if err != nil {
|
||||||
|
c.Err = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
options := s3.Options{}
|
||||||
|
if err := bucket.Put(path, img, "image", s3.Private, options); err != nil {
|
||||||
|
c.Err = model.NewAppError("getImage", "Couldn't upload default profile image", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
img = data
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Session.UserId == id {
|
if c.Session.UserId == id {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/goamz/goamz/s3"
|
"github.com/goamz/goamz/s3"
|
||||||
"github.com/mattermost/platform/model"
|
"github.com/mattermost/platform/model"
|
||||||
"github.com/mattermost/platform/utils"
|
"github.com/mattermost/platform/utils"
|
||||||
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"io"
|
"io"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
@@ -324,14 +325,20 @@ func TestGetAudits(t *testing.T) {
|
|||||||
func TestUserCreateImage(t *testing.T) {
|
func TestUserCreateImage(t *testing.T) {
|
||||||
Setup()
|
Setup()
|
||||||
|
|
||||||
i := createProfileImage("Corey Hulen", "eo1zkdr96pdj98pjmq8zy35wba")
|
b, err := createProfileImage("Corey Hulen", "eo1zkdr96pdj98pjmq8zy35wba")
|
||||||
if i == nil {
|
if err != nil {
|
||||||
t.Fatal("Failed to gen image")
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rdr := bytes.NewReader(b)
|
||||||
|
img, _, err2 := image.Decode(rdr)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
colorful := color.RGBA{116, 49, 196, 255}
|
colorful := color.RGBA{116, 49, 196, 255}
|
||||||
|
|
||||||
if i.RGBAAt(1, 1) != colorful {
|
if img.At(1, 1) != colorful {
|
||||||
t.Fatal("Failed to create correct color")
|
t.Fatal("Failed to create correct color")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user