Skip to content

Commit c6a9540

Browse files
committed
fix(email): Send signin code for sign in with password unverified session case
Because: * When users are taken to '/signin_token_code' from a sign in with password navigation, we don't automatically send the associated email This commit: * Ensures the email is sent fixes FXA-12467
1 parent 7550ea8 commit c6a9540

3 files changed

Lines changed: 51 additions & 1 deletion

File tree

packages/fxa-settings/src/pages/Signin/container.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,6 @@ const SigninContainer = ({
442442
// but we should update 'verified' once we know the real status
443443
// this will be taken care of in the clean up ticket FXA-12454
444444
isVerified = await session.isSessionVerified();
445-
console.log('HELLO isVerified', isVerified);
446445
storeAccountData({
447446
...accountData,
448447
verified: isVerified,

packages/fxa-settings/src/pages/Signin/index.test.tsx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ jest.mock('../../lib/storage-utils', () => ({
102102
}));
103103

104104
const mockSetData = jest.fn();
105+
const mockSendVerificationCode = jest.fn();
105106
jest.mock('../../models', () => {
106107
return {
107108
...jest.requireActual('../../models'),
@@ -110,6 +111,9 @@ jest.mock('../../models', () => {
110111
setDataType: mockSetData,
111112
};
112113
},
114+
useSession: () => ({
115+
sendVerificationCode: mockSendVerificationCode,
116+
}),
113117
};
114118
});
115119

@@ -446,6 +450,39 @@ describe('Signin component', () => {
446450
});
447451
});
448452

453+
it('calls sendVerificationCode with successful signin, but unverified session', async () => {
454+
const beginSigninHandler = jest.fn().mockReturnValueOnce(
455+
createBeginSigninResponse({
456+
verified: false,
457+
verificationReason: undefined,
458+
})
459+
);
460+
461+
render({ beginSigninHandler });
462+
463+
await enterPasswordAndSubmit();
464+
await waitFor(() => {
465+
expect(mockSendVerificationCode).toHaveBeenCalledTimes(1);
466+
});
467+
});
468+
469+
it('does not call sendVerificationCode when reason is signup, on successful signin unverified session', async () => {
470+
const beginSigninHandler = jest.fn().mockReturnValueOnce(
471+
createBeginSigninResponse({
472+
verified: false,
473+
verificationReason: VerificationReasons.SIGN_UP,
474+
})
475+
);
476+
477+
render({ beginSigninHandler });
478+
479+
await enterPasswordAndSubmit();
480+
await waitFor(() => {
481+
expect(navigate).toHaveBeenCalled();
482+
});
483+
expect(mockSendVerificationCode).not.toHaveBeenCalled();
484+
});
485+
449486
it('OAuth forced 2FA without TOTP navigates to /signin_token_code (email OTP first)', async () => {
450487
const beginSigninHandler = jest.fn().mockReturnValueOnce(
451488
createBeginSigninResponse({

packages/fxa-settings/src/pages/Signin/index.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
useFtlMsgResolver,
2525
isWebIntegration,
2626
isOAuthIntegration,
27+
useSession,
2728
} from '../../models';
2829
import {
2930
isClientMonitor,
@@ -38,6 +39,7 @@ import Banner from '../../components/Banner';
3839
import { SensitiveData } from '../../lib/sensitive-data-client';
3940
import { BannerLinkProps } from '../../components/Banner/interfaces';
4041
import CmsButtonWithFallback from '../../components/CmsButtonWithFallback';
42+
import VerificationReasons from '../../constants/verification-reasons';
4143

4244
export const viewName = 'signin';
4345

@@ -68,6 +70,7 @@ const Signin = ({
6870
const ftlMsgResolver = useFtlMsgResolver();
6971
const webRedirectCheck = useWebRedirect(integration.data.redirectTo);
7072
const sensitiveDataClient = useSensitiveDataClient();
73+
const session = useSession();
7174

7275
const [localizedBannerError, setLocalizedBannerError] = useState(
7376
localizedErrorFromLocationState || ''
@@ -227,6 +230,16 @@ const Signin = ({
227230
setLocalizedBannerError(
228231
getLocalizedErrorMessage(ftlMsgResolver, navError)
229232
);
233+
} else {
234+
// TODO, address signIn.verified vs session.verified discrepancy
235+
// currently 'verified' only checks session status, but 'verificationReason'
236+
// can tell us if it's a sign up. This will be cleaned up in FXA-12454
237+
if (
238+
!data.signIn.verified &&
239+
data.signIn.verificationReason !== VerificationReasons.SIGN_UP
240+
) {
241+
session.sendVerificationCode();
242+
}
230243
}
231244
}
232245
if (error) {
@@ -321,6 +334,7 @@ const Signin = ({
321334
setLocalizedBannerError,
322335
finishOAuthFlowHandler,
323336
integration,
337+
session,
324338
location.search,
325339
webRedirectCheck,
326340
sensitiveDataClient,

0 commit comments

Comments
 (0)