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: