mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-02 08:19:04 +01:00
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.
166 lines
3.9 KiB
Go
166 lines
3.9 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/util"
|
|
)
|
|
|
|
func AddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, emailStr string) error {
|
|
if strings.EqualFold(u.Email, emailStr) {
|
|
return nil
|
|
}
|
|
|
|
if err := user_model.ValidateEmail(emailStr); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Check if address exists already
|
|
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
|
|
if err != nil && !errors.Is(err, util.ErrNotExist) {
|
|
return err
|
|
}
|
|
if email != nil && email.UID != u.ID {
|
|
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
|
|
}
|
|
|
|
// Update old primary address
|
|
primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
primary.IsPrimary = false
|
|
if err := user_model.UpdateEmailAddress(ctx, primary); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Insert new or update existing address
|
|
if email != nil {
|
|
email.IsPrimary = true
|
|
email.IsActivated = true
|
|
if err := user_model.UpdateEmailAddress(ctx, email); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
email = &user_model.EmailAddress{
|
|
UID: u.ID,
|
|
Email: emailStr,
|
|
IsActivated: true,
|
|
IsPrimary: true,
|
|
}
|
|
if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
u.Email = emailStr
|
|
|
|
return user_model.UpdateUserCols(ctx, u, "email")
|
|
}
|
|
|
|
func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailStr string) error {
|
|
if strings.EqualFold(u.Email, emailStr) {
|
|
return nil
|
|
}
|
|
|
|
if err := user_model.ValidateEmail(emailStr); err != nil {
|
|
return err
|
|
}
|
|
|
|
if !u.IsOrganization() {
|
|
// Check if address exists already
|
|
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
|
|
if err != nil && !errors.Is(err, util.ErrNotExist) {
|
|
return err
|
|
}
|
|
if email != nil {
|
|
if email.IsPrimary && email.UID == u.ID {
|
|
return nil
|
|
}
|
|
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
|
|
}
|
|
|
|
// Remove old primary address
|
|
primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Insert new primary address
|
|
email = &user_model.EmailAddress{
|
|
UID: u.ID,
|
|
Email: emailStr,
|
|
IsActivated: true,
|
|
IsPrimary: true,
|
|
}
|
|
if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
u.Email = emailStr
|
|
|
|
return user_model.UpdateUserCols(ctx, u, "email")
|
|
}
|
|
|
|
func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
|
|
for _, emailStr := range emails {
|
|
if err := user_model.ValidateEmail(emailStr); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Check if address exists already
|
|
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
|
|
if err != nil && !errors.Is(err, util.ErrNotExist) {
|
|
return err
|
|
}
|
|
if email != nil {
|
|
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
|
|
}
|
|
|
|
// Insert new address
|
|
email = &user_model.EmailAddress{
|
|
UID: u.ID,
|
|
Email: emailStr,
|
|
IsActivated: !setting.Service.RegisterEmailConfirm,
|
|
IsPrimary: false,
|
|
}
|
|
if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func DeleteEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
|
|
for _, emailStr := range emails {
|
|
// Check if address exists
|
|
email, err := user_model.GetEmailAddressOfUser(ctx, emailStr, u.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if email.IsPrimary {
|
|
return user_model.ErrPrimaryEmailCannotDelete{Email: emailStr}
|
|
}
|
|
|
|
// Remove address
|
|
if _, err := db.DeleteByID[user_model.EmailAddress](ctx, email.ID); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|