You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

email.go 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "errors"
  7. "strings"
  8. "code.gitea.io/gitea/models/db"
  9. user_model "code.gitea.io/gitea/models/user"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/util"
  12. )
  13. // AdminAddOrSetPrimaryEmailAddress is used by admins to add or set a user's primary email address
  14. func AdminAddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, emailStr string) error {
  15. if strings.EqualFold(u.Email, emailStr) {
  16. return nil
  17. }
  18. if err := user_model.ValidateEmailForAdmin(emailStr); err != nil {
  19. return err
  20. }
  21. // Check if address exists already
  22. email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
  23. if err != nil && !errors.Is(err, util.ErrNotExist) {
  24. return err
  25. }
  26. if email != nil && email.UID != u.ID {
  27. return user_model.ErrEmailAlreadyUsed{Email: emailStr}
  28. }
  29. // Update old primary address
  30. primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
  31. if err != nil {
  32. return err
  33. }
  34. primary.IsPrimary = false
  35. if err := user_model.UpdateEmailAddress(ctx, primary); err != nil {
  36. return err
  37. }
  38. // Insert new or update existing address
  39. if email != nil {
  40. email.IsPrimary = true
  41. email.IsActivated = true
  42. if err := user_model.UpdateEmailAddress(ctx, email); err != nil {
  43. return err
  44. }
  45. } else {
  46. email = &user_model.EmailAddress{
  47. UID: u.ID,
  48. Email: emailStr,
  49. IsActivated: true,
  50. IsPrimary: true,
  51. }
  52. if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
  53. return err
  54. }
  55. }
  56. u.Email = emailStr
  57. return user_model.UpdateUserCols(ctx, u, "email")
  58. }
  59. func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailStr string) error {
  60. if strings.EqualFold(u.Email, emailStr) {
  61. return nil
  62. }
  63. if err := user_model.ValidateEmail(emailStr); err != nil {
  64. return err
  65. }
  66. if !u.IsOrganization() {
  67. // Check if address exists already
  68. email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
  69. if err != nil && !errors.Is(err, util.ErrNotExist) {
  70. return err
  71. }
  72. if email != nil {
  73. if email.IsPrimary && email.UID == u.ID {
  74. return nil
  75. }
  76. return user_model.ErrEmailAlreadyUsed{Email: emailStr}
  77. }
  78. // Remove old primary address
  79. primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
  80. if err != nil {
  81. return err
  82. }
  83. if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil {
  84. return err
  85. }
  86. // Insert new primary address
  87. email = &user_model.EmailAddress{
  88. UID: u.ID,
  89. Email: emailStr,
  90. IsActivated: true,
  91. IsPrimary: true,
  92. }
  93. if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
  94. return err
  95. }
  96. }
  97. u.Email = emailStr
  98. return user_model.UpdateUserCols(ctx, u, "email")
  99. }
  100. func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
  101. for _, emailStr := range emails {
  102. if err := user_model.ValidateEmail(emailStr); err != nil {
  103. return err
  104. }
  105. // Check if address exists already
  106. email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
  107. if err != nil && !errors.Is(err, util.ErrNotExist) {
  108. return err
  109. }
  110. if email != nil {
  111. return user_model.ErrEmailAlreadyUsed{Email: emailStr}
  112. }
  113. // Insert new address
  114. email = &user_model.EmailAddress{
  115. UID: u.ID,
  116. Email: emailStr,
  117. IsActivated: !setting.Service.RegisterEmailConfirm,
  118. IsPrimary: false,
  119. }
  120. if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
  121. return err
  122. }
  123. }
  124. return nil
  125. }
  126. func DeleteEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
  127. for _, emailStr := range emails {
  128. // Check if address exists
  129. email, err := user_model.GetEmailAddressOfUser(ctx, emailStr, u.ID)
  130. if err != nil {
  131. return err
  132. }
  133. if email.IsPrimary {
  134. return user_model.ErrPrimaryEmailCannotDelete{Email: emailStr}
  135. }
  136. // Remove address
  137. if _, err := db.DeleteByID[user_model.EmailAddress](ctx, email.ID); err != nil {
  138. return err
  139. }
  140. }
  141. return nil
  142. }