diff --git a/app/actions/TrezorActions.js b/app/actions/TrezorActions.js index 8e145da7d0..e1f8ea46ef 100644 --- a/app/actions/TrezorActions.js +++ b/app/actions/TrezorActions.js @@ -590,6 +590,7 @@ export const togglePassPhraseProtection = () => async (dispatch, getState) => { }); dispatch({ enablePassphraseProtection: enableProtection, + deviceLabel: features.label, type: TRZ_TOGGLEPASSPHRASEPROTECTION_SUCCESS }); } catch (error) { @@ -597,6 +598,40 @@ export const togglePassPhraseProtection = () => async (dispatch, getState) => { } }; +export const TRZ_TOGGLEPASSPHRASEONDEVICE_ATTEMPT = + "TRZ_TOGGLEPASSPHRASEONDEVICE_ATTEMPT"; +export const TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED = + "TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED"; +export const TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS = + "TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS"; + +export const togglePassphraseOnDevice = () => async (dispatch, getState) => { + dispatch({ type: TRZ_TOGGLEPASSPHRASEONDEVICE_ATTEMPT }); + + const features = await getFeatures(dispatch, getState).catch((error) => { + dispatch({ error, type: TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED }); + return; + }); + + const enableOnDevice = !features.passphrase_always_on_device; + + try { + await deviceRun(dispatch, getState, async () => { + const res = await session.applySettings({ + passphrase_always_on_device: enableOnDevice + }); + return res.payload; + }); + dispatch({ + enablePassphraseOnDevice: enableOnDevice, + deviceLabel: features.label, + type: TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS + }); + } catch (error) { + dispatch({ error, type: TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED }); + } +}; + export const TRZ_CHANGEHOMESCREEN_ATTEMPT = "TRZ_CHANGEHOMESCREEN_ATTEMPT"; export const TRZ_CHANGEHOMESCREEN_FAILED = "TRZ_CHANGEHOMESCREEN_FAILED"; export const TRZ_CHANGEHOMESCREEN_SUCCESS = "TRZ_CHANGEHOMESCREEN_SUCCESS"; diff --git a/app/components/views/TrezorPage/TrezorPageContent.jsx b/app/components/views/TrezorPage/TrezorPageContent.jsx index b3389e7df5..dc3cf29d77 100644 --- a/app/components/views/TrezorPage/TrezorPageContent.jsx +++ b/app/components/views/TrezorPage/TrezorPageContent.jsx @@ -32,6 +32,7 @@ const TrezorPageContent = () => { connect, togglePinProtection, togglePassPhraseProtection, + togglePassphraseOnDevice, changeToDecredHomeScreen, changeLabel, wipeDevice, @@ -49,6 +50,7 @@ const TrezorPageContent = () => { {...{ togglePinProtection, togglePassPhraseProtection, + togglePassphraseOnDevice, changeToDecredHomeScreen, performingOperation }} diff --git a/app/components/views/TrezorPage/TrezorPageSections/ConfigButtons.jsx b/app/components/views/TrezorPage/TrezorPageSections/ConfigButtons.jsx index d668067841..331bc45927 100644 --- a/app/components/views/TrezorPage/TrezorPageSections/ConfigButtons.jsx +++ b/app/components/views/TrezorPage/TrezorPageSections/ConfigButtons.jsx @@ -6,6 +6,7 @@ const ConfigButtons = ({ performingOperation, togglePinProtection, togglePassPhraseProtection, + togglePassphraseOnDevice, changeToDecredHomeScreen }) => ( + + + dispatch(trza.togglePassPhraseProtection()), [dispatch] ); + const togglePassphraseOnDevice = useCallback( + () => dispatch(trza.togglePassphraseOnDevice()), + [dispatch] + ); const changeToDecredHomeScreen = useCallback( () => dispatch(trza.changeToDecredHomeScreen()), [dispatch] @@ -50,6 +54,7 @@ export function useTrezorPage() { connect, togglePinProtection, togglePassPhraseProtection, + togglePassphraseOnDevice, changeToDecredHomeScreen, changeLabel, wipeDevice, diff --git a/app/i18n/translations/original.json b/app/i18n/translations/original.json index e52f6d98c0..53cb5e1188 100644 --- a/app/i18n/translations/original.json +++ b/app/i18n/translations/original.json @@ -1153,6 +1153,8 @@ "trezor.passphraseModal.title": "Enter Trezor Passphrase", "trezor.passphraseProtectionSuccess.disabled": "Passphrase protection has been disabled in Trezor {label}", "trezor.passphraseProtectionSuccess.enabled": "Passphrase protection has been enabled in Trezor {label}", + "trezor.passphraseOnDeviceSuccess.disabled": "Passphrase on device has been disabled in Trezor {label}", + "trezor.passphraseOnDeviceSuccess.enabled": "Passphrase on device has been enabled in Trezor {label}", "trezor.pinModal.clear": "clear", "trezor.pinModal.description": "Click button sequence that corresponds to your pin on Trezor {label}", "trezor.pinModal.title": "Enter Pin", @@ -1185,6 +1187,7 @@ "trezorPage.recoverDeviceBtn": "Recover Device", "trezorPage.title": "Trezor", "trezorPage.togglePassPhraseProtectionBtn": "Toggle Passphrase Protection", + "trezorPage.togglePassphraseOnDeviceBtn": "Toggle Passphrase on Device", "trezorPage.togglePinProtectionBtn": "Toggle Pin Protection", "trezorPage.updateFirmwareBtn": "Update Firmware", "trezorPage.updateFirmwarePah": "Path to firmware file", diff --git a/app/reducers/snackbar.js b/app/reducers/snackbar.js index acf2ab43ef..b5efd44b88 100644 --- a/app/reducers/snackbar.js +++ b/app/reducers/snackbar.js @@ -93,6 +93,8 @@ import { TRZ_TOGGLEPINPROTECTION_FAILED, TRZ_TOGGLEPASSPHRASEPROTECTION_SUCCESS, TRZ_TOGGLEPASSPHRASEPROTECTION_FAILED, + TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS, + TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED, TRZ_CHANGEHOMESCREEN_SUCCESS, TRZ_CHANGEHOMESCREEN_FAILED, TRZ_CHANGELABEL_SUCCESS, @@ -380,6 +382,14 @@ const messages = defineMessages({ id: "trezor.passphraseProtectionSuccess.disabled", defaultMessage: "Passphrase protection has been disabled in Trezor {label}" }, + TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS_ENABLED: { + id: "trezor.passphraseOnDevice.enabled", + defaultMessage: "Passphrase on device has been enabled in Trezor {label}" + }, + TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS_DISABLED: { + id: "trezor.passphraseOnDevice.disabled", + defaultMessage: "Passphrase on device has been disabled in Trezor {label}" + }, TRZ_CHANGEHOMESCREEN_SUCCESS: { id: "trezor.changeHomeScreen.success", defaultMessage: "Trezor home screen successfully changed" @@ -724,6 +734,7 @@ export default function snackbar(state = {}, action) { case TRZ_INITDEVICE_SUCCESS: case TRZ_UPDATEFIRMWARE_SUCCESS: case TRZ_TOGGLEPASSPHRASEPROTECTION_SUCCESS: + case TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS: case TRZ_CHANGELABEL_SUCCESS: case TRZ_TOGGLEPINPROTECTION_SUCCESS: case TRZ_BACKUPDEVICE_SUCCESS: @@ -783,6 +794,14 @@ export default function snackbar(state = {}, action) { ]; values = { label: action.deviceLabel }; break; + case TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS: + message = + messages[ + "TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS_" + + (action.enablePassphraseOnDevice ? "ENABLED" : "DISABLED") + ]; + values = { label: action.deviceLabel }; + break; case TRZ_CHANGELABEL_SUCCESS: values = { label: action.deviceLabel }; break; @@ -831,6 +850,7 @@ export default function snackbar(state = {}, action) { case STARTTICKETBUYERV2_FAILED: case TRZ_TOGGLEPINPROTECTION_FAILED: case TRZ_TOGGLEPASSPHRASEPROTECTION_FAILED: + case TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED: case TRZ_CHANGEHOMESCREEN_FAILED: case TRZ_CHANGELABEL_FAILED: case TRZ_WIPEDEVICE_FAILED: diff --git a/app/reducers/trezor.js b/app/reducers/trezor.js index 8a9e0a0b87..2b4bc5f728 100644 --- a/app/reducers/trezor.js +++ b/app/reducers/trezor.js @@ -30,6 +30,9 @@ import { TRZ_TOGGLEPASSPHRASEPROTECTION_FAILED, TRZ_TOGGLEPASSPHRASEPROTECTION_SUCCESS, TRZ_TOGGLEPASSPHRASEPROTECTION_CONFIRMED, + TRZ_TOGGLEPASSPHRASEONDEVICE_ATTEMPT, + TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED, + TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS, TRZ_CHANGEHOMESCREEN_ATTEMPT, TRZ_CHANGEHOMESCREEN_FAILED, TRZ_CHANGEHOMESCREEN_SUCCESS, @@ -187,6 +190,7 @@ export default function trezor(state = {}, action) { case TRZ_TOGGLEPINPROTECTION_ATTEMPT: case TRZ_BACKUPDEVICE_ATTEMPT: case TRZ_TOGGLEPASSPHRASEPROTECTION_ATTEMPT: + case TRZ_TOGGLEPASSPHRASEONDEVICE_ATTEMPT: case TRZ_CHANGEHOMESCREEN_ATTEMPT: case TRZ_CHANGELABEL_ATTEMPT: case TRZ_WIPEDEVICE_ATTEMPT: @@ -209,6 +213,7 @@ export default function trezor(state = {}, action) { return { ...state, enablePassphraseProtection: action.enablePassphraseProtection, + deviceLabel: action.deviceLabel, confirmingTogglePassphrase: true }; case TRZ_TOGGLEPASSPHRASEPROTECTION_CONFIRMED: @@ -217,11 +222,19 @@ export default function trezor(state = {}, action) { performingOperation: false, confirmingTogglePassphrase: false }; + case TRZ_TOGGLEPASSPHRASEONDEVICE_SUCCESS: + return { + ...state, + enablePassphraseOnDevice: action.enablePassphraseOnDevice, + performingOperation: false, + deviceLabel: action.deviceLabel + }; case SIGNTX_FAILED: case SIGNTX_SUCCESS: case TRZ_TOGGLEPINPROTECTION_FAILED: case TRZ_TOGGLEPINPROTECTION_SUCCESS: case TRZ_TOGGLEPASSPHRASEPROTECTION_FAILED: + case TRZ_TOGGLEPASSPHRASEONDEVICE_FAILED: case TRZ_CHANGEHOMESCREEN_FAILED: case TRZ_CHANGEHOMESCREEN_SUCCESS: case TRZ_CHANGELABEL_FAILED: