@@ -173,6 +199,15 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
>
+
+ <>
+
+ {backupCodes.map((code) => (
+
{formatBackupCode(code)}
+ ))}
+
+ >
+
diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json
index f1df7ee00aeda4..2857d95e166423 100644
--- a/apps/web/public/static/locales/en/common.json
+++ b/apps/web/public/static/locales/en/common.json
@@ -2011,7 +2011,9 @@
"my_availability": "My Availability",
"team_availability": "Team Availability",
"backup_code": "Backup Code",
+ "backup_codes": "Backup Codes",
"backup_code_instructions": "Each backup code can be used exactly once to grant access without your authenticator.",
+ "backup_codes_copied": "Backup codes copied!",
"incorrect_backup_code": "Backup code is incorrect.",
"lost_access": "Lost access",
"missing_backup_codes": "No backup codes found. Please generate them in your settings.",
From 9706b737391ac406255791dbc42308f06f60b130 Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Fri, 4 Aug 2023 16:09:23 +0000
Subject: [PATCH 04/17] fix: accept backup codes with or without dashes
---
packages/features/auth/lib/next-auth-options.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/features/auth/lib/next-auth-options.ts b/packages/features/auth/lib/next-auth-options.ts
index 01e82098974d79..7fd3ffbcafbdf1 100644
--- a/packages/features/auth/lib/next-auth-options.ts
+++ b/packages/features/auth/lib/next-auth-options.ts
@@ -141,7 +141,7 @@ const providers: Provider[] = [
);
// check if user-supplied code matches one
- const index = backupCodes.indexOf(credentials.backupCode);
+ const index = backupCodes.indexOf(credentials.backupCode.replaceAll("-", ""));
if (index === -1) throw new Error(ErrorCode.IncorrectBackupCode);
// delete verified backup code and re-encrypt remaining
From 03dcdf849b358b5a9b30fe8037a4ec63822c7fb9 Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Fri, 4 Aug 2023 16:18:39 +0000
Subject: [PATCH 05/17] fix: backup code download content
---
apps/web/components/settings/EnableTwoFactorModal.tsx | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/apps/web/components/settings/EnableTwoFactorModal.tsx b/apps/web/components/settings/EnableTwoFactorModal.tsx
index 539e8db841ff50..ccef08a50892a8 100644
--- a/apps/web/components/settings/EnableTwoFactorModal.tsx
+++ b/apps/web/components/settings/EnableTwoFactorModal.tsx
@@ -92,13 +92,11 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
setBackupCodes(body.backupCodes);
// create backup codes download url
- const textBlob = new Blob([backupCodes.map(formatBackupCode).join("\n")], {
+ const textBlob = new Blob([body.backupCodes.map(formatBackupCode).join("\n")], {
type: "text/plain",
});
- if (backupCodesUrl) {
- window.URL.revokeObjectURL(backupCodesUrl);
- }
- setBackupCodesUrl(window.URL.createObjectURL(textBlob));
+ if (backupCodesUrl) URL.revokeObjectURL(backupCodesUrl);
+ setBackupCodesUrl(URL.createObjectURL(textBlob));
setDataUri(body.dataUri);
setSecret(body.secret);
From d15cbecabc90baf02abf23f627653b7b5aba6cfe Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Fri, 4 Aug 2023 16:20:33 +0000
Subject: [PATCH 06/17] fix: backup code button label
---
apps/web/components/settings/EnableTwoFactorModal.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/web/components/settings/EnableTwoFactorModal.tsx b/apps/web/components/settings/EnableTwoFactorModal.tsx
index ccef08a50892a8..bb3f4a3ba6bacd 100644
--- a/apps/web/components/settings/EnableTwoFactorModal.tsx
+++ b/apps/web/components/settings/EnableTwoFactorModal.tsx
@@ -283,7 +283,7 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
resetState();
onEnable();
}}>
- {t("finish")}
+ {t("close")}
>
From 67ae116f9bfcd58cb90d1013eedfe9d812d7a15e Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Fri, 4 Aug 2023 16:27:39 +0000
Subject: [PATCH 07/17] fix: 2fa test
---
apps/web/playwright/login.2fa.e2e.ts | 3 +++
1 file changed, 3 insertions(+)
diff --git a/apps/web/playwright/login.2fa.e2e.ts b/apps/web/playwright/login.2fa.e2e.ts
index 5aff1299499ca9..37db0737191dda 100644
--- a/apps/web/playwright/login.2fa.e2e.ts
+++ b/apps/web/playwright/login.2fa.e2e.ts
@@ -103,6 +103,9 @@ test.describe("2FA Tests", async () => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await fillOtp({ page, secret: secret! });
+ // close backup code dialog
+ await page.click('button[type="submit"]');
+
await expect(page.locator(`[data-testid=two-factor-switch][data-state="checked"]`)).toBeVisible();
return user;
From ebd4d002151f75fc8efc38f733ef5e480401bba9 Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Mon, 7 Aug 2023 21:21:59 +0000
Subject: [PATCH 08/17] fix: buildUser return type
---
packages/lib/test/builder.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/lib/test/builder.ts b/packages/lib/test/builder.ts
index 20962a69ffc15d..43c25e40776dae 100644
--- a/packages/lib/test/builder.ts
+++ b/packages/lib/test/builder.ts
@@ -189,6 +189,7 @@ export const buildUser =
>(user?: T): UserPayload
availability: [],
avatar: "",
away: false,
+ backupCodes: null,
bio: null,
brandColor: "#292929",
bufferTime: 0,
From f9f6c9817db88f8f74113585411dd657d30ef7fe Mon Sep 17 00:00:00 2001
From: nicktrn <55853254+nicktrn@users.noreply.github.com>
Date: Tue, 8 Aug 2023 08:35:42 +0000
Subject: [PATCH 09/17] fix: replace hardcoded strings
---
apps/web/components/settings/EnableTwoFactorModal.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/web/components/settings/EnableTwoFactorModal.tsx b/apps/web/components/settings/EnableTwoFactorModal.tsx
index bb3f4a3ba6bacd..4851b868d5d797 100644
--- a/apps/web/components/settings/EnableTwoFactorModal.tsx
+++ b/apps/web/components/settings/EnableTwoFactorModal.tsx
@@ -261,7 +261,7 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
<>
-
+