123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- // 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"
- )
-
- // AdminAddOrSetPrimaryEmailAddress is used by admins to add or set a user's primary email address
- func AdminAddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, emailStr string) error {
- if strings.EqualFold(u.Email, emailStr) {
- return nil
- }
-
- if err := user_model.ValidateEmailForAdmin(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
- }
|