Skip to content

Commit

Permalink
Make e-mail sanity check more precise (#20991)
Browse files Browse the repository at this point in the history
For security reasons, all e-mail addresses starting with
non-alphanumeric characters were rejected. This is too broad and rejects
perfectly valid e-mail addresses. Only leading hyphens should be
rejected -- in all other cases e-mail address specification should
follow RFC 5322.

Co-authored-by: Andreas Fischer <_@ndreas.de>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: zeripath <art27@cantab.net>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
  • Loading branch information
5 people committed Oct 12, 2022
1 parent b5a54f0 commit 9862936
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 20 deletions.
5 changes: 2 additions & 3 deletions models/user/email_address.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ func (err ErrEmailCharIsNotSupported) Error() string {
}

// ErrEmailInvalid represents an error where the email address does not comply with RFC 5322
// or has a leading '-' character
type ErrEmailInvalid struct {
Email string
}
Expand Down Expand Up @@ -134,9 +135,7 @@ func ValidateEmail(email string) error {
return ErrEmailCharIsNotSupported{email}
}

if !(email[0] >= 'a' && email[0] <= 'z') &&
!(email[0] >= 'A' && email[0] <= 'Z') &&
!(email[0] >= '0' && email[0] <= '9') {
if email[0] == '-' {
return ErrEmailInvalid{email}
}

Expand Down
36 changes: 19 additions & 17 deletions models/user/email_address_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,23 +281,25 @@ func TestEmailAddressValidate(t *testing.T) {
`first~last@iana.org`: nil,
`first;last@iana.org`: user_model.ErrEmailCharIsNotSupported{`first;last@iana.org`},
".233@qq.com": user_model.ErrEmailInvalid{".233@qq.com"},
"!233@qq.com": user_model.ErrEmailInvalid{"!233@qq.com"},
"#233@qq.com": user_model.ErrEmailInvalid{"#233@qq.com"},
"$233@qq.com": user_model.ErrEmailInvalid{"$233@qq.com"},
"%233@qq.com": user_model.ErrEmailInvalid{"%233@qq.com"},
"&233@qq.com": user_model.ErrEmailInvalid{"&233@qq.com"},
"'233@qq.com": user_model.ErrEmailInvalid{"'233@qq.com"},
"*233@qq.com": user_model.ErrEmailInvalid{"*233@qq.com"},
"+233@qq.com": user_model.ErrEmailInvalid{"+233@qq.com"},
"/233@qq.com": user_model.ErrEmailInvalid{"/233@qq.com"},
"=233@qq.com": user_model.ErrEmailInvalid{"=233@qq.com"},
"?233@qq.com": user_model.ErrEmailInvalid{"?233@qq.com"},
"^233@qq.com": user_model.ErrEmailInvalid{"^233@qq.com"},
"`233@qq.com": user_model.ErrEmailInvalid{"`233@qq.com"},
"{233@qq.com": user_model.ErrEmailInvalid{"{233@qq.com"},
"|233@qq.com": user_model.ErrEmailInvalid{"|233@qq.com"},
"}233@qq.com": user_model.ErrEmailInvalid{"}233@qq.com"},
"~233@qq.com": user_model.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": user_model.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": user_model.ErrEmailCharIsNotSupported{";233@qq.com"},
"Foo <foo@bar.com>": user_model.ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"},
string([]byte{0xE2, 0x84, 0xAA}): user_model.ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})},
Expand Down

0 comments on commit 9862936

Please sign in to comment.