From 2ae75bcf4ef562faa66947f1809bd2dcf70b8237 Mon Sep 17 00:00:00 2001 From: Jeremy Wharton Date: Thu, 22 Jun 2023 00:47:52 -0500 Subject: [PATCH] satellite/console: prevent invite replies from deleting expired invites This change prevents project member invitation responses from deleting expired project invitations. Previously, accepting or declining an expired invitation cause it to be destroyed. References #5752 Change-Id: Id3917fb825bffc3e8a262d5b541b907678db1809 --- satellite/console/service.go | 1 - satellite/console/service_test.go | 37 ++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/satellite/console/service.go b/satellite/console/service.go index a0346e42a..a76c779b0 100644 --- a/satellite/console/service.go +++ b/satellite/console/service.go @@ -3545,7 +3545,6 @@ func (s *Service) RespondToProjectInvitation(ctx context.Context, projectID uuid } if s.IsProjectInvitationExpired(invite) { - deleteWithLog() return ErrProjectInviteInvalid.New(projInviteInvalidErrMsg) } diff --git a/satellite/console/service_test.go b/satellite/console/service_test.go index b9c68ebcd..2de8a3bbb 100644 --- a/satellite/console/service_test.go +++ b/satellite/console/service_test.go @@ -2186,16 +2186,24 @@ func TestProjectInvitations(t *testing.T) { proj := addProject(t, ctx) invite := addInvite(t, ctx, proj, user.Email) + + // Expect an error when accepting an expired invitation. + // The invitation should remain in the database. setInviteDate(t, ctx, invite, time.Now().Add(-sat.Config.Console.ProjectInvitationExpiration)) err := service.RespondToProjectInvitation(ctx, proj.ID, console.ProjectInvitationAccept) require.True(t, console.ErrProjectInviteInvalid.Has(err)) - addInvite(t, ctx, proj, user.Email) + _, err = sat.DB.Console().ProjectInvitations().Get(ctx, proj.ID, user.Email) + require.NoError(t, err) + + // Expect no error when accepting an active invitation. + // The invitation should be removed from the database, and the user should be added as a member. + setInviteDate(t, ctx, invite, time.Now()) + require.NoError(t, err) require.NoError(t, service.RespondToProjectInvitation(ctx, proj.ID, console.ProjectInvitationAccept)) - invites, err := service.GetUserProjectInvitations(ctx) - require.NoError(t, err) - require.Empty(t, invites) + _, err = sat.DB.Console().ProjectInvitations().Get(ctx, proj.ID, user.Email) + require.ErrorIs(t, err, sql.ErrNoRows) memberships, err := sat.DB.Console().ProjectMembers().GetByMemberID(ctx, user.ID) require.NoError(t, err) @@ -2214,12 +2222,25 @@ func TestProjectInvitations(t *testing.T) { user, ctx := getUserAndCtx(t) proj := addProject(t, ctx) - addInvite(t, ctx, proj, user.Email) + invite := addInvite(t, ctx, proj, user.Email) + + // Expect an error when rejecting an expired invitation. + // The invitation should remain in the database. + setInviteDate(t, ctx, invite, time.Now().Add(-sat.Config.Console.ProjectInvitationExpiration)) + err := service.RespondToProjectInvitation(ctx, proj.ID, console.ProjectInvitationDecline) + require.True(t, console.ErrProjectInviteInvalid.Has(err)) + + _, err = sat.DB.Console().ProjectInvitations().Get(ctx, proj.ID, user.Email) + require.NoError(t, err) + + // Expect no error when rejecting an active invitation. + // The invitation should be removed from the database. + setInviteDate(t, ctx, invite, time.Now()) + require.NoError(t, err) require.NoError(t, service.RespondToProjectInvitation(ctx, proj.ID, console.ProjectInvitationDecline)) - invites, err := service.GetUserProjectInvitations(ctx) - require.NoError(t, err) - require.Empty(t, invites) + _, err = sat.DB.Console().ProjectInvitations().Get(ctx, proj.ID, user.Email) + require.ErrorIs(t, err, sql.ErrNoRows) memberships, err := sat.DB.Console().ProjectMembers().GetByMemberID(ctx, user.ID) require.NoError(t, err)