Save passcode with promise to prevent empty passcodes and immediately lock
This commit is contained in:
parent
3d65c592e8
commit
cf71acd753
|
@ -568,6 +568,7 @@ export default {
|
|||
Local_authentication_facial_recognition: 'facial recognition',
|
||||
Local_authentication_fingerprint: 'fingerprint',
|
||||
Local_authentication_unlock_with_label: 'Unlock with {{label}}',
|
||||
Local_authentication_auto_lock_0: 'Immediately',
|
||||
Local_authentication_auto_lock_60: 'After 1 minute',
|
||||
Local_authentication_auto_lock_300: 'After 5 minutes',
|
||||
Local_authentication_auto_lock_900: 'After 15 minutes',
|
||||
|
|
|
@ -508,6 +508,7 @@ export default {
|
|||
Local_authentication_facial_recognition: 'reconhecimento facial',
|
||||
Local_authentication_fingerprint: 'impressão digital',
|
||||
Local_authentication_unlock_with_label: 'Desbloquear com {{label}}',
|
||||
Local_authentication_auto_lock_0: 'Imediatamente',
|
||||
Local_authentication_auto_lock_60: 'Após 1 minuto',
|
||||
Local_authentication_auto_lock_300: 'Após 5 minutos',
|
||||
Local_authentication_auto_lock_900: 'Após 15 minutos',
|
||||
|
|
|
@ -1,23 +1,21 @@
|
|||
import React, { useEffect } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { SafeAreaView } from 'react-navigation';
|
||||
import RNUserDefaults from 'rn-user-defaults';
|
||||
import Orientation from 'react-native-orientation-locker';
|
||||
import { sha256 } from 'js-sha256';
|
||||
|
||||
import { themedHeader } from '../utils/navigation';
|
||||
import { withTheme } from '../theme';
|
||||
import { themes } from '../constants/colors';
|
||||
import sharedStyles from './Styles';
|
||||
import { PASSCODE_KEY } from '../constants/localAuthentication';
|
||||
import { isTablet } from '../utils/deviceInfo';
|
||||
import { TYPE } from '../containers/Passcode/constants';
|
||||
import { PasscodeChoose } from '../containers/Passcode';
|
||||
|
||||
const ScreenLockConfigView = React.memo(({ navigation, theme }) => {
|
||||
const savePasscode = async(passcode) => {
|
||||
await RNUserDefaults.set(PASSCODE_KEY, sha256(passcode));
|
||||
const ChangePasscodeView = React.memo(({ navigation, theme }) => {
|
||||
const getPasscode = (passcode) => {
|
||||
navigation.pop();
|
||||
const get = navigation.getParam('getPasscode', () => {});
|
||||
get(passcode);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -35,12 +33,12 @@ const ScreenLockConfigView = React.memo(({ navigation, theme }) => {
|
|||
<SafeAreaView
|
||||
style={[sharedStyles.container, { backgroundColor: themes[theme].auxiliaryBackground }]}
|
||||
>
|
||||
<PasscodeChoose theme={theme} type={TYPE.choose} finishProcess={savePasscode} />
|
||||
<PasscodeChoose theme={theme} type={TYPE.choose} finishProcess={getPasscode} />
|
||||
</SafeAreaView>
|
||||
);
|
||||
});
|
||||
|
||||
ScreenLockConfigView.navigationOptions = ({ screenProps, navigation }) => {
|
||||
ChangePasscodeView.navigationOptions = ({ screenProps, navigation }) => {
|
||||
const forceSetPasscode = navigation.getParam('forceSetPasscode', false);
|
||||
if (forceSetPasscode) {
|
||||
return {
|
||||
|
@ -54,9 +52,9 @@ ScreenLockConfigView.navigationOptions = ({ screenProps, navigation }) => {
|
|||
};
|
||||
};
|
||||
|
||||
ScreenLockConfigView.propTypes = {
|
||||
ChangePasscodeView.propTypes = {
|
||||
navigation: PropTypes.object,
|
||||
theme: PropTypes.string
|
||||
};
|
||||
|
||||
export default withTheme(ScreenLockConfigView);
|
||||
export default withTheme(ChangePasscodeView);
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
import { SafeAreaView } from 'react-navigation';
|
||||
import { connect } from 'react-redux';
|
||||
import RNUserDefaults from 'rn-user-defaults';
|
||||
import { sha256 } from 'js-sha256';
|
||||
|
||||
import I18n from '../i18n';
|
||||
import { themedHeader } from '../utils/navigation';
|
||||
|
@ -31,6 +32,9 @@ const styles = StyleSheet.create({
|
|||
}
|
||||
});
|
||||
|
||||
const DEFAULT_AUTO_LOCK = 1800;
|
||||
const DEFAULT_BIOMETRY = true;
|
||||
|
||||
class ScreenLockConfigView extends React.Component {
|
||||
static navigationOptions = ({ screenProps }) => ({
|
||||
title: I18n.t('Screen_lock'),
|
||||
|
@ -44,6 +48,10 @@ class ScreenLockConfigView extends React.Component {
|
|||
}
|
||||
|
||||
defaultAutoLockOptions = [
|
||||
{
|
||||
title: I18n.t('Local_authentication_auto_lock_0'),
|
||||
value: 0
|
||||
},
|
||||
{
|
||||
title: I18n.t('Local_authentication_auto_lock_60'),
|
||||
value: 60
|
||||
|
@ -85,8 +93,8 @@ class ScreenLockConfigView extends React.Component {
|
|||
this.serverRecord = await serversCollection.find(server);
|
||||
this.setState({
|
||||
autoLock: this.serverRecord?.autoLock,
|
||||
autoLockTime: this.serverRecord?.autoLockTime || 1800,
|
||||
biometry: this.serverRecord.biometry === null ? true : this.serverRecord.biometry
|
||||
autoLockTime: this.serverRecord?.autoLockTime === null ? DEFAULT_AUTO_LOCK : this.serverRecord?.autoLockTime,
|
||||
biometry: this.serverRecord.biometry === null ? DEFAULT_BIOMETRY : this.serverRecord.biometry
|
||||
});
|
||||
} catch (error) {
|
||||
// Do nothing
|
||||
|
@ -102,27 +110,36 @@ class ScreenLockConfigView extends React.Component {
|
|||
await serversDB.action(async() => {
|
||||
await this.serverRecord?.update((record) => {
|
||||
record.autoLock = autoLock;
|
||||
record.autoLockTime = autoLockTime;
|
||||
record.biometry = biometry === null ? true : biometry;
|
||||
record.autoLockTime = autoLockTime === null ? DEFAULT_AUTO_LOCK : autoLockTime;
|
||||
record.biometry = biometry === null ? DEFAULT_BIOMETRY : biometry;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
setPasscode = async() => {
|
||||
const { autoLock } = this.state;
|
||||
getPasscode = ({ force = false }) => new Promise((resolve) => {
|
||||
const { navigation } = this.props;
|
||||
if (autoLock) {
|
||||
const storedPasscode = await RNUserDefaults.get(PASSCODE_KEY);
|
||||
if (!storedPasscode) {
|
||||
navigation.navigate('ChangePasscodeView', { forceSetPasscode: true });
|
||||
}
|
||||
navigation.navigate('ChangePasscodeView', { forceSetPasscode: force, getPasscode: passcode => resolve(passcode) });
|
||||
});
|
||||
|
||||
changePasscode = async({ force }) => {
|
||||
const passcode = await this.getPasscode({ force });
|
||||
await RNUserDefaults.set(PASSCODE_KEY, sha256(passcode));
|
||||
}
|
||||
|
||||
checkHasPasscode = async() => {
|
||||
const storedPasscode = await RNUserDefaults.get(PASSCODE_KEY);
|
||||
if (!storedPasscode) {
|
||||
await this.changePasscode({ force: true });
|
||||
}
|
||||
}
|
||||
|
||||
toggleAutoLock = () => {
|
||||
this.setState(({ autoLock }) => ({ autoLock: !autoLock }), () => {
|
||||
this.setState(({ autoLock }) => ({ autoLock: !autoLock }), async() => {
|
||||
const { autoLock } = this.state;
|
||||
if (autoLock) {
|
||||
await this.checkHasPasscode();
|
||||
}
|
||||
this.save();
|
||||
this.setPasscode();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -139,11 +156,6 @@ class ScreenLockConfigView extends React.Component {
|
|||
this.setState({ autoLockTime }, () => this.save());
|
||||
}
|
||||
|
||||
changePasscode = () => {
|
||||
const { navigation } = this.props;
|
||||
navigation.navigate('ChangePasscodeView');
|
||||
}
|
||||
|
||||
renderSeparator = () => {
|
||||
const { theme } = this.props;
|
||||
return <Separator theme={theme} />;
|
||||
|
|
Loading…
Reference in New Issue