Skip to content

Commit

Permalink
fix: lowercase emails (#714)
Browse files Browse the repository at this point in the history
  • Loading branch information
kangmingtay committed Sep 30, 2022
1 parent e553477 commit d65ba60
Show file tree
Hide file tree
Showing 9 changed files with 25 additions and 14 deletions.
3 changes: 2 additions & 1 deletion api/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@ func (a *API) adminUserCreate(w http.ResponseWriter, r *http.Request) error {
}

if params.Email != "" {
if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}
if exists, err := models.IsDuplicatedEmail(db, params.Email, aud); err != nil {
Expand Down
3 changes: 2 additions & 1 deletion api/invite.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ func (a *API) Invite(w http.ResponseWriter, r *http.Request) error {
return badRequestError("Could not read Invite params: %v", err)
}

if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}

Expand Down
3 changes: 2 additions & 1 deletion api/magic_link.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ func (a *API) MagicLink(w http.ResponseWriter, r *http.Request) error {
if params.Email == "" {
return unprocessableEntityError("Password recovery requires an email")
}
if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}

Expand Down
15 changes: 9 additions & 6 deletions api/mail.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"net/http"
"strings"
"time"

"github.com/netlify/gotrue/conf"
Expand Down Expand Up @@ -57,7 +58,8 @@ func (a *API) GenerateLink(w http.ResponseWriter, r *http.Request) error {
return badRequestError("Could not parse JSON: %v", err)
}

if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}

Expand Down Expand Up @@ -158,7 +160,8 @@ func (a *API) GenerateLink(w http.ResponseWriter, r *http.Request) error {
if !config.Mailer.SecureEmailChangeEnabled && params.Type == "email_change_current" {
return unprocessableEntityError("Enable secure email change to generate link for current email")
}
if terr := a.validateEmail(ctx, params.NewEmail); terr != nil {
params.NewEmail, terr = a.validateEmail(ctx, params.NewEmail)
if terr != nil {
return unprocessableEntityError("The new email address provided is invalid")
}
if exists, terr := models.IsDuplicatedEmail(tx, params.NewEmail, user.Aud); terr != nil {
Expand Down Expand Up @@ -350,13 +353,13 @@ func (a *API) sendEmailChange(tx *storage.Connection, config *conf.GlobalConfigu
), "Database error updating user for email change")
}

func (a *API) validateEmail(ctx context.Context, email string) error {
func (a *API) validateEmail(ctx context.Context, email string) (string, error) {
if email == "" {
return unprocessableEntityError("An email address is required")
return "", unprocessableEntityError("An email address is required")
}
mailer := a.Mailer(ctx)
if err := mailer.ValidateEmail(email); err != nil {
return unprocessableEntityError("Unable to validate email address: " + err.Error())
return "", unprocessableEntityError("Unable to validate email address: " + err.Error())
}
return nil
return strings.ToLower(email), nil
}
3 changes: 2 additions & 1 deletion api/otp.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,8 @@ func (a *API) shouldCreateUser(r *http.Request, params *OtpParams) (bool, error)
aud := a.requestAud(ctx, r)
var err error
if params.Email != "" {
if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return false, err
}
_, err = models.FindUserByEmailAndAudience(db, params.Email, aud)
Expand Down
3 changes: 2 additions & 1 deletion api/recover.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ func (a *API) Recover(w http.ResponseWriter, r *http.Request) error {
var user *models.User
aud := a.requestAud(ctx, r)

if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}
user, err = models.FindUserByEmailAndAudience(db, params.Email, aud)
Expand Down
3 changes: 2 additions & 1 deletion api/signup.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ func (a *API) Signup(w http.ResponseWriter, r *http.Request) error {
if !config.External.Email.Enabled {
return badRequestError("Email signups are disabled")
}
if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return err
}
user, err = models.FindUserByEmailAndAudience(db, params.Email, params.Aud)
Expand Down
3 changes: 2 additions & 1 deletion api/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ func (a *API) UserUpdate(w http.ResponseWriter, r *http.Request) error {
}

if params.Email != "" && params.Email != user.GetEmail() {
if terr = a.validateEmail(ctx, params.Email); terr != nil {
params.Email, terr = a.validateEmail(ctx, params.Email)
if terr != nil {
return terr
}

Expand Down
3 changes: 2 additions & 1 deletion api/verify.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,8 @@ func (a *API) verifyUserAndToken(ctx context.Context, conn *storage.Connection,
return nil, badRequestError("Invalid sms verification type")
}
} else if isEmailOtpVerification(params) {
if err := a.validateEmail(ctx, params.Email); err != nil {
params.Email, err = a.validateEmail(ctx, params.Email)
if err != nil {
return nil, unprocessableEntityError("Invalid email format").WithInternalError(err)
}
tokenHash = fmt.Sprintf("%x", sha256.Sum224([]byte(string(params.Email)+params.Token)))
Expand Down

0 comments on commit d65ba60

Please sign in to comment.