From bf05040dd6eabfe77cdd979c5067ba659e90fd96 Mon Sep 17 00:00:00 2001 From: Wilfred Asomani Date: Fri, 28 Apr 2023 17:23:56 +0000 Subject: [PATCH] satellite/{console,db}: allow passphrasepromt toggling This change adds the user's passphrase prompt setting to the /account/settings endpoints. Issue: https://github.com/storj/storj/issues/5616 Change-Id: I48d470d49e82096fd090b74da323b279e342546e --- .../console/consoleweb/consoleapi/auth.go | 18 ++-- .../console/consoleweb/endpoints_test.go | 88 ++++++++----------- satellite/console/users.go | 18 ++-- satellite/satellitedb/users.go | 8 ++ satellite/satellitedb/users_test.go | 21 +++++ 5 files changed, 87 insertions(+), 66 deletions(-) diff --git a/satellite/console/consoleweb/consoleapi/auth.go b/satellite/console/consoleweb/consoleapi/auth.go index 493765caf..29f307a08 100644 --- a/satellite/console/consoleweb/consoleapi/auth.go +++ b/satellite/console/consoleweb/consoleapi/auth.go @@ -971,10 +971,11 @@ func (a *Auth) SetUserSettings(w http.ResponseWriter, r *http.Request) { defer mon.Task()(&ctx)(&err) var updateInfo struct { - OnboardingStart *bool `json:"onboardingStart"` - OnboardingEnd *bool `json:"onboardingEnd"` - OnboardingStep *string `json:"onboardingStep"` - SessionDuration *int64 `json:"sessionDuration"` + OnboardingStart *bool `json:"onboardingStart"` + OnboardingEnd *bool `json:"onboardingEnd"` + PassphrasePrompt *bool `json:"passphrasePrompt"` + OnboardingStep *string `json:"onboardingStep"` + SessionDuration *int64 `json:"sessionDuration"` } err = json.NewDecoder(r.Body).Decode(&updateInfo) @@ -993,10 +994,11 @@ func (a *Auth) SetUserSettings(w http.ResponseWriter, r *http.Request) { } settings, err := a.service.SetUserSettings(ctx, console.UpsertUserSettingsRequest{ - OnboardingStart: updateInfo.OnboardingStart, - OnboardingEnd: updateInfo.OnboardingEnd, - OnboardingStep: updateInfo.OnboardingStep, - SessionDuration: newDuration, + OnboardingStart: updateInfo.OnboardingStart, + OnboardingEnd: updateInfo.OnboardingEnd, + OnboardingStep: updateInfo.OnboardingStep, + PassphrasePrompt: updateInfo.PassphrasePrompt, + SessionDuration: newDuration, }) if err != nil { a.serveJSONError(w, err) diff --git a/satellite/console/consoleweb/endpoints_test.go b/satellite/console/consoleweb/endpoints_test.go index e98c8c323..ababd5568 100644 --- a/satellite/console/consoleweb/endpoints_test.go +++ b/satellite/console/consoleweb/endpoints_test.go @@ -103,61 +103,58 @@ func TestAuth(t *testing.T) { } { // Test_UserSettings - testGetSettings := func(expected struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string - }) { + type expectedSettings struct { + SessionDuration *time.Duration + OnboardingStart bool + OnboardingEnd bool + PassphrasePrompt bool + OnboardingStep *string + } + testGetSettings := func(expected expectedSettings) { resp, body := test.request(http.MethodGet, "/auth/account/settings", nil) var settings struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string + SessionDuration *time.Duration + OnboardingStart bool + OnboardingEnd bool + PassphrasePrompt bool + OnboardingStep *string } require.Equal(t, http.StatusOK, resp.StatusCode) require.NoError(test.t, json.Unmarshal([]byte(body), &settings)) require.Equal(test.t, expected.OnboardingStart, settings.OnboardingStart) require.Equal(test.t, expected.OnboardingEnd, settings.OnboardingEnd) + require.Equal(test.t, expected.PassphrasePrompt, settings.PassphrasePrompt) require.Equal(test.t, expected.OnboardingStep, settings.OnboardingStep) require.Equal(test.t, expected.SessionDuration, settings.SessionDuration) } - testGetSettings(struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string - }{ - SessionDuration: nil, - OnboardingStart: true, - OnboardingEnd: true, - OnboardingStep: nil, + testGetSettings(expectedSettings{ + SessionDuration: nil, + OnboardingStart: true, + OnboardingEnd: true, + PassphrasePrompt: true, + OnboardingStep: nil, }) step := "cli" duration := time.Duration(15) * time.Minute resp, _ := test.request(http.MethodPatch, "/auth/account/settings", test.toJSON(map[string]interface{}{ - "sessionDuration": duration, - "onboardingStart": true, - "onboardingEnd": false, - "onboardingStep": step, + "sessionDuration": duration, + "onboardingStart": true, + "onboardingEnd": false, + "passphrasePrompt": false, + "onboardingStep": step, })) require.Equal(t, http.StatusOK, resp.StatusCode) - testGetSettings(struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string - }{ - SessionDuration: &duration, - OnboardingStart: true, - OnboardingEnd: false, - OnboardingStep: &step, + testGetSettings(expectedSettings{ + SessionDuration: &duration, + OnboardingStart: true, + OnboardingEnd: false, + PassphrasePrompt: false, + OnboardingStep: &step, }) resp, _ = test.request(http.MethodPatch, "/auth/account/settings", @@ -170,16 +167,12 @@ func TestAuth(t *testing.T) { require.Equal(t, http.StatusOK, resp.StatusCode) // having passed nil to /auth/account/settings shouldn't have changed existing values. - testGetSettings(struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string - }{ - SessionDuration: &duration, - OnboardingStart: true, - OnboardingEnd: false, - OnboardingStep: &step, + testGetSettings(expectedSettings{ + SessionDuration: &duration, + OnboardingStart: true, + OnboardingEnd: false, + PassphrasePrompt: false, + OnboardingStep: &step, }) // having passed 0 as sessionDuration to /auth/account/settings should nullify it. @@ -189,12 +182,7 @@ func TestAuth(t *testing.T) { })) require.Equal(t, http.StatusOK, resp.StatusCode) - testGetSettings(struct { - SessionDuration *time.Duration - OnboardingStart bool - OnboardingEnd bool - OnboardingStep *string - }{ + testGetSettings(expectedSettings{ SessionDuration: nil, OnboardingStart: true, OnboardingEnd: false, diff --git a/satellite/console/users.go b/satellite/console/users.go index ec6f8cce3..680903810 100644 --- a/satellite/console/users.go +++ b/satellite/console/users.go @@ -251,17 +251,19 @@ type UpdateUserRequest struct { // UserSettings contains configurations for a user. type UserSettings struct { - SessionDuration *time.Duration `json:"sessionDuration"` - OnboardingStart bool `json:"onboardingStart"` - OnboardingEnd bool `json:"onboardingEnd"` - OnboardingStep *string `json:"onboardingStep"` + SessionDuration *time.Duration `json:"sessionDuration"` + OnboardingStart bool `json:"onboardingStart"` + OnboardingEnd bool `json:"onboardingEnd"` + PassphrasePrompt bool `json:"passphrasePrompt"` + OnboardingStep *string `json:"onboardingStep"` } // UpsertUserSettingsRequest contains all user settings which are configurable via Users.UpsertSettings. type UpsertUserSettingsRequest struct { // The DB stores this value with minute granularity. Finer time units are ignored. - SessionDuration **time.Duration - OnboardingStart *bool - OnboardingEnd *bool - OnboardingStep *string + SessionDuration **time.Duration + OnboardingStart *bool + OnboardingEnd *bool + PassphrasePrompt *bool + OnboardingStep *string } diff --git a/satellite/satellitedb/users.go b/satellite/satellitedb/users.go index ee1f49c43..bed8f81b0 100644 --- a/satellite/satellitedb/users.go +++ b/satellite/satellitedb/users.go @@ -302,6 +302,10 @@ func (users *users) GetSettings(ctx context.Context, userID uuid.UUID) (settings settings.OnboardingStart = row.OnboardingStart settings.OnboardingEnd = row.OnboardingEnd settings.OnboardingStep = row.OnboardingStep + settings.PassphrasePrompt = true + if row.PassphrasePrompt != nil { + settings.PassphrasePrompt = *row.PassphrasePrompt + } if row.SessionMinutes != nil { dur := time.Duration(*row.SessionMinutes) * time.Minute settings.SessionDuration = &dur @@ -334,6 +338,10 @@ func (users *users) UpsertSettings(ctx context.Context, userID uuid.UUID, settin update.OnboardingEnd = dbx.UserSettings_OnboardingEnd(*settings.OnboardingEnd) fieldCount++ } + if settings.PassphrasePrompt != nil { + update.PassphrasePrompt = dbx.UserSettings_PassphrasePrompt(*settings.PassphrasePrompt) + fieldCount++ + } if settings.OnboardingStep != nil { update.OnboardingStep = dbx.UserSettings_OnboardingStep(*settings.OnboardingStep) fieldCount++ diff --git a/satellite/satellitedb/users_test.go b/satellite/satellitedb/users_test.go index b02fa36c7..e02fe0d7b 100644 --- a/satellite/satellitedb/users_test.go +++ b/satellite/satellitedb/users_test.go @@ -363,5 +363,26 @@ func TestUserSettings(t *testing.T) { require.Equal(t, newBool, settings.OnboardingEnd) require.Equal(t, &newStep, settings.OnboardingStep) }) + + t.Run("test passphrase prompt", func(t *testing.T) { + id = testrand.UUID() + require.NoError(t, users.UpsertSettings(ctx, id, console.UpsertUserSettingsRequest{})) + settings, err := users.GetSettings(ctx, id) + require.NoError(t, err) + require.True(t, settings.PassphrasePrompt) + + newBool := false + require.NoError(t, users.UpsertSettings(ctx, id, console.UpsertUserSettingsRequest{ + PassphrasePrompt: &newBool, + })) + settings, err = users.GetSettings(ctx, id) + require.NoError(t, err) + require.Equal(t, newBool, settings.PassphrasePrompt) + + require.NoError(t, users.UpsertSettings(ctx, id, console.UpsertUserSettingsRequest{})) + settings, err = users.GetSettings(ctx, id) + require.NoError(t, err) + require.Equal(t, newBool, settings.PassphrasePrompt) + }) }) }