Skip to content

Commit aa4607e

Browse files
authored
fix(editor): Only prompt for MFA code when email is updated (#15065)
1 parent 1d4f639 commit aa4607e

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

cypress/e2e/27-two-factor-authentication.cy.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { MainSidebar } from './../pages/sidebar/main-sidebar';
44
import { INSTANCE_OWNER, INSTANCE_ADMIN, BACKEND_BASE_URL } from '../constants';
55
import { SigninPage } from '../pages';
66
import { MfaLoginPage } from '../pages/mfa-login';
7+
import { successToast } from '../pages/notifications';
78
import { PersonalSettingsPage } from '../pages/settings-personal';
89

910
const MFA_SECRET = 'KVKFKRCPNZQUYMLXOVYDSQKJKZDTSRLD';
@@ -81,6 +82,38 @@ describe('Two-factor authentication', { disableAutoLogin: true }, () => {
8182
mainSidebar.actions.signout();
8283
});
8384

85+
it('Should prompt for MFA code when email changes', () => {
86+
const { email, password } = user;
87+
signinPage.actions.loginWithEmailAndPassword(email, password);
88+
personalSettingsPage.actions.enableMfa();
89+
personalSettingsPage.actions.updateEmail('[email protected]');
90+
const mfaCode = generateOTPToken(user.mfaSecret);
91+
personalSettingsPage.getters.mfaCodeOrMfaRecoveryCodeInput().type(mfaCode);
92+
personalSettingsPage.getters.mfaSaveButton().click();
93+
successToast().should('exist');
94+
mainSidebar.actions.signout();
95+
});
96+
97+
it('Should prompt for MFA recovery code when email changes', () => {
98+
const { email, password } = user;
99+
signinPage.actions.loginWithEmailAndPassword(email, password);
100+
personalSettingsPage.actions.enableMfa();
101+
personalSettingsPage.actions.updateEmail('[email protected]');
102+
personalSettingsPage.getters.mfaCodeOrMfaRecoveryCodeInput().type(RECOVERY_CODE);
103+
personalSettingsPage.getters.mfaSaveButton().click();
104+
successToast().should('exist');
105+
mainSidebar.actions.signout();
106+
});
107+
108+
it('Should not prompt for MFA code or recovery code when first name or last name changes', () => {
109+
const { email, password } = user;
110+
signinPage.actions.loginWithEmailAndPassword(email, password);
111+
personalSettingsPage.actions.enableMfa();
112+
personalSettingsPage.actions.updateFirstAndLastName('newFirstName', 'newLastName');
113+
successToast().should('exist');
114+
mainSidebar.actions.signout();
115+
});
116+
84117
it('Should be able to disable MFA in account with recovery code', () => {
85118
const { email, password } = user;
86119
signinPage.actions.loginWithEmailAndPassword(email, password);

packages/frontend/editor-ui/src/views/SettingsPersonalView.vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,24 +151,25 @@ async function saveUserSettings(params: UserBasicDetailsWithMfa) {
151151
}
152152
153153
async function onSubmit(form: UserBasicDetailsForm) {
154-
if (!usersStore.currentUser?.mfaEnabled) {
155-
await saveUserSettings(form);
156-
return;
157-
}
154+
const emailChanged = usersStore.currentUser?.email !== form.email;
158155
159-
uiStore.openModal(PROMPT_MFA_CODE_MODAL_KEY);
156+
if (usersStore.currentUser?.mfaEnabled && emailChanged) {
157+
uiStore.openModal(PROMPT_MFA_CODE_MODAL_KEY);
160158
161-
promptMfaCodeBus.once('closed', async (payload: MfaModalEvents['closed']) => {
162-
if (!payload) {
163-
// User closed the modal without submitting the form
164-
return;
165-
}
159+
promptMfaCodeBus.once('closed', async (payload: MfaModalEvents['closed']) => {
160+
if (!payload) {
161+
// User closed the modal without submitting the form
162+
return;
163+
}
166164
167-
await saveUserSettings({
168-
...form,
169-
mfaCode: payload.mfaCode,
165+
await saveUserSettings({
166+
...form,
167+
mfaCode: payload.mfaCode,
168+
});
170169
});
171-
});
170+
} else {
171+
await saveUserSettings(form);
172+
}
172173
}
173174
174175
async function updateUserBasicInfo(userBasicInfo: UserBasicDetailsWithMfa) {

0 commit comments

Comments
 (0)