forked from Shiloh/githaven
f8b471ace1
Fixes #28660 Fixes an admin api bug related to `user.LoginSource` Fixed `/user/emails` response not identical to GitHub api This PR unifies the user update methods. The goal is to keep the logic only at one place (having audit logs in mind). For example, do the password checks only in one method not everywhere a password is updated. After that PR is merged, the user creation should be next.
64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/avatar"
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/storage"
|
|
)
|
|
|
|
// UploadAvatar saves custom avatar for user.
|
|
func UploadAvatar(ctx context.Context, u *user_model.User, data []byte) error {
|
|
avatarData, err := avatar.ProcessAvatarImage(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx, committer, err := db.TxContext(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer committer.Close()
|
|
|
|
u.UseCustomAvatar = true
|
|
u.Avatar = avatar.HashAvatar(u.ID, data)
|
|
if err = user_model.UpdateUserCols(ctx, u, "use_custom_avatar", "avatar"); err != nil {
|
|
return fmt.Errorf("updateUser: %w", err)
|
|
}
|
|
|
|
if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error {
|
|
_, err := w.Write(avatarData)
|
|
return err
|
|
}); err != nil {
|
|
return fmt.Errorf("Failed to create dir %s: %w", u.CustomAvatarRelativePath(), err)
|
|
}
|
|
|
|
return committer.Commit()
|
|
}
|
|
|
|
// DeleteAvatar deletes the user's custom avatar.
|
|
func DeleteAvatar(ctx context.Context, u *user_model.User) error {
|
|
aPath := u.CustomAvatarRelativePath()
|
|
log.Trace("DeleteAvatar[%d]: %s", u.ID, aPath)
|
|
if len(u.Avatar) > 0 {
|
|
if err := storage.Avatars.Delete(aPath); err != nil {
|
|
return fmt.Errorf("Failed to remove %s: %w", aPath, err)
|
|
}
|
|
}
|
|
|
|
u.UseCustomAvatar = false
|
|
u.Avatar = ""
|
|
if _, err := db.GetEngine(ctx).ID(u.ID).Cols("avatar, use_custom_avatar").Update(u); err != nil {
|
|
return fmt.Errorf("DeleteAvatar: %w", err)
|
|
}
|
|
return nil
|
|
}
|