From 2d33c8860354453511b6f7f4ebcdbfce7a453027 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 1 Jun 2022 19:35:33 +0400 Subject: [PATCH] Lock Screen: Allow switching to other clients, fix qiuick re-lock --- src/components/left/main/LeftMainHeader.tsx | 9 ++++++++- src/global/actions/api/initial.ts | 5 ++++- src/global/actions/ui/passcode.ts | 7 ++++++- src/global/init.ts | 3 +++ src/global/types.ts | 1 + src/util/sessions.ts | 1 + 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/components/left/main/LeftMainHeader.tsx b/src/components/left/main/LeftMainHeader.tsx index cc981c6e9..7be57556e 100644 --- a/src/components/left/main/LeftMainHeader.tsx +++ b/src/components/left/main/LeftMainHeader.tsx @@ -107,6 +107,7 @@ const LeftMainHeader: FC = ({ openChatByUsername, lockScreen, requestNextSettingsScreen, + skipLockOnUnload, } = getActions(); const lang = useLang(); @@ -221,7 +222,12 @@ const LeftMainHeader: FC = ({ const handleSwitchToWebK = useCallback(() => { setPermanentWebVersion('K'); clearWebsync(); - }, []); + skipLockOnUnload(); + }, [skipLockOnUnload]); + + const handleSwitchToLegacy = useCallback(() => { + skipLockOnUnload(); + }, [skipLockOnUnload]); const handleOpenTipsChat = useCallback(() => { openChatByUsername({ username: lang('Settings.TipsUsername') }); @@ -342,6 +348,7 @@ const LeftMainHeader: FC = ({ Switch to Old Version diff --git a/src/global/actions/api/initial.ts b/src/global/actions/api/initial.ts index 43d91a168..eac8a5266 100644 --- a/src/global/actions/api/initial.ts +++ b/src/global/actions/api/initial.ts @@ -119,8 +119,11 @@ addActionHandler('goToAuthQrCode', (global) => { }); addActionHandler('saveSession', (global, actions, payload) => { - const { sessionData } = payload; + if (global.passcode.isScreenLocked) { + return; + } + const { sessionData } = payload; if (sessionData) { storeSession(payload.sessionData, global.currentUserId); } else { diff --git a/src/global/actions/ui/passcode.ts b/src/global/actions/ui/passcode.ts index 2633e229d..d3ac59fdd 100644 --- a/src/global/actions/ui/passcode.ts +++ b/src/global/actions/ui/passcode.ts @@ -6,8 +6,9 @@ import { clearEncryptedSession, encryptSession, setupPasscode } from '../../../u import { forceUpdateCache, serializeGlobal } from '../../cache'; import { onBeforeUnload } from '../../../util/schedulers'; +let noLockOnUnload = false; onBeforeUnload(() => { - if (getGlobal().passcode.hasPasscode) { + if (getGlobal().passcode.hasPasscode && !noLockOnUnload) { clearStoredSession(); } }); @@ -80,3 +81,7 @@ addActionHandler('setPasscodeError', (global, actions, payload) => { addActionHandler('clearPasscodeError', (global) => { return updatePasscodeSettings(global, { error: undefined }); }); + +addActionHandler('skipLockOnUnload', () => { + noLockOnUnload = true; +}); diff --git a/src/global/init.ts b/src/global/init.ts index e9d2bc473..3d8967ed8 100644 --- a/src/global/init.ts +++ b/src/global/init.ts @@ -5,6 +5,7 @@ import { IS_MOCKED_CLIENT } from '../config'; import { initCache, loadCache } from './cache'; import { cloneDeep } from '../util/iteratees'; import { updatePasscodeSettings } from './reducers'; +import { clearStoredSession } from '../util/sessions'; initCache(); @@ -18,6 +19,8 @@ addActionHandler('init', () => { global = updatePasscodeSettings(global, { isScreenLocked: true, }); + + clearStoredSession(); } return global; diff --git a/src/global/types.ts b/src/global/types.ts index 4b2f9afc5..cec7191bd 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -886,6 +886,7 @@ export interface ActionPayloads { resetInvalidUnlockAttempts: never; setPasscodeError: { error: string }; clearPasscodeError: never; + skipLockOnUnload: never; // Settings requestNextSettingsScreen: SettingsScreens; diff --git a/src/util/sessions.ts b/src/util/sessions.ts index 30c066f4e..cff202e70 100644 --- a/src/util/sessions.ts +++ b/src/util/sessions.ts @@ -54,6 +54,7 @@ export function clearStoredSession() { 'dc', ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`), ...DC_IDS.map((dcId) => `dc${dcId}_hash`), + ...DC_IDS.map((dcId) => `dc${dcId}_server_salt`), ].forEach((key) => { localStorage.removeItem(key); });