From 51dab6e1758e7ef4092ea8c9edc076e64cd6131a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 17 Nov 2021 20:05:03 +0800 Subject: [PATCH 01/15] Restrict email address validation --- models/user/email_address.go | 21 +++++++++++++++++++-- models/user/email_address_test.go | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 726af7b3b4820..2149154e10508 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -21,8 +21,12 @@ import ( "xorm.io/builder" ) -// ErrEmailNotActivated e-mail address has not been activated error -var ErrEmailNotActivated = errors.New("E-mail address has not been activated") +var ( + // ErrEmailNotActivated e-mail address has not been activated error + ErrEmailNotActivated = errors.New("E-mail address has not been activated") + + ErrEmailCharIsNotSupported = errors.New("email address contains unsupported charactor, only letters, digits, '.', '-', '_', '+', '@' are allowed") +) // ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 type ErrEmailInvalid struct { @@ -106,12 +110,25 @@ func (email *EmailAddress) BeforeInsert() { } } +func isEmailAllowedChar(b byte) bool { + return (b >= '0' && b <= '9') || + (b >= 'a' && b <= 'z') || + (b >= 'A' && b <= 'Z') || + b == '.' || b == '-' || b == '_' || b == '@' +} + // ValidateEmail check if email is a allowed address func ValidateEmail(email string) error { if len(email) == 0 { return nil } + for _, r := range []byte(email) { + if !isEmailAllowedChar(r) { + return ErrEmailCharIsNotSupported + } + } + if _, err := mail.ParseAddress(email); err != nil { return ErrEmailInvalid{email} } diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 4a539e150a10d..d60440eb5376e 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -252,3 +252,20 @@ func TestListEmails(t *testing.T) { assert.Len(t, emails, 5) assert.Greater(t, count, int64(len(emails))) } + +func TestEmailAddressValidate(t *testing.T) { + var kases = map[string]error{ + "abc@gmail.com": nil, + "132@hotmail.com": nil, + "1-3-2@test.org": nil, + "1.3.2@test.org": nil, + "a_123@test.org.cn": nil, + ";233@qq.com": ErrEmailCharIsNotSupported, + string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, + } + for kase, err := range kases { + t.Run(kase, func(t *testing.T) { + assert.EqualValues(t, err, ValidateEmail(kase)) + }) + } +} From d8a3ce88305d253424409a9c5d06c3df19129b14 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 17 Nov 2021 20:15:13 +0800 Subject: [PATCH 02/15] fix lint --- models/user/email_address.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 2149154e10508..1a947432f8798 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -23,9 +23,9 @@ import ( var ( // ErrEmailNotActivated e-mail address has not been activated error - ErrEmailNotActivated = errors.New("E-mail address has not been activated") + ErrEmailNotActivated = errors.New("e-mail address has not been activated") - ErrEmailCharIsNotSupported = errors.New("email address contains unsupported charactor, only letters, digits, '.', '-', '_', '+', '@' are allowed") + ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported charactor, only letters, digits, '.', '-', '_', '+', '@' are allowed") ) // ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 From eca3ae913b14f3873e5793437ea1629afbdb3988 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 17 Nov 2021 20:17:06 +0800 Subject: [PATCH 03/15] Allow + for email address --- models/user/email_address.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 1a947432f8798..c789e9ab6fe41 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -24,8 +24,8 @@ import ( var ( // ErrEmailNotActivated e-mail address has not been activated error ErrEmailNotActivated = errors.New("e-mail address has not been activated") - - ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported charactor, only letters, digits, '.', '-', '_', '+', '@' are allowed") + // ErrEmailCharIsNotSupported e-mail address contains unsupported character + ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported character, only letters, digits, '.', '-', '_', '+', '@' are allowed") ) // ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 @@ -114,7 +114,8 @@ func isEmailAllowedChar(b byte) bool { return (b >= '0' && b <= '9') || (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || - b == '.' || b == '-' || b == '_' || b == '@' + b == '.' || b == '-' || b == '_' || + b == '@' || b == '+' } // ValidateEmail check if email is a allowed address From c094e273840a996e05ea5f541553b16f53c16d86 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 17 Nov 2021 20:56:46 +0800 Subject: [PATCH 04/15] Allow more ASCII characters on email address --- models/user/email_address.go | 17 +++++------------ models/user/email_address_test.go | 1 + 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index c789e9ab6fe41..cfad14d158092 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "net/mail" + "regexp" "strings" "code.gitea.io/gitea/models/db" @@ -25,7 +26,7 @@ var ( // ErrEmailNotActivated e-mail address has not been activated error ErrEmailNotActivated = errors.New("e-mail address has not been activated") // ErrEmailCharIsNotSupported e-mail address contains unsupported character - ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported character, only letters, digits, '.', '-', '_', '+', '@' are allowed") + ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported character") ) // ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 @@ -110,13 +111,7 @@ func (email *EmailAddress) BeforeInsert() { } } -func isEmailAllowedChar(b byte) bool { - return (b >= '0' && b <= '9') || - (b >= 'a' && b <= 'z') || - (b >= 'A' && b <= 'Z') || - b == '.' || b == '-' || b == '_' || - b == '@' || b == '+' -} +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 { @@ -124,10 +119,8 @@ func ValidateEmail(email string) error { return nil } - for _, r := range []byte(email) { - if !isEmailAllowedChar(r) { - return ErrEmailCharIsNotSupported - } + if !emailRegexp.MatchString(email) { + return ErrEmailCharIsNotSupported } if _, err := mail.ParseAddress(email); err != nil { diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index d60440eb5376e..41a5814a20f5f 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -260,6 +260,7 @@ func TestEmailAddressValidate(t *testing.T) { "1-3-2@test.org": nil, "1.3.2@test.org": nil, "a_123@test.org.cn": nil, + `first+last@iana.org`: nil, ";233@qq.com": ErrEmailCharIsNotSupported, string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, } From 8d3f5b1149d48a2392f3c0aa3eca4ae2180f1a35 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 18 Nov 2021 14:04:32 +0800 Subject: [PATCH 05/15] Update models/user/email_address_test.go Co-authored-by: silverwind --- models/user/email_address_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 41a5814a20f5f..c71321a36e628 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -262,6 +262,7 @@ func TestEmailAddressValidate(t *testing.T) { "a_123@test.org.cn": nil, `first+last@iana.org`: nil, ";233@qq.com": ErrEmailCharIsNotSupported, + "Foo ": ErrEmailCharIsNotSupported, string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, } for kase, err := range kases { From 9bba86657b7d35d8a51e18b7d1e975c03c458b69 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 19 Nov 2021 19:38:02 +0800 Subject: [PATCH 06/15] Remove ; support from email address because of go standard library net/mail.ParseAddress don't support it --- models/user/email_address.go | 2 +- models/user/email_address_test.go | 36 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index cfad14d158092..b080f2947a5bf 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -111,7 +111,7 @@ func (email *EmailAddress) BeforeInsert() { } } -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])?)*$") +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 { diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index c71321a36e628..34298042bd79c 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -260,7 +260,43 @@ func TestEmailAddressValidate(t *testing.T) { "1-3-2@test.org": nil, "1.3.2@test.org": nil, "a_123@test.org.cn": nil, + `first.last@iana.org`: nil, + `first!last@iana.org`: nil, + `first#last@iana.org`: nil, + `first$last@iana.org`: nil, + `first%last@iana.org`: nil, + `first&last@iana.org`: nil, + `first'last@iana.org`: nil, + `first*last@iana.org`: nil, `first+last@iana.org`: nil, + `first/last@iana.org`: nil, + `first=last@iana.org`: nil, + `first?last@iana.org`: nil, + `first^last@iana.org`: nil, + "first`last@iana.org": nil, + `first{last@iana.org`: nil, + `first|last@iana.org`: nil, + `first}last@iana.org`: nil, + `first~last@iana.org`: nil, + `first;last@iana.org`: ErrEmailCharIsNotSupported, + ".233@qq.com": ErrEmailInvalid{".233@qq.com"}, + "!233@qq.com": nil, + "#233@qq.com": nil, + "$233@qq.com": nil, + "%233@qq.com": nil, + "&233@qq.com": nil, + "'233@qq.com": nil, + "*233@qq.com": nil, + "+233@qq.com": nil, + "/233@qq.com": nil, + "=233@qq.com": nil, + "?233@qq.com": nil, + "^233@qq.com": nil, + "`233@qq.com": nil, + "{233@qq.com": nil, + "|233@qq.com": nil, + "}233@qq.com": nil, + "~233@qq.com": nil, ";233@qq.com": ErrEmailCharIsNotSupported, "Foo ": ErrEmailCharIsNotSupported, string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, From ec5d2d4cafaed19e7c52435af12771167e28c226 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Mar 2022 00:30:29 +0800 Subject: [PATCH 07/15] First char should only be alphas and digits --- models/user/email_address.go | 8 +++++++- models/user/email_address_test.go | 34 +++++++++++++++---------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index b080f2947a5bf..0da0034dd8475 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -111,7 +111,7 @@ func (email *EmailAddress) BeforeInsert() { } } -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])?)*$") +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 { @@ -123,6 +123,12 @@ func ValidateEmail(email string) error { return ErrEmailCharIsNotSupported } + if !(email[0] >= 'a' && email[0] <= 'z') && + !(email[0] >= 'A' && email[0] <= 'Z') && + !(email[0] >= '0' && email[0] <= '9') { + return ErrEmailInvalid{email} + } + if _, err := mail.ParseAddress(email); err != nil { return ErrEmailInvalid{email} } diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 34298042bd79c..0dffc2051a3b7 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -280,23 +280,23 @@ func TestEmailAddressValidate(t *testing.T) { `first~last@iana.org`: nil, `first;last@iana.org`: ErrEmailCharIsNotSupported, ".233@qq.com": ErrEmailInvalid{".233@qq.com"}, - "!233@qq.com": nil, - "#233@qq.com": nil, - "$233@qq.com": nil, - "%233@qq.com": nil, - "&233@qq.com": nil, - "'233@qq.com": nil, - "*233@qq.com": nil, - "+233@qq.com": nil, - "/233@qq.com": nil, - "=233@qq.com": nil, - "?233@qq.com": nil, - "^233@qq.com": nil, - "`233@qq.com": nil, - "{233@qq.com": nil, - "|233@qq.com": nil, - "}233@qq.com": nil, - "~233@qq.com": nil, + "!233@qq.com": ErrEmailInvalid{"!233@qq.com"}, + "#233@qq.com": ErrEmailInvalid{"#233@qq.com"}, + "$233@qq.com": ErrEmailInvalid{"$233@qq.com"}, + "%233@qq.com": ErrEmailInvalid{"%233@qq.com"}, + "&233@qq.com": ErrEmailInvalid{"&233@qq.com"}, + "'233@qq.com": ErrEmailInvalid{"'233@qq.com"}, + "*233@qq.com": ErrEmailInvalid{"*233@qq.com"}, + "+233@qq.com": ErrEmailInvalid{"+233@qq.com"}, + "/233@qq.com": ErrEmailInvalid{"/233@qq.com"}, + "=233@qq.com": ErrEmailInvalid{"=233@qq.com"}, + "?233@qq.com": ErrEmailInvalid{"?233@qq.com"}, + "^233@qq.com": ErrEmailInvalid{"^233@qq.com"}, + "`233@qq.com": ErrEmailInvalid{"`233@qq.com"}, + "{233@qq.com": ErrEmailInvalid{"{233@qq.com"}, + "|233@qq.com": ErrEmailInvalid{"|233@qq.com"}, + "}233@qq.com": ErrEmailInvalid{"}233@qq.com"}, + "~233@qq.com": ErrEmailInvalid{"~233@qq.com"}, ";233@qq.com": ErrEmailCharIsNotSupported, "Foo ": ErrEmailCharIsNotSupported, string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, From 68191cfdcb237db44e48230d2160d4158363a3c8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Mar 2022 00:41:15 +0800 Subject: [PATCH 08/15] Fix lint --- models/user/email_address_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 0dffc2051a3b7..8cfbc0ed12d54 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -254,7 +254,7 @@ func TestListEmails(t *testing.T) { } func TestEmailAddressValidate(t *testing.T) { - var kases = map[string]error{ + kases := map[string]error{ "abc@gmail.com": nil, "132@hotmail.com": nil, "1-3-2@test.org": nil, From c7e3ebfb681a5b924e82c1f8c0368ba56d1f2c60 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Mar 2022 05:25:20 +0800 Subject: [PATCH 09/15] Fix test --- models/user/user.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 3eabf4808c2ab..deee07b0bb5e1 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -644,6 +644,15 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e u.Visibility = overwriteDefault[0].Visibility } + // validate data + if err := validateUser(u); err != nil { + return err + } + + if err := ValidateEmail(u.Email); err != nil { + return err + } + ctx, committer, err := db.TxContext() if err != nil { return err @@ -652,11 +661,6 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e sess := db.GetEngine(ctx) - // validate data - if err := validateUser(u); err != nil { - return err - } - isExist, err := isUserExist(sess, 0, u.Name) if err != nil { return err @@ -694,6 +698,8 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e return err } + + // insert email address if err := db.Insert(ctx, &EmailAddress{ UID: u.ID, From e22b415aa366a0fa6dce88bed2d548482c49ec98 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Mar 2022 21:58:52 +0800 Subject: [PATCH 10/15] Fix lint --- models/user/user.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index deee07b0bb5e1..a3094a13ceb16 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -698,8 +698,6 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e return err } - - // insert email address if err := db.Insert(ctx, &EmailAddress{ UID: u.ID, From 0ff1c495ad8e48edde91ccc463a77459b5242866 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 13 Mar 2022 23:57:46 +0800 Subject: [PATCH 11/15] Fix test --- models/user/email_address.go | 19 ++++++++++++++++--- models/user/email_address_test.go | 8 ++++---- models/user/user_test.go | 3 ++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index 0da0034dd8475..d733a2dd02192 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -25,10 +25,23 @@ import ( var ( // ErrEmailNotActivated e-mail address has not been activated error ErrEmailNotActivated = errors.New("e-mail address has not been activated") - // ErrEmailCharIsNotSupported e-mail address contains unsupported character - ErrEmailCharIsNotSupported = errors.New("e-mail address contains unsupported character") ) +// ErrEmailCharIsNotSupported e-mail address contains unsupported character +type ErrEmailCharIsNotSupported struct { + Email string +} + +// IsErrEmailCharIsNotSupported checks if an error is an ErrEmailCharIsNotSupported +func IsErrEmailCharIsNotSupported(err error) bool { + _, ok := err.(ErrEmailCharIsNotSupported) + return ok +} + +func (err ErrEmailCharIsNotSupported) Error() string { + return fmt.Sprintf("e-mail address contains unsupported character [email: %s]", err.Email) +} + // ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 type ErrEmailInvalid struct { Email string @@ -120,7 +133,7 @@ func ValidateEmail(email string) error { } if !emailRegexp.MatchString(email) { - return ErrEmailCharIsNotSupported + return ErrEmailCharIsNotSupported{email} } if !(email[0] >= 'a' && email[0] <= 'z') && diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 8cfbc0ed12d54..7eeb469b26a71 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -278,7 +278,7 @@ func TestEmailAddressValidate(t *testing.T) { `first|last@iana.org`: nil, `first}last@iana.org`: nil, `first~last@iana.org`: nil, - `first;last@iana.org`: ErrEmailCharIsNotSupported, + `first;last@iana.org`: ErrEmailCharIsNotSupported{`first;last@iana.org`}, ".233@qq.com": ErrEmailInvalid{".233@qq.com"}, "!233@qq.com": ErrEmailInvalid{"!233@qq.com"}, "#233@qq.com": ErrEmailInvalid{"#233@qq.com"}, @@ -297,9 +297,9 @@ func TestEmailAddressValidate(t *testing.T) { "|233@qq.com": ErrEmailInvalid{"|233@qq.com"}, "}233@qq.com": ErrEmailInvalid{"}233@qq.com"}, "~233@qq.com": ErrEmailInvalid{"~233@qq.com"}, - ";233@qq.com": ErrEmailCharIsNotSupported, - "Foo ": ErrEmailCharIsNotSupported, - string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported, + ";233@qq.com": ErrEmailCharIsNotSupported{";233@qq.com"}, + "Foo ": ErrEmailCharIsNotSupported{"Foo "}, + string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})}, } for kase, err := range kases { t.Run(kase, func(t *testing.T) { diff --git a/models/user/user_test.go b/models/user/user_test.go index a5f47172eebc0..c265405c7b6bc 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -5,6 +5,7 @@ package user import ( + "fmt" "math/rand" "strings" "testing" @@ -232,7 +233,7 @@ func TestCreateUserInvalidEmail(t *testing.T) { err := CreateUser(user) assert.Error(t, err) - assert.True(t, IsErrEmailInvalid(err)) + assert.True(t, IsErrEmailCharIsNotSupported(err)) } func TestCreateUserEmailAlreadyUsed(t *testing.T) { From 1037c2b66ec5c216c02e4a1851a2690bd10d3862 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 14 Mar 2022 00:14:25 +0800 Subject: [PATCH 12/15] Fix fmt --- models/user/email_address.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/models/user/email_address.go b/models/user/email_address.go index d733a2dd02192..564d018dac815 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -22,10 +22,8 @@ import ( "xorm.io/builder" ) -var ( - // ErrEmailNotActivated e-mail address has not been activated error - ErrEmailNotActivated = errors.New("e-mail address has not been activated") -) +// ErrEmailNotActivated e-mail address has not been activated error +var ErrEmailNotActivated = errors.New("e-mail address has not been activated") // ErrEmailCharIsNotSupported e-mail address contains unsupported character type ErrEmailCharIsNotSupported struct { From 6287ac0bcb4de3e5f26a620c66686ede8036664b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 14 Mar 2022 00:51:13 +0800 Subject: [PATCH 13/15] Fix lint --- models/user/user_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/models/user/user_test.go b/models/user/user_test.go index c265405c7b6bc..335537aa13f90 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -5,7 +5,6 @@ package user import ( - "fmt" "math/rand" "strings" "testing" From 3048360b79510823fa8292c9fe382ca20633ae8b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 14 Mar 2022 20:13:56 +0800 Subject: [PATCH 14/15] Fix test --- routers/web/admin/users.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 1f304297c01fa..43dbe5c2091bf 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -171,6 +171,9 @@ func NewUserPost(ctx *context.Context) { case user_model.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserNew, &form) + case user_model.IsErrEmailCharIsNotSupported(err): + ctx.Data["Err_Email"] = true + ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplUserNew, &form) case user_model.IsErrEmailInvalid(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplUserNew, &form) From b523619f51081ee6aa80b3ab5b55972383f0994f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 14 Mar 2022 23:29:31 +0800 Subject: [PATCH 15/15] Fix test --- routers/api/v1/admin/user.go | 5 ++++- routers/api/v1/user/email.go | 3 ++- routers/web/admin/users.go | 3 ++- routers/web/auth/auth.go | 3 +++ routers/web/user/setting/account.go | 3 ++- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 0ecebad5d7aa6..1d3854df9bd44 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -119,6 +119,7 @@ func CreateUser(ctx *context.APIContext) { user_model.IsErrEmailAlreadyUsed(err) || db.IsErrNameReserved(err) || db.IsErrNameCharsNotAllowed(err) || + user_model.IsErrEmailCharIsNotSupported(err) || user_model.IsErrEmailInvalid(err) || db.IsErrNamePatternNotAllowed(err) { ctx.Error(http.StatusUnprocessableEntity, "", err) @@ -265,7 +266,9 @@ func EditUser(ctx *context.APIContext) { } if err := user_model.UpdateUser(u, emailChanged); err != nil { - if user_model.IsErrEmailAlreadyUsed(err) || user_model.IsErrEmailInvalid(err) { + if user_model.IsErrEmailAlreadyUsed(err) || + user_model.IsErrEmailCharIsNotSupported(err) || + user_model.IsErrEmailInvalid(err) { ctx.Error(http.StatusUnprocessableEntity, "", err) } else { ctx.Error(http.StatusInternalServerError, "UpdateUser", err) diff --git a/routers/api/v1/user/email.go b/routers/api/v1/user/email.go index 6887c306cc16e..ed79723c60f6b 100644 --- a/routers/api/v1/user/email.go +++ b/routers/api/v1/user/email.go @@ -80,7 +80,8 @@ func AddEmail(ctx *context.APIContext) { if err := user_model.AddEmailAddresses(emails); err != nil { if user_model.IsErrEmailAlreadyUsed(err) { ctx.Error(http.StatusUnprocessableEntity, "", "Email address has been used: "+err.(user_model.ErrEmailAlreadyUsed).Email) - } else if user_model.IsErrEmailInvalid(err) { + } else if user_model.IsErrEmailCharIsNotSupported(err) || + user_model.IsErrEmailInvalid(err) { errMsg := fmt.Sprintf("Email address %s invalid", err.(user_model.ErrEmailInvalid).Email) ctx.Error(http.StatusUnprocessableEntity, "", errMsg) } else { diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 43dbe5c2091bf..a7d7d62d9a60a 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -389,7 +389,8 @@ func EditUserPost(ctx *context.Context) { if user_model.IsErrEmailAlreadyUsed(err) { ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserEdit, &form) - } else if user_model.IsErrEmailInvalid(err) { + } else if user_model.IsErrEmailCharIsNotSupported(err) || + user_model.IsErrEmailInvalid(err) { ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplUserEdit, &form) } else { diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index ce8ec8a1e3136..9209b7335e9a0 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -573,6 +573,9 @@ func createUserInContext(ctx *context.Context, tpl base.TplName, form interface{ case user_model.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tpl, form) + case user_model.IsErrEmailCharIsNotSupported(err): + ctx.Data["Err_Email"] = true + ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tpl, form) case user_model.IsErrEmailInvalid(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tpl, form) diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index b73122fa12a17..492b4f82c8dde 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -188,7 +188,8 @@ func EmailPost(ctx *context.Context) { ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSettingsAccount, &form) return - } else if user_model.IsErrEmailInvalid(err) { + } else if user_model.IsErrEmailCharIsNotSupported(err) || + user_model.IsErrEmailInvalid(err) { loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSettingsAccount, &form)