[MM-43444] Delete profile image and invalidate cache on permanent user deletion (#20033)

* Delete profile image and invalidate cache on permanent user deletion

* Modify request to send 202 with error information on failing to delete profile image
Этот коммит содержится в:
Shivashis Padhi
2022-08-25 11:30:50 +05:30
коммит произвёл GitHub
родитель 6adbcc5d05
Коммит e3efc46f69
2 изменённых файлов: 51 добавлений и 0 удалений

Просмотреть файл

@@ -1627,6 +1627,35 @@ func (a *App) PermanentDeleteUser(c *request.Context, user *model.User) *model.A
}
}
// delete directory containing user's profile image
profileImageDirectory := getProfileImageDirectory(user.Id)
profileImagePath := getProfileImagePath(user.Id)
resProfileImageExists, errProfileImageExists := a.FileExists(profileImagePath)
fileHandlingErrorsFound := false
if errProfileImageExists != nil {
fileHandlingErrorsFound = true
mlog.Warn(
"Error checking existence of profile image.",
mlog.String("path", profileImagePath),
mlog.Err(errProfileImageExists),
)
}
if resProfileImageExists {
errRemoveDirectory := a.RemoveDirectory(profileImageDirectory)
if errRemoveDirectory != nil {
fileHandlingErrorsFound = true
mlog.Warn(
"Unable to remove profile image directory",
mlog.String("path", profileImageDirectory),
mlog.Err(errRemoveDirectory),
)
}
}
if _, err := a.Srv().Store.FileInfo().PermanentDeleteByUser(user.Id); err != nil {
return model.NewAppError("PermanentDeleteUser", "app.file_info.permanent_delete_by_user.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
@@ -1643,6 +1672,12 @@ func (a *App) PermanentDeleteUser(c *request.Context, user *model.User) *model.A
return model.NewAppError("PermanentDeleteUser", "app.team.remove_member.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
a.InvalidateCacheForUser(user.Id)
if fileHandlingErrorsFound {
return model.NewAppError("PermanentDeleteUser", "app.file_info.permanent_delete_by_user.app_error", nil, "Couldn't delete profile image of the user.", http.StatusAccepted)
}
c.Logger().Warn("Permanently deleted account", mlog.String("user_email", user.Email), mlog.String("user_id", user.Id))
return nil
@@ -2612,3 +2647,7 @@ func (a *App) GetUsersWithInvalidEmails(page int, perPage int) ([]*model.User, *
func getProfileImagePath(userID string) string {
return filepath.Join("users", userID, "profile.png")
}
func getProfileImageDirectory(userID string) string {
return filepath.Join("users", userID)
}

Просмотреть файл

@@ -9,6 +9,7 @@ import (
"encoding/json"
"errors"
"os"
"path/filepath"
"strings"
"testing"
"time"
@@ -1036,6 +1037,12 @@ func TestPermanentDeleteUser(t *testing.T) {
require.Nil(t, err, "Unable to upload file. err=%v", err)
// upload profile image
user := th.BasicUser
err = th.App.SetDefaultProfileImage(th.Context, user)
require.Nil(t, err)
bot, err := th.App.CreateBot(th.Context, &model.Bot{
Username: "botname",
Description: "a bot",
@@ -1076,6 +1083,11 @@ func TestPermanentDeleteUser(t *testing.T) {
require.Nil(t, finfo, "Unable to find finfo. err=%v", err)
require.NotNil(t, err, "GetFileInfo after DeleteUser is nil. err=%v", err)
// test deletion of profile picture
exists, err := th.App.FileExists(filepath.Join("users", user.Id))
require.Nil(t, err, "Unable to stat finfo. err=%v", err)
require.False(t, exists, "Profile image wasn't deleted. err=%v", err)
}
func TestPasswordRecovery(t *testing.T) {