diff --git a/app/constants/localAuthentication.ts b/app/constants/localAuthentication.ts index 1312e57aa52..22c256f7e45 100644 --- a/app/constants/localAuthentication.ts +++ b/app/constants/localAuthentication.ts @@ -1,6 +1,9 @@ +export const AUTO_LOCK = 'kAutoLock'; +export const AUTO_LOCK_TIME = 'kAutoLockTime'; export const PASSCODE_KEY = 'kPasscode'; export const LOCKED_OUT_TIMER_KEY = 'kLockedOutTimer'; export const ATTEMPTS_KEY = 'kAttempts'; +export const UNLOCK_BIOMETRY = 'kUnlockBiometry'; export const LOCAL_AUTHENTICATE_EMITTER = 'LOCAL_AUTHENTICATE'; export const CHANGE_PASSCODE_EMITTER = 'CHANGE_PASSCODE'; diff --git a/app/lib/userPreferences.js b/app/lib/userPreferences.js index 3377856d630..ec487be2337 100644 --- a/app/lib/userPreferences.js +++ b/app/lib/userPreferences.js @@ -37,6 +37,19 @@ class UserPreferences { return this.mmkv.setBoolAsync(key, value); } + async getIntAsync(key) { + try { + const value = await this.mmkv.getIntAsync(key); + return value; + } catch { + return null; + } + } + + setIntAsync(key, value) { + return this.mmkv.setIntAsync(key, value); + } + async getMapAsync(key) { try { const value = await this.mmkv.getMapAsync(key); diff --git a/app/utils/localAuthentication.js b/app/utils/localAuthentication.js index 29f25685085..55c2a7a62f4 100644 --- a/app/utils/localAuthentication.js +++ b/app/utils/localAuthentication.js @@ -8,11 +8,14 @@ import UserPreferences from '../lib/userPreferences'; import store from '../lib/createStore'; import database from '../lib/database'; import { - ATTEMPTS_KEY, - CHANGE_PASSCODE_EMITTER, LOCAL_AUTHENTICATE_EMITTER, LOCKED_OUT_TIMER_KEY, - PASSCODE_KEY + ATTEMPTS_KEY, + PASSCODE_KEY, + CHANGE_PASSCODE_EMITTER, + UNLOCK_BIOMETRY, + AUTO_LOCK, + AUTO_LOCK_TIME } from '../constants/localAuthentication'; import I18n from '../i18n'; import { setLocalAuthenticated } from '../actions/login'; @@ -96,9 +99,28 @@ export const checkHasPasscode = async ({ force = true, serverRecord }) => { return Promise.resolve(); }; +export const saveStatusLocalAuthentication = async ({ autoLock, autoLockTime, biometry, server }) => { + await UserPreferences.setBoolAsync(`${AUTO_LOCK}${server}`, autoLock); + await UserPreferences.setIntAsync(`${AUTO_LOCK_TIME}${server}`, autoLockTime); + await UserPreferences.setBoolAsync(`${UNLOCK_BIOMETRY}${server}`, biometry); +}; + +export const getAutoLockAndTime = async server => { + const storedAutoLock = await UserPreferences.getBoolAsync(`${AUTO_LOCK}${server}`); + const storedAutoLockTime = await UserPreferences.getIntAsync(`${AUTO_LOCK_TIME}${server}`); + const storedBiometry = await UserPreferences.getBoolAsync(`${UNLOCK_BIOMETRY}${server}`); + + return { + storedAutoLock, + storedAutoLockTime, + storedBiometry + }; +}; + export const localAuthenticate = async server => { const serversDB = database.servers; const serversCollection = serversDB.get('servers'); + const { Force_Screen_Lock, Force_Screen_Lock_After } = store.getState().settings; let serverRecord; try { @@ -107,6 +129,25 @@ export const localAuthenticate = async server => { return Promise.reject(); } + if (serverRecord) { + const { storedAutoLock, storedAutoLockTime, storedBiometry } = await getAutoLockAndTime(server); + try { + await serversDB.action(async () => { + await serverRecord.update(record => { + if (serverRecord.autoLock !== storedAutoLock && !Force_Screen_Lock) { + record.autoLock = storedAutoLock; + } + if (!Force_Screen_Lock || Force_Screen_Lock_After === 0) { + record.autoLockTime = storedAutoLockTime; + } + record.biometry = storedBiometry; + }); + }); + } catch (error) { + return Promise.reject(); + } + } + // if screen lock is enabled if (serverRecord?.autoLock) { // Make sure splash screen has been hidden diff --git a/app/views/ScreenLockConfigView.tsx b/app/views/ScreenLockConfigView.tsx index 57638f4178b..ac36499fe6a 100644 --- a/app/views/ScreenLockConfigView.tsx +++ b/app/views/ScreenLockConfigView.tsx @@ -11,7 +11,12 @@ import { SWITCH_TRACK_COLOR, themes } from '../constants/colors'; import StatusBar from '../containers/StatusBar'; import * as List from '../containers/List'; import database from '../lib/database'; -import { changePasscode, checkHasPasscode, supportedBiometryLabel } from '../utils/localAuthentication'; +import { + supportedBiometryLabel, + changePasscode, + checkHasPasscode, + saveStatusLocalAuthentication +} from '../utils/localAuthentication'; import { DEFAULT_AUTO_LOCK } from '../constants/localAuthentication'; import SafeAreaView from '../containers/SafeAreaView'; import { events, logEvent } from '../utils/log'; @@ -127,7 +132,14 @@ class ScreenLockConfigView extends React.Component { logEvent(events.SLC_SAVE_SCREEN_LOCK); + const { server } = this.props; const { autoLock, autoLockTime, biometry } = this.state; + await saveStatusLocalAuthentication({ + autoLock, + autoLockTime, + biometry, + server + }); const serversDB = database.servers; await serversDB.write(async () => { await this.serverRecord?.update(record => {