From c522c2eaa29e0057fde920aaae520232201bd253 Mon Sep 17 00:00:00 2001 From: Tomas Touceda Date: Mon, 28 Feb 2022 13:17:10 -0300 Subject: [PATCH] Add missing case for email change errors (#4390) * Add missing case for email change errors * Update tests --- server/service/integration_core_test.go | 13 +++++++++++++ server/service/users.go | 9 +++++++++ server/service/users_test.go | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/server/service/integration_core_test.go b/server/service/integration_core_test.go index c0d7dfce32..35c9088591 100644 --- a/server/service/integration_core_test.go +++ b/server/service/integration_core_test.go @@ -2366,6 +2366,19 @@ func (s *integrationTestSuite) TestUsers() { } s.DoJSON("PATCH", fmt.Sprintf("/api/v1/fleet/users/%d", u.ID), params, http.StatusConflict, &modResp) + // modify that user - set an email that has an invite for it + createInviteReq := createInviteRequest{InvitePayload: fleet.InvitePayload{ + Email: ptr.String("colliding@email.com"), + Name: ptr.String("some name"), + GlobalRole: null.StringFrom(fleet.RoleAdmin), + }} + createInviteResp := createInviteResponse{} + s.DoJSON("POST", "/api/v1/fleet/invites", createInviteReq, http.StatusOK, &createInviteResp) + params = fleet.UserPayload{ + Email: ptr.String("colliding@email.com"), + } + s.DoJSON("PATCH", fmt.Sprintf("/api/v1/fleet/users/%d", u.ID), params, http.StatusConflict, &modResp) + // modify that user - set a non existent email params = fleet.UserPayload{ Email: ptr.String("someemail@qowieuowh.com"), diff --git a/server/service/users.go b/server/service/users.go index 0c38e28fb4..863c18f83d 100644 --- a/server/service/users.go +++ b/server/service/users.go @@ -585,6 +585,15 @@ func (svc *Service) modifyEmailAddress(ctx context.Context, user *fleet.User, em return ctxerr.Wrap(ctx, err) } + switch _, err = svc.ds.InviteByEmail(ctx, email); { + case err == nil: + return ctxerr.Wrap(ctx, alreadyExistsError{}) + case errors.Is(err, sql.ErrNoRows): + // OK + default: + return ctxerr.Wrap(ctx, err) + } + err = svc.ds.PendingEmailChange(ctx, user.ID, email, token) if err != nil { return err diff --git a/server/service/users_test.go b/server/service/users_test.go index 0bdef25e01..afc53ce9e3 100644 --- a/server/service/users_test.go +++ b/server/service/users_test.go @@ -213,6 +213,9 @@ func TestModifyUserEmail(t *testing.T) { ms.UserByEmailFunc = func(ctx context.Context, email string) (*fleet.User, error) { return nil, notFoundErr{} } + ms.InviteByEmailFunc = func(ctx context.Context, email string) (*fleet.Invite, error) { + return nil, notFoundErr{} + } ms.AppConfigFunc = func(ctx context.Context) (*fleet.AppConfig, error) { config := &fleet.AppConfig{ SMTPSettings: fleet.SMTPSettings{ @@ -351,6 +354,9 @@ func TestModifyAdminUserEmailPassword(t *testing.T) { ms.UserByEmailFunc = func(ctx context.Context, email string) (*fleet.User, error) { return nil, notFoundErr{} } + ms.InviteByEmailFunc = func(ctx context.Context, email string) (*fleet.Invite, error) { + return nil, notFoundErr{} + } ms.UserByIDFunc = func(ctx context.Context, id uint) (*fleet.User, error) { return user, nil }