From c82a84ed765bd9c4d601b93201d93af92f6ee742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Tue, 2 Oct 2018 08:04:38 +0200 Subject: MM-12067: Add SetDefaultProfileImage to reset the user profile image to a generated one (#9449) * MM-12067: Add SetDefaultProfileImage to reset the user profile image to a generated one * Allow to get the default profile image for my user * Allowing to reset the last update image date to 0 * PR reviews --- app/user.go | 76 +++++++++++++++++++++++++++++++++++++++++--------------- app/user_test.go | 34 +++++++++++++++++++------ 2 files changed, 83 insertions(+), 27 deletions(-) (limited to 'app') diff --git a/app/user.go b/app/user.go index 86f44db4e..1faf2b895 100644 --- a/app/user.go +++ b/app/user.go @@ -745,36 +745,72 @@ func getFont(initialFont string) (*truetype.Font, error) { } func (a *App) GetProfileImage(user *model.User) ([]byte, bool, *model.AppError) { - var img []byte - readFailed := false - if len(*a.Config().FileSettings.DriverName) == 0 { - var err *model.AppError - if img, err = CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont); err != nil { - return nil, false, err + img, appErr := CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont) + if appErr != nil { + return nil, false, appErr } - } else { - path := "users/" + user.Id + "/profile.png" + return img, false, nil + } - if data, err := a.ReadFile(path); err != nil { - readFailed = true + path := "users/" + user.Id + "/profile.png" - if img, err = CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont); err != nil { + data, err := a.ReadFile(path) + if err != nil { + img, appErr := CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont) + if appErr != nil { + return nil, false, appErr + } + + if user.LastPictureUpdate == 0 { + if _, err := a.WriteFile(bytes.NewReader(img), path); err != nil { return nil, false, err } + } + return img, true, nil + } - if user.LastPictureUpdate == 0 { - if _, err := a.WriteFile(bytes.NewReader(img), path); err != nil { - return nil, false, err - } - } + return data, false, nil +} - } else { - img = data - } +func (a *App) GetDefaultProfileImage(user *model.User) ([]byte, *model.AppError) { + img, appErr := CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont) + if appErr != nil { + return nil, appErr } + return img, nil +} - return img, readFailed, nil +func (a *App) SetDefaultProfileImage(user *model.User) *model.AppError { + img, appErr := CreateProfileImage(user.Username, user.Id, a.Config().FileSettings.InitialFont) + if appErr != nil { + return appErr + } + + path := "users/" + user.Id + "/profile.png" + + if _, err := a.WriteFile(bytes.NewReader(img), path); err != nil { + return err + } + + <-a.Srv.Store.User().ResetLastPictureUpdate(user.Id) + + a.InvalidateCacheForUser(user.Id) + + updatedUser, appErr := a.GetUser(user.Id) + if appErr != nil { + mlog.Error(fmt.Sprintf("Error in getting users profile for id=%v forcing logout", user.Id), mlog.String("user_id", user.Id)) + return nil + } + + options := a.Config().GetSanitizeOptions() + updatedUser.SanitizeProfile(options) + + message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_USER_UPDATED, "", "", "", nil) + message.Add("user", updatedUser) + a.Publish(message) + + return nil } func (a *App) SetProfileImage(userId string, imageData *multipart.FileHeader) *model.AppError { diff --git a/app/user_test.go b/app/user_test.go index a007f93d5..465d2a994 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -14,6 +14,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/mattermost/mattermost-server/einterfaces" "github.com/mattermost/mattermost-server/model" @@ -115,6 +116,25 @@ func TestCreateProfileImage(t *testing.T) { } } +func TestSetDefaultProfileImage(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + err := th.App.SetDefaultProfileImage(&model.User{ + Id: model.NewId(), + Username: "notvaliduser", + }) + require.Error(t, err) + + user := th.BasicUser + + err = th.App.SetDefaultProfileImage(user) + require.Nil(t, err) + + user = getUserFromDB(th.App, user.Id, t) + assert.Equal(t, int64(0), user.LastPictureUpdate) +} + func TestUpdateUserToRestrictedDomain(t *testing.T) { th := Setup() defer th.TearDown() @@ -249,12 +269,12 @@ func TestUpdateOAuthUserAttrs(t *testing.T) { } func getUserFromDB(a *App, id string, t *testing.T) *model.User { - if user, err := a.GetUser(id); err != nil { + user, err := a.GetUser(id) + if err != nil { t.Fatal("user is not found", err) return nil - } else { - return user } + return user } func getGitlabUserPayload(gitlabUser oauthgitlab.GitLabUser, t *testing.T) []byte { @@ -530,10 +550,10 @@ func TestRecordUserServiceTermsAction(t *testing.T) { defer th.TearDown() user := &model.User{ - Email: strings.ToLower(model.NewId()) + "success+test@example.com", - Nickname: "Luke Skywalker", // trying to bring balance to the "Force", one test user at a time - Username: "luke" + model.NewId(), - Password: "passwd1", + Email: strings.ToLower(model.NewId()) + "success+test@example.com", + Nickname: "Luke Skywalker", // trying to bring balance to the "Force", one test user at a time + Username: "luke" + model.NewId(), + Password: "passwd1", AuthService: "", } user, err := th.App.CreateUser(user) -- cgit v1.2.3-1-g7c22