Skip to content

Commit 0042f62

Browse files
Fix session expire error when opening settings
ref DEV-2501
2 parents 36f5721 + 9eab39b commit 0042f62

26 files changed

+94
-54
lines changed

.vettedpositions

+4-4
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040
/pkg/auth/handler/webapp/auth_entry_point_middleware.go:31:31: requestcontext
4141
/pkg/auth/handler/webapp/auth_entry_point_middleware.go:32:35: requestcontext
4242
/pkg/auth/handler/webapp/authflow_change_password.go:96:26: requestcontext
43-
/pkg/auth/handler/webapp/authflow_controller.go:989:30: requestcontext
44-
/pkg/auth/handler/webapp/authflow_controller.go:994:24: requestcontext
45-
/pkg/auth/handler/webapp/authflow_controller.go:1002:19: requestcontext
46-
/pkg/auth/handler/webapp/authflow_controller.go:1011:19: requestcontext
43+
/pkg/auth/handler/webapp/authflow_controller.go:990:30: requestcontext
44+
/pkg/auth/handler/webapp/authflow_controller.go:995:24: requestcontext
45+
/pkg/auth/handler/webapp/authflow_controller.go:1003:19: requestcontext
46+
/pkg/auth/handler/webapp/authflow_controller.go:1012:19: requestcontext
4747
/pkg/auth/handler/webapp/authflow_create_password.go:132:26: requestcontext
4848
/pkg/auth/handler/webapp/authflow_enter_oob_otp.go:156:26: requestcontext
4949
/pkg/auth/handler/webapp/authflow_enter_password.go:138:26: requestcontext

pkg/auth/handler/webapp/alternatives.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type CreateAuthenticatorPhoneOTPNode interface {
2828
// nolint: gocognit
2929
func handleAlternativeSteps(ctrl *Controller) {
3030
ctrl.PostAction("choose_step", func(ctx context.Context) (err error) {
31-
session, err := ctrl.GetWebappSession(ctx)
31+
session, err := ctrl.InteractionSession(ctx)
3232
if err != nil {
3333
return err
3434
}

pkg/auth/handler/webapp/authflow_controller.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func (c *AuthflowController) HandleStartOfFlow(
202202
handleWithScreen(screen)
203203
}
204204

205-
func (c *AuthflowController) isExpectedWebSessionError(err error) bool {
205+
func (c *AuthflowController) isWebSessionNotFoundOrCompletedError(err error) bool {
206206
return apierrors.IsKind(err, webapp.WebUIInvalidSession) || apierrors.IsKind(err, webapp.WebUISessionCompleted)
207207
}
208208

@@ -211,7 +211,7 @@ func (c *AuthflowController) HandleOAuthCallback(ctx context.Context, w http.Res
211211

212212
s, err := c.Sessions.Get(ctx, state.WebSessionID)
213213
if err != nil {
214-
if !c.isExpectedWebSessionError(err) {
214+
if !c.isWebSessionNotFoundOrCompletedError(err) {
215215
c.Logger.WithError(err).Errorf("failed to get web session")
216216
}
217217
c.renderError(ctx, w, r, err)
@@ -313,7 +313,7 @@ func (c *AuthflowController) HandleStep(ctx context.Context, w http.ResponseWrit
313313

314314
s, err := c.getWebSession(ctx)
315315
if err != nil {
316-
if !c.isExpectedWebSessionError(err) {
316+
if !c.isWebSessionNotFoundOrCompletedError(err) {
317317
c.Logger.WithError(err).Errorf("failed to get web session")
318318
}
319319
c.renderError(ctx, w, r, err)
@@ -345,7 +345,7 @@ func (c *AuthflowController) HandleWithoutFlow(ctx context.Context, w http.Respo
345345
var session *webapp.Session
346346
s, err := c.getWebSession(ctx)
347347
if err != nil {
348-
if !c.isExpectedWebSessionError(err) {
348+
if !c.isWebSessionNotFoundOrCompletedError(err) {
349349
c.Logger.WithError(err).Errorf("failed to get web session")
350350
}
351351
} else {
@@ -384,7 +384,8 @@ func (c *AuthflowController) getOrCreateWebSession(ctx context.Context, w http.R
384384
if err == nil && s != nil {
385385
return s, nil
386386
}
387-
if !errors.Is(err, webapp.ErrSessionNotFound) {
387+
388+
if !c.isWebSessionNotFoundOrCompletedError(err) {
388389
return nil, err
389390
}
390391

pkg/auth/handler/webapp/authflowv2/select_account.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (h *AuthflowV2SelectAccountHandler) ServeHTTP(w http.ResponseWriter, r *htt
123123
ctrl.BeforeHandle(func(ctx context.Context) error {
124124

125125
// Ensure webapp session exist
126-
ws, err := ctrl.GetWebappSession(ctx)
126+
ws, err := ctrl.InteractionSession(ctx)
127127
if err != nil {
128128
return err
129129
}

pkg/auth/handler/webapp/confirm_terminate_other_sessions.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (h *ConfirmTerminateOtherSessionsHandler) ServeHTTP(w http.ResponseWriter,
6666
defer ctrl.ServeWithDBTx(r.Context())
6767

6868
ctrl.Get(func(ctx context.Context) error {
69-
session, err := ctrl.GetWebappSession(ctx)
69+
session, err := ctrl.InteractionSession(ctx)
7070
if err != nil {
7171
return err
7272
}
@@ -91,7 +91,7 @@ func (h *ConfirmTerminateOtherSessionsHandler) ServeHTTP(w http.ResponseWriter,
9191
return err
9292
}
9393

94-
session, err := ctrl.GetWebappSession(ctx)
94+
session, err := ctrl.InteractionSession(ctx)
9595
if err != nil {
9696
return err
9797
}

pkg/auth/handler/webapp/controller.go

+10-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package webapp
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
76
"net/http"
87

@@ -315,19 +314,16 @@ func (c *Controller) rewindSessionHistory(session *webapp.Session) error {
315314
return nil
316315
}
317316

318-
func (c *Controller) GetWebappSession(ctx context.Context) (*webapp.Session, error) {
317+
func (c *Controller) InteractionSession(ctx context.Context) (*webapp.Session, error) {
319318
s := webapp.GetSession(ctx)
320-
if s == nil {
319+
if s == nil || s.IsCompleted {
321320
return nil, webapp.ErrSessionNotFound
322321
}
323-
if s.IsCompleted {
324-
return nil, webapp.ErrSessionCompleted
325-
}
326322
return s, nil
327323
}
328324

329325
func (c *Controller) InteractionGet(ctx context.Context) (*interaction.Graph, error) {
330-
s, err := c.GetWebappSession(ctx)
326+
s, err := c.InteractionSession(ctx)
331327
if err != nil {
332328
return nil, err
333329
}
@@ -348,7 +344,7 @@ func (c *Controller) InteractionGetWithSession(ctx context.Context, s *webapp.Se
348344
}
349345

350346
func (c *Controller) InteractionPost(ctx context.Context, inputFn func() (interface{}, error)) (*webapp.Result, error) {
351-
s, err := c.GetWebappSession(ctx)
347+
s, err := c.InteractionSession(ctx)
352348
if err != nil {
353349
return nil, err
354350
}
@@ -381,13 +377,9 @@ func (c *Controller) InteractionOAuthCallback(ctx context.Context, oauthInput In
381377
}
382378

383379
func (c *Controller) getSettingsActionWebSession(ctx context.Context, r *http.Request) (*webapp.Session, error) {
384-
webappSession, err := c.GetWebappSession(ctx)
385-
if err != nil {
386-
// No session means it is not in settings action
387-
if errors.Is(err, webapp.ErrSessionNotFound) {
388-
return nil, nil
389-
}
390-
return nil, err
380+
webappSession := webapp.GetSession(ctx)
381+
if webappSession == nil {
382+
return nil, nil
391383
}
392384
if webappSession.SettingsActionID == "" {
393385
// This session is not for a settings action, ignore it
@@ -401,6 +393,9 @@ func (c *Controller) getSettingsActionWebSession(ctx context.Context, r *http.Re
401393
// This session is not for the current settings action, ignore it
402394
return nil, nil
403395
}
396+
if webappSession.IsCompleted {
397+
return nil, webapp.ErrSessionCompleted
398+
}
404399
return webappSession, nil
405400
}
406401

pkg/auth/handler/webapp/create_passkey.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (h *CreatePasskeyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
5353
defer ctrl.ServeWithDBTx(r.Context())
5454

5555
ctrl.Get(func(ctx context.Context) error {
56-
session, err := ctrl.GetWebappSession(ctx)
56+
session, err := ctrl.InteractionSession(ctx)
5757
if err != nil {
5858
return err
5959
}

pkg/auth/handler/webapp/create_password.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (h *CreatePasswordHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
107107
defer ctrl.ServeWithDBTx(r.Context())
108108

109109
ctrl.Get(func(ctx context.Context) error {
110-
session, err := ctrl.GetWebappSession(ctx)
110+
session, err := ctrl.InteractionSession(ctx)
111111
if err != nil {
112112
return err
113113
}

pkg/auth/handler/webapp/enter_oob_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (h *EnterOOBOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
161161
defer ctrl.ServeWithDBTx(r.Context())
162162

163163
ctrl.Get(func(ctx context.Context) error {
164-
session, err := ctrl.GetWebappSession(ctx)
164+
session, err := ctrl.InteractionSession(ctx)
165165
if err != nil {
166166
return err
167167
}

pkg/auth/handler/webapp/enter_password.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func (h *EnterPasswordHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
118118
defer ctrl.ServeWithDBTx(r.Context())
119119

120120
ctrl.Get(func(ctx context.Context) error {
121-
session, err := ctrl.GetWebappSession(ctx)
121+
session, err := ctrl.InteractionSession(ctx)
122122
if err != nil {
123123
return err
124124
}

pkg/auth/handler/webapp/enter_recovery_code.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (h *EnterRecoveryCodeHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
6868
defer ctrl.ServeWithDBTx(r.Context())
6969

7070
ctrl.Get(func(ctx context.Context) error {
71-
session, err := ctrl.GetWebappSession(ctx)
71+
session, err := ctrl.InteractionSession(ctx)
7272
if err != nil {
7373
return err
7474
}

pkg/auth/handler/webapp/enter_totp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (h *EnterTOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
6868
defer ctrl.ServeWithDBTx(r.Context())
6969

7070
ctrl.Get(func(ctx context.Context) error {
71-
session, err := ctrl.GetWebappSession(ctx)
71+
session, err := ctrl.InteractionSession(ctx)
7272
if err != nil {
7373
return err
7474
}

pkg/auth/handler/webapp/forgot_password_success.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (h *ForgotPasswordSuccessHandler) ServeHTTP(w http.ResponseWriter, r *http.
5757
defer ctrl.ServeWithDBTx(r.Context())
5858

5959
ctrl.Get(func(ctx context.Context) error {
60-
session, err := ctrl.GetWebappSession(ctx)
60+
session, err := ctrl.InteractionSession(ctx)
6161
if err != nil {
6262
return err
6363
}

pkg/auth/handler/webapp/login_link_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (h *LoginLinkOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
121121
defer ctrl.ServeWithDBTx(r.Context())
122122

123123
ctrl.Get(func(ctx context.Context) error {
124-
session, err := ctrl.GetWebappSession(ctx)
124+
session, err := ctrl.InteractionSession(ctx)
125125
if err != nil {
126126
return err
127127
}

pkg/auth/handler/webapp/prompt_create_passkey.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func (h *PromptCreatePasskeyHandler) ServeHTTP(w http.ResponseWriter, r *http.Re
4747
defer ctrl.ServeWithDBTx(r.Context())
4848

4949
ctrl.Get(func(ctx context.Context) error {
50-
session, err := ctrl.GetWebappSession(ctx)
50+
session, err := ctrl.InteractionSession(ctx)
5151
if err != nil {
5252
return err
5353
}

pkg/auth/handler/webapp/setup_login_link_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (h *SetupLoginLinkOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
6767
defer ctrl.ServeWithDBTx(r.Context())
6868

6969
ctrl.Get(func(ctx context.Context) error {
70-
session, err := ctrl.GetWebappSession(ctx)
70+
session, err := ctrl.InteractionSession(ctx)
7171
if err != nil {
7272
return err
7373
}

pkg/auth/handler/webapp/setup_oob_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (h *SetupOOBOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
126126
defer ctrl.ServeWithDBTx(r.Context())
127127

128128
ctrl.Get(func(ctx context.Context) error {
129-
session, err := ctrl.GetWebappSession(ctx)
129+
session, err := ctrl.InteractionSession(ctx)
130130
if err != nil {
131131
return err
132132
}

pkg/auth/handler/webapp/setup_totp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func (h *SetupTOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
139139
defer ctrl.ServeWithDBTx(r.Context())
140140

141141
ctrl.Get(func(ctx context.Context) error {
142-
session, err := ctrl.GetWebappSession(ctx)
142+
session, err := ctrl.InteractionSession(ctx)
143143
if err != nil {
144144
return err
145145
}

pkg/auth/handler/webapp/setup_whatsapp_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func (h *SetupWhatsappOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque
6262
defer ctrl.ServeWithDBTx(r.Context())
6363

6464
ctrl.Get(func(ctx context.Context) error {
65-
session, err := ctrl.GetWebappSession(ctx)
65+
session, err := ctrl.InteractionSession(ctx)
6666
if err != nil {
6767
return err
6868
}

pkg/auth/handler/webapp/use_passkey.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (h *UsePasskeyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
5353
defer ctrl.ServeWithDBTx(r.Context())
5454

5555
ctrl.Get(func(ctx context.Context) error {
56-
session, err := ctrl.GetWebappSession(ctx)
56+
session, err := ctrl.InteractionSession(ctx)
5757
if err != nil {
5858
return err
5959
}

pkg/auth/handler/webapp/verify_identity.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func (h *VerifyIdentityHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
176176

177177
ctrl.Get(func(ctx context.Context) error {
178178
// This page should be opened by the original user agent.
179-
session, err := ctrl.GetWebappSession(ctx)
179+
session, err := ctrl.InteractionSession(ctx)
180180
if err != nil {
181181
return err
182182
}

pkg/auth/handler/webapp/wechat_auth.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func (h *WechatAuthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
101101
defer ctrl.ServeWithDBTx(r.Context())
102102

103103
ctrl.Get(func(ctx context.Context) error {
104-
session, err := ctrl.GetWebappSession(ctx)
104+
session, err := ctrl.InteractionSession(ctx)
105105
if err != nil {
106106
return err
107107
}
@@ -149,7 +149,7 @@ func (h *WechatAuthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
149149
})
150150

151151
ctrl.PostAction("", func(ctx context.Context) error {
152-
session, err := ctrl.GetWebappSession(ctx)
152+
session, err := ctrl.InteractionSession(ctx)
153153
if err != nil {
154154
return err
155155
}

pkg/auth/handler/webapp/whatsapp_otp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (h *WhatsappOTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
129129
defer ctrl.ServeWithDBTx(r.Context())
130130

131131
ctrl.Get(func(ctx context.Context) error {
132-
session, err := ctrl.GetWebappSession(ctx)
132+
session, err := ctrl.InteractionSession(ctx)
133133
if err != nil {
134134
return err
135135
}

portal/src/ScreenHeader.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
PanelType,
1111
IRenderFunction,
1212
IPanelProps,
13+
IContextualMenuProps,
1314
} from "@fluentui/react";
1415
import { useAppAndSecretConfigQuery } from "./graphql/portal/query/appAndSecretConfigQuery";
1516
import { useViewerQuery } from "./graphql/portal/query/viewerQuery";
@@ -22,6 +23,7 @@ import { useBoolean } from "@fluentui/react-hooks";
2223
import ExternalLink from "./ExternalLink";
2324
import { useLogout } from "./graphql/portal/Authenticated";
2425
import { useCapture } from "./gtm_v2";
26+
import { useSettingsAnchor } from "./hook/authgear";
2527

2628
interface LogoProps {
2729
isNavbarHeader?: boolean;
@@ -177,7 +179,7 @@ const ScreenHeader: React.VFC<ScreenNavProps> = function ScreenHeader(props) {
177179
const { showHamburger = true } = props;
178180
const { renderToString } = useContext(Context);
179181
const capture = useCapture();
180-
const { themes, authgearEndpoint } = useSystemConfig();
182+
const { themes } = useSystemConfig();
181183
const { appID } = useParams() as { appID: string };
182184
const { viewer } = useViewerQuery();
183185
const [isNavbarOpen, { setTrue: openNavbar, setFalse: dismissNavbar }] =
@@ -225,6 +227,8 @@ const ScreenHeader: React.VFC<ScreenNavProps> = function ScreenHeader(props) {
225227
[themes.main]
226228
);
227229

230+
const { href: settingURL, onClick: onClickSettings } = useSettingsAnchor();
231+
228232
const menuProps = useMemo(() => {
229233
const items = [
230234
{
@@ -233,7 +237,8 @@ const ScreenHeader: React.VFC<ScreenNavProps> = function ScreenHeader(props) {
233237
iconProps: {
234238
iconName: "PlayerSettings",
235239
},
236-
href: authgearEndpoint + "/settings",
240+
href: settingURL,
241+
onClick: onClickSettings,
237242
},
238243
{
239244
key: "logout",
@@ -243,7 +248,7 @@ const ScreenHeader: React.VFC<ScreenNavProps> = function ScreenHeader(props) {
243248
},
244249
onClick: onClickLogout,
245250
},
246-
];
251+
] satisfies IContextualMenuProps["items"];
247252

248253
if (window.Osano !== undefined) {
249254
items.splice(1, 0, {
@@ -256,12 +261,13 @@ const ScreenHeader: React.VFC<ScreenNavProps> = function ScreenHeader(props) {
256261
});
257262
}
258263

259-
return { items };
264+
return { items } satisfies IContextualMenuProps;
260265
}, [
266+
renderToString,
267+
settingURL,
268+
onClickSettings,
261269
onClickLogout,
262270
onClickCookiePreference,
263-
renderToString,
264-
authgearEndpoint,
265271
]);
266272

267273
return (

0 commit comments

Comments
 (0)