From 5629649cc1bc58aef73068f1381ac17dfd6beea0 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Fri, 1 Mar 2024 18:32:26 +0800 Subject: [PATCH 1/7] change ValidateEmail --- models/user/email_address.go | 22 ++++++++++--------- models/user/email_address_test.go | 2 +- models/user/user.go | 2 +- routers/web/auth/auth.go | 2 +- routers/web/org/teams.go | 2 +- .../auth/source/pam/source_authenticate.go | 4 ++-- services/doctor/breaking.go | 2 +- services/user/email.go | 6 ++--- 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 5d67304691ad1..6e9c0beb7b72d 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -155,7 +155,7 @@ func UpdateEmailAddress(ctx context.Context, email *EmailAddress) error { var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") // ValidateEmail check if email is a allowed address -func ValidateEmail(email string) error { +func ValidateEmail(email string, skipDomainCheck bool) error { if len(email) == 0 { return ErrEmailInvalid{email} } @@ -172,16 +172,18 @@ func ValidateEmail(email string) error { return ErrEmailInvalid{email} } - // if there is no allow list, then check email against block list - if len(setting.Service.EmailDomainAllowList) == 0 && - validation.IsEmailDomainListed(setting.Service.EmailDomainBlockList, email) { - return ErrEmailInvalid{email} - } + if !skipDomainCheck { + // if there is no allow list, then check email against block list + if len(setting.Service.EmailDomainAllowList) == 0 && + validation.IsEmailDomainListed(setting.Service.EmailDomainBlockList, email) { + return ErrEmailInvalid{email} + } - // if there is an allow list, then check email against allow list - if len(setting.Service.EmailDomainAllowList) > 0 && - !validation.IsEmailDomainListed(setting.Service.EmailDomainAllowList, email) { - return ErrEmailInvalid{email} + // if there is an allow list, then check email against allow list + if len(setting.Service.EmailDomainAllowList) > 0 && + !validation.IsEmailDomainListed(setting.Service.EmailDomainAllowList, email) { + return ErrEmailInvalid{email} + } } return nil diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index c2e010d95b3f6..e7cd8e1ec474d 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -206,7 +206,7 @@ func TestEmailAddressValidate(t *testing.T) { } for kase, err := range kases { t.Run(kase, func(t *testing.T) { - assert.EqualValues(t, err, user_model.ValidateEmail(kase)) + assert.EqualValues(t, err, user_model.ValidateEmail(kase, false)) }) } } diff --git a/models/user/user.go b/models/user/user.go index e92bbd4d0b09e..7c27df953146e 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -639,7 +639,7 @@ func CreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOve return err } - if err := ValidateEmail(u.Email); err != nil { + if err := ValidateEmail(u.Email, false); err != nil { return err } diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 7704a110a67b5..97d4e9c984895 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -710,7 +710,7 @@ func ActivatePost(ctx *context.Context) { if code == "" { newEmail := strings.TrimSpace(ctx.FormString("change_email")) if ctx.Doer != nil && newEmail != "" && !strings.EqualFold(ctx.Doer.Email, newEmail) { - if user_model.ValidateEmail(newEmail) != nil { + if user_model.ValidateEmail(newEmail, false) != nil { ctx.Flash.Error(ctx.Locale.Tr("form.email_invalid"), true) renderActivationChangeEmail(ctx) return diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index fd7486cacdbc4..0302fdeaa7843 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -131,7 +131,7 @@ func TeamsAction(ctx *context.Context) { u, err = user_model.GetUserByName(ctx, uname) if err != nil { if user_model.IsErrUserNotExist(err) { - if setting.MailService != nil && user_model.ValidateEmail(uname) == nil { + if setting.MailService != nil && user_model.ValidateEmail(uname, false) == nil { if err := org_service.CreateTeamInvite(ctx, ctx.Doer, ctx.Org.Team, uname); err != nil { if org_model.IsErrTeamInviteAlreadyExist(err) { ctx.Flash.Error(ctx.Tr("form.duplicate_invite_to_team")) diff --git a/services/auth/source/pam/source_authenticate.go b/services/auth/source/pam/source_authenticate.go index addd1bd2c958e..7c7a21664d27f 100644 --- a/services/auth/source/pam/source_authenticate.go +++ b/services/auth/source/pam/source_authenticate.go @@ -39,13 +39,13 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u if idx > -1 { username = pamLogin[:idx] } - if user_model.ValidateEmail(email) != nil { + if user_model.ValidateEmail(email, false) != nil { if source.EmailDomain != "" { email = fmt.Sprintf("%s@%s", username, source.EmailDomain) } else { email = fmt.Sprintf("%s@%s", username, setting.Service.NoReplyAddress) } - if user_model.ValidateEmail(email) != nil { + if user_model.ValidateEmail(email, false) != nil { email = uuid.New().String() + "@localhost" } } diff --git a/services/doctor/breaking.go b/services/doctor/breaking.go index 77e3d4e8ef84d..b8a922c0f05cb 100644 --- a/services/doctor/breaking.go +++ b/services/doctor/breaking.go @@ -39,7 +39,7 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { return nil } - if err := user.ValidateEmail(u.Email); err != nil { + if err := user.ValidateEmail(u.Email, false); err != nil { invalidUserCount++ logger.Warn("User[id=%d name=%q] have not a valid e-mail: %v", u.ID, u.Name, err) } diff --git a/services/user/email.go b/services/user/email.go index 07e19bc6883b8..ba5ebd90a5216 100644 --- a/services/user/email.go +++ b/services/user/email.go @@ -19,7 +19,7 @@ func AddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, emailS return nil } - if err := user_model.ValidateEmail(emailStr); err != nil { + if err := user_model.ValidateEmail(emailStr, false); err != nil { return err } @@ -72,7 +72,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt return nil } - if err := user_model.ValidateEmail(emailStr); err != nil { + if err := user_model.ValidateEmail(emailStr, false); err != nil { return err } @@ -117,7 +117,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error { for _, emailStr := range emails { - if err := user_model.ValidateEmail(emailStr); err != nil { + if err := user_model.ValidateEmail(emailStr, false); err != nil { return err } From 3a2516c509c6bd1ffd0670e13ebc68a26cb26821 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 4 Mar 2024 14:06:01 +0800 Subject: [PATCH 2/7] add validateEmailBasic and validateEmailDomain --- models/user/email_address.go | 76 +++++++++++-------- models/user/email_address_test.go | 2 +- models/user/user.go | 2 +- routers/web/auth/auth.go | 2 +- routers/web/org/teams.go | 2 +- .../auth/source/pam/source_authenticate.go | 4 +- services/doctor/breaking.go | 2 +- services/user/email.go | 6 +- 8 files changed, 55 insertions(+), 41 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 6e9c0beb7b72d..0d3c2b6184d6b 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -154,39 +154,17 @@ func UpdateEmailAddress(ctx context.Context, email *EmailAddress) error { var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") -// ValidateEmail check if email is a allowed address -func ValidateEmail(email string, skipDomainCheck bool) error { - if len(email) == 0 { - return ErrEmailInvalid{email} - } - - if !emailRegexp.MatchString(email) { - return ErrEmailCharIsNotSupported{email} - } - - if email[0] == '-' { - return ErrEmailInvalid{email} - } - - if _, err := mail.ParseAddress(email); err != nil { - return ErrEmailInvalid{email} - } - - if !skipDomainCheck { - // if there is no allow list, then check email against block list - if len(setting.Service.EmailDomainAllowList) == 0 && - validation.IsEmailDomainListed(setting.Service.EmailDomainBlockList, email) { - return ErrEmailInvalid{email} - } - - // if there is an allow list, then check email against allow list - if len(setting.Service.EmailDomainAllowList) > 0 && - !validation.IsEmailDomainListed(setting.Service.EmailDomainAllowList, email) { - return ErrEmailInvalid{email} - } +// ValidateEmail check if email is a valied address +func ValidateEmail(email string) error { + if err := validateEmailBasic(email); err != nil { + return err } + return validateEmailDomain(email) +} - return nil +// ValidateEmailForAdmin check if email is a valied address when admins manually add users +func ValidateEmailForAdmin(email string) error { + return validateEmailBasic(email) } func GetEmailAddressByEmail(ctx context.Context, email string) (*EmailAddress, error) { @@ -536,3 +514,39 @@ func ActivateUserEmail(ctx context.Context, userID int64, email string, activate return committer.Commit() } + +func validateEmailBasic(email string) error { + if len(email) == 0 { + return ErrEmailInvalid{email} + } + + if !emailRegexp.MatchString(email) { + return ErrEmailCharIsNotSupported{email} + } + + if email[0] == '-' { + return ErrEmailInvalid{email} + } + + if _, err := mail.ParseAddress(email); err != nil { + return ErrEmailInvalid{email} + } + + return nil +} + +func validateEmailDomain(email string) error { + // if there is no allow list, then check email against block list + if len(setting.Service.EmailDomainAllowList) == 0 && + validation.IsEmailDomainListed(setting.Service.EmailDomainBlockList, email) { + return ErrEmailInvalid{email} + } + + // if there is an allow list, then check email against allow list + if len(setting.Service.EmailDomainAllowList) > 0 && + !validation.IsEmailDomainListed(setting.Service.EmailDomainAllowList, email) { + return ErrEmailInvalid{email} + } + + return nil +} diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index e7cd8e1ec474d..c2e010d95b3f6 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -206,7 +206,7 @@ func TestEmailAddressValidate(t *testing.T) { } for kase, err := range kases { t.Run(kase, func(t *testing.T) { - assert.EqualValues(t, err, user_model.ValidateEmail(kase, false)) + assert.EqualValues(t, err, user_model.ValidateEmail(kase)) }) } } diff --git a/models/user/user.go b/models/user/user.go index 7c27df953146e..e92bbd4d0b09e 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -639,7 +639,7 @@ func CreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOve return err } - if err := ValidateEmail(u.Email, false); err != nil { + if err := ValidateEmail(u.Email); err != nil { return err } diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 97d4e9c984895..7704a110a67b5 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -710,7 +710,7 @@ func ActivatePost(ctx *context.Context) { if code == "" { newEmail := strings.TrimSpace(ctx.FormString("change_email")) if ctx.Doer != nil && newEmail != "" && !strings.EqualFold(ctx.Doer.Email, newEmail) { - if user_model.ValidateEmail(newEmail, false) != nil { + if user_model.ValidateEmail(newEmail) != nil { ctx.Flash.Error(ctx.Locale.Tr("form.email_invalid"), true) renderActivationChangeEmail(ctx) return diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index 0302fdeaa7843..fd7486cacdbc4 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -131,7 +131,7 @@ func TeamsAction(ctx *context.Context) { u, err = user_model.GetUserByName(ctx, uname) if err != nil { if user_model.IsErrUserNotExist(err) { - if setting.MailService != nil && user_model.ValidateEmail(uname, false) == nil { + if setting.MailService != nil && user_model.ValidateEmail(uname) == nil { if err := org_service.CreateTeamInvite(ctx, ctx.Doer, ctx.Org.Team, uname); err != nil { if org_model.IsErrTeamInviteAlreadyExist(err) { ctx.Flash.Error(ctx.Tr("form.duplicate_invite_to_team")) diff --git a/services/auth/source/pam/source_authenticate.go b/services/auth/source/pam/source_authenticate.go index 7c7a21664d27f..addd1bd2c958e 100644 --- a/services/auth/source/pam/source_authenticate.go +++ b/services/auth/source/pam/source_authenticate.go @@ -39,13 +39,13 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u if idx > -1 { username = pamLogin[:idx] } - if user_model.ValidateEmail(email, false) != nil { + if user_model.ValidateEmail(email) != nil { if source.EmailDomain != "" { email = fmt.Sprintf("%s@%s", username, source.EmailDomain) } else { email = fmt.Sprintf("%s@%s", username, setting.Service.NoReplyAddress) } - if user_model.ValidateEmail(email, false) != nil { + if user_model.ValidateEmail(email) != nil { email = uuid.New().String() + "@localhost" } } diff --git a/services/doctor/breaking.go b/services/doctor/breaking.go index b8a922c0f05cb..77e3d4e8ef84d 100644 --- a/services/doctor/breaking.go +++ b/services/doctor/breaking.go @@ -39,7 +39,7 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { return nil } - if err := user.ValidateEmail(u.Email, false); err != nil { + if err := user.ValidateEmail(u.Email); err != nil { invalidUserCount++ logger.Warn("User[id=%d name=%q] have not a valid e-mail: %v", u.ID, u.Name, err) } diff --git a/services/user/email.go b/services/user/email.go index ba5ebd90a5216..07e19bc6883b8 100644 --- a/services/user/email.go +++ b/services/user/email.go @@ -19,7 +19,7 @@ func AddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, emailS return nil } - if err := user_model.ValidateEmail(emailStr, false); err != nil { + if err := user_model.ValidateEmail(emailStr); err != nil { return err } @@ -72,7 +72,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt return nil } - if err := user_model.ValidateEmail(emailStr, false); err != nil { + if err := user_model.ValidateEmail(emailStr); err != nil { return err } @@ -117,7 +117,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error { for _, emailStr := range emails { - if err := user_model.ValidateEmail(emailStr, false); err != nil { + if err := user_model.ValidateEmail(emailStr); err != nil { return err } From 201eb185d8e20f58574f9073531cdcc1e9c3b06a Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 4 Mar 2024 14:57:45 +0800 Subject: [PATCH 3/7] introduce AdminCreateUser --- models/user/user.go | 20 ++++++++++++++++++-- routers/api/v1/admin/user.go | 2 +- routers/web/admin/users.go | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index e92bbd4d0b09e..8a1462acd98f8 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -586,6 +586,16 @@ type CreateUserOverwriteOptions struct { // CreateUser creates record of a new user. func CreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { + return createUser(ctx, u, false, overwriteDefault...) +} + +// AdminCreateUser is used by admins to manually create users +func AdminCreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { + return createUser(ctx, u, true, overwriteDefault...) +} + +// createUser creates record of a new user. +func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { if err = IsUsableUsername(u.Name); err != nil { return err } @@ -639,8 +649,14 @@ func CreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOve return err } - if err := ValidateEmail(u.Email); err != nil { - return err + if createdByAdmin { + if err := ValidateEmailForAdmin(u.Email); err != nil { + return err + } + } else { + if err := ValidateEmail(u.Email); err != nil { + return err + } } ctx, committer, err := db.TxContext(ctx) diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 64315108b088c..7f4200f684e85 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -133,7 +133,7 @@ func CreateUser(ctx *context.APIContext) { u.UpdatedUnix = u.CreatedUnix } - if err := user_model.CreateUser(ctx, u, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, overwriteDefault); err != nil { if user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err) || db.IsErrNameReserved(err) || diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index bbdbc820d7829..282ebdc08da0f 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -177,7 +177,7 @@ func NewUserPost(ctx *context.Context) { u.MustChangePassword = form.MustChangePassword } - if err := user_model.CreateUser(ctx, u, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, overwriteDefault); err != nil { switch { case user_model.IsErrUserAlreadyExist(err): ctx.Data["Err_UserName"] = true From d8f832f8e3d47ee442a78eec98637b0dba079eb3 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 4 Mar 2024 17:13:51 +0800 Subject: [PATCH 4/7] add test --- tests/integration/api_admin_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/integration/api_admin_test.go b/tests/integration/api_admin_test.go index 0748a75ba4bb8..c2f4eaba072d6 100644 --- a/tests/integration/api_admin_test.go +++ b/tests/integration/api_admin_test.go @@ -14,9 +14,11 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/tests" + "github.com/gobwas/glob" "github.com/stretchr/testify/assert" ) @@ -333,3 +335,25 @@ func TestAPICron(t *testing.T) { } }) } + +func TestAPICreateUser_NotAllowedEmailDomain(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + setting.Service.EmailDomainAllowList = []glob.Glob{glob.MustCompile("example.org")} + defer func() { + setting.Service.EmailDomainAllowList = []glob.Glob{} + }() + + adminUsername := "user1" + token := getUserToken(t, adminUsername, auth_model.AccessTokenScopeWriteAdmin) + + req := NewRequestWithValues(t, "POST", "/api/v1/admin/users", map[string]string{ + "email": "allowedUser1@example1.org", + "login_name": "allowedUser1", + "username": "allowedUser1", + "password": "allowedUser1_pass", + "must_change_password": "true", + }).AddTokenAuth(token) + + MakeRequest(t, req, http.StatusCreated) +} From dc4fa727217caf1c08f4d62ac022a01e4cd2f661 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 4 Mar 2024 17:50:33 +0800 Subject: [PATCH 5/7] add comments --- models/user/email_address.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 0d3c2b6184d6b..92add7ab91fbe 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -154,7 +154,7 @@ func UpdateEmailAddress(ctx context.Context, email *EmailAddress) error { var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") -// ValidateEmail check if email is a valied address +// ValidateEmail check if email is a valid address func ValidateEmail(email string) error { if err := validateEmailBasic(email); err != nil { return err @@ -162,9 +162,10 @@ func ValidateEmail(email string) error { return validateEmailDomain(email) } -// ValidateEmailForAdmin check if email is a valied address when admins manually add users +// ValidateEmailForAdmin check if email is a valid address when admins manually add users func ValidateEmailForAdmin(email string) error { return validateEmailBasic(email) + // In this case we do not need to check the email domain } func GetEmailAddressByEmail(ctx context.Context, email string) (*EmailAddress, error) { @@ -515,6 +516,7 @@ func ActivateUserEmail(ctx context.Context, userID int64, email string, activate return committer.Commit() } +// validateEmailBasic checks whether the email complies with the rules func validateEmailBasic(email string) error { if len(email) == 0 { return ErrEmailInvalid{email} @@ -535,6 +537,7 @@ func validateEmailBasic(email string) error { return nil } +// validateEmailDomain checks whether the email domain is allowed or blocked func validateEmailDomain(email string) error { // if there is no allow list, then check email against block list if len(setting.Service.EmailDomainAllowList) == 0 && From 53e9686459cc66c68f875f25a7e79888e095b939 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 4 Mar 2024 18:22:39 +0800 Subject: [PATCH 6/7] fix test --- tests/integration/api_admin_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/api_admin_test.go b/tests/integration/api_admin_test.go index c2f4eaba072d6..53bdd11afd13b 100644 --- a/tests/integration/api_admin_test.go +++ b/tests/integration/api_admin_test.go @@ -354,6 +354,8 @@ func TestAPICreateUser_NotAllowedEmailDomain(t *testing.T) { "password": "allowedUser1_pass", "must_change_password": "true", }).AddTokenAuth(token) - MakeRequest(t, req, http.StatusCreated) + + req = NewRequest(t, "DELETE", "/api/v1/admin/users/allowedUser1").AddTokenAuth(token) + MakeRequest(t, req, http.StatusNoContent) } From c9a44909692b9da1c556806eb19bb7e68e37a449 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 5 Mar 2024 11:09:03 +0800 Subject: [PATCH 7/7] update 'ValidateEmail' comment --- models/user/email_address.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 92add7ab91fbe..3cb2e8268c8d5 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -154,7 +154,7 @@ func UpdateEmailAddress(ctx context.Context, email *EmailAddress) error { var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") -// ValidateEmail check if email is a valid address +// ValidateEmail check if email is a valid & allowed address func ValidateEmail(email string) error { if err := validateEmailBasic(email); err != nil { return err