1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-22 22:38:08 +00:00

chore(core): adapt wipe pin flow

This commit is contained in:
Lukas Bielesch 2024-12-02 14:56:54 +01:00
parent 677d62bed8
commit 3d7720e660
22 changed files with 292 additions and 81 deletions

View File

@ -0,0 +1 @@
[T3T1] Improve wipe code flow.

View File

@ -172,6 +172,7 @@ static void _librust_qstrs(void) {
MP_QSTR_can_go_back; MP_QSTR_can_go_back;
MP_QSTR_cancel; MP_QSTR_cancel;
MP_QSTR_cancel_text; MP_QSTR_cancel_text;
MP_QSTR_cancel_title;
MP_QSTR_case_sensitive; MP_QSTR_case_sensitive;
MP_QSTR_check_homescreen_format; MP_QSTR_check_homescreen_format;
MP_QSTR_chunkify; MP_QSTR_chunkify;
@ -243,6 +244,7 @@ static void _librust_qstrs(void) {
MP_QSTR_firmware_update__title_fingerprint; MP_QSTR_firmware_update__title_fingerprint;
MP_QSTR_flow_confirm_output; MP_QSTR_flow_confirm_output;
MP_QSTR_flow_confirm_set_new_pin; MP_QSTR_flow_confirm_set_new_pin;
MP_QSTR_flow_confirm_set_new_wipe_code;
MP_QSTR_flow_get_address; MP_QSTR_flow_get_address;
MP_QSTR_get_language; MP_QSTR_get_language;
MP_QSTR_get_transition_out; MP_QSTR_get_transition_out;

View File

@ -741,7 +741,7 @@ pub enum TranslatedString {
pin__enter = 453, // "Enter PIN" pin__enter = 453, // "Enter PIN"
pin__enter_new = 454, // "Enter new PIN" pin__enter_new = 454, // "Enter new PIN"
pin__entered_not_valid = 455, // "The PIN you have entered is not valid." pin__entered_not_valid = 455, // "The PIN you have entered is not valid."
pin__info = 456, // "PIN will be required to access this device." pin__info = 456, // "The PIN will be required to access this device."
pin__invalid_pin = 457, // "Invalid PIN" pin__invalid_pin = 457, // "Invalid PIN"
pin__last_attempt = 458, // "Last attempt" pin__last_attempt = 458, // "Last attempt"
pin__mismatch = 459, // "Entered PINs do not match!" pin__mismatch = 459, // "Entered PINs do not match!"
@ -751,7 +751,7 @@ pub enum TranslatedString {
pin__reenter_to_confirm = 463, // "Please re-enter PIN to confirm." pin__reenter_to_confirm = 463, // "Please re-enter PIN to confirm."
pin__should_be_long = 464, // "PIN should be 4-50 digits long." pin__should_be_long = 464, // "PIN should be 4-50 digits long."
pin__title_check_pin = 465, // "Check PIN" pin__title_check_pin = 465, // "Check PIN"
pin__title_settings = 466, // "PIN settings" pin__title_settings = 466, // "PIN"
pin__title_wrong_pin = 467, // "Wrong PIN" pin__title_wrong_pin = 467, // "Wrong PIN"
pin__tries_left = 468, // "tries left" pin__tries_left = 468, // "tries left"
pin__turn_off = 469, // "Are you sure you want to turn off PIN protection?" pin__turn_off = 469, // "Are you sure you want to turn off PIN protection?"
@ -1161,8 +1161,8 @@ pub enum TranslatedString {
wipe_code__change = 774, // "Change wipe code?" wipe_code__change = 774, // "Change wipe code?"
wipe_code__changed = 775, // "Wipe code changed." wipe_code__changed = 775, // "Wipe code changed."
wipe_code__diff_from_pin = 776, // "The wipe code must be different from your PIN." wipe_code__diff_from_pin = 776, // "The wipe code must be different from your PIN."
wipe_code__disabled = 777, // "Wipe code disabled." wipe_code__disabled = 777, // "Wipe code protection turned off."
wipe_code__enabled = 778, // "Wipe code enabled." wipe_code__enabled = 778, // "Wipe code protection turned on."
wipe_code__enter_new = 779, // "Enter new wipe code" wipe_code__enter_new = 779, // "Enter new wipe code"
wipe_code__info = 780, // "Wipe code can be used to erase all data from this device." wipe_code__info = 780, // "Wipe code can be used to erase all data from this device."
wipe_code__invalid = 781, // "Invalid wipe code" wipe_code__invalid = 781, // "Invalid wipe code"
@ -1171,7 +1171,7 @@ pub enum TranslatedString {
wipe_code__reenter_to_confirm = 784, // "Please re-enter wipe code to confirm." wipe_code__reenter_to_confirm = 784, // "Please re-enter wipe code to confirm."
wipe_code__title_check = 785, // "Check wipe code" wipe_code__title_check = 785, // "Check wipe code"
wipe_code__title_invalid = 786, // "Invalid wipe code" wipe_code__title_invalid = 786, // "Invalid wipe code"
wipe_code__title_settings = 787, // "Wipe code settings" wipe_code__title_settings = 787, // "Wipe code"
wipe_code__turn_off = 788, // "Turn off wipe code protection?" wipe_code__turn_off = 788, // "Turn off wipe code protection?"
wipe_code__turn_on = 789, // "Turn on wipe code protection?" wipe_code__turn_on = 789, // "Turn on wipe code protection?"
wipe_code__wipe_code_mismatch = 790, // "Wipe code mismatch" wipe_code__wipe_code_mismatch = 790, // "Wipe code mismatch"
@ -2117,7 +2117,7 @@ impl TranslatedString {
Self::pin__enter => "Enter PIN", Self::pin__enter => "Enter PIN",
Self::pin__enter_new => "Enter new PIN", Self::pin__enter_new => "Enter new PIN",
Self::pin__entered_not_valid => "The PIN you have entered is not valid.", Self::pin__entered_not_valid => "The PIN you have entered is not valid.",
Self::pin__info => "PIN will be required to access this device.", Self::pin__info => "The PIN will be required to access this device.",
Self::pin__invalid_pin => "Invalid PIN", Self::pin__invalid_pin => "Invalid PIN",
Self::pin__last_attempt => "Last attempt", Self::pin__last_attempt => "Last attempt",
Self::pin__mismatch => "Entered PINs do not match!", Self::pin__mismatch => "Entered PINs do not match!",
@ -2127,7 +2127,7 @@ impl TranslatedString {
Self::pin__reenter_to_confirm => "Please re-enter PIN to confirm.", Self::pin__reenter_to_confirm => "Please re-enter PIN to confirm.",
Self::pin__should_be_long => "PIN should be 4-50 digits long.", Self::pin__should_be_long => "PIN should be 4-50 digits long.",
Self::pin__title_check_pin => "Check PIN", Self::pin__title_check_pin => "Check PIN",
Self::pin__title_settings => "PIN settings", Self::pin__title_settings => "PIN",
Self::pin__title_wrong_pin => "Wrong PIN", Self::pin__title_wrong_pin => "Wrong PIN",
Self::pin__tries_left => "tries left", Self::pin__tries_left => "tries left",
Self::pin__turn_off => "Are you sure you want to turn off PIN protection?", Self::pin__turn_off => "Are you sure you want to turn off PIN protection?",
@ -2537,8 +2537,8 @@ impl TranslatedString {
Self::wipe_code__change => "Change wipe code?", Self::wipe_code__change => "Change wipe code?",
Self::wipe_code__changed => "Wipe code changed.", Self::wipe_code__changed => "Wipe code changed.",
Self::wipe_code__diff_from_pin => "The wipe code must be different from your PIN.", Self::wipe_code__diff_from_pin => "The wipe code must be different from your PIN.",
Self::wipe_code__disabled => "Wipe code disabled.", Self::wipe_code__disabled => "Wipe code protection turned off.",
Self::wipe_code__enabled => "Wipe code enabled.", Self::wipe_code__enabled => "Wipe code protection turned on.",
Self::wipe_code__enter_new => "Enter new wipe code", Self::wipe_code__enter_new => "Enter new wipe code",
Self::wipe_code__info => "Wipe code can be used to erase all data from this device.", Self::wipe_code__info => "Wipe code can be used to erase all data from this device.",
Self::wipe_code__invalid => "Invalid wipe code", Self::wipe_code__invalid => "Invalid wipe code",
@ -2547,7 +2547,7 @@ impl TranslatedString {
Self::wipe_code__reenter_to_confirm => "Please re-enter wipe code to confirm.", Self::wipe_code__reenter_to_confirm => "Please re-enter wipe code to confirm.",
Self::wipe_code__title_check => "Check wipe code", Self::wipe_code__title_check => "Check wipe code",
Self::wipe_code__title_invalid => "Invalid wipe code", Self::wipe_code__title_invalid => "Invalid wipe code",
Self::wipe_code__title_settings => "Wipe code settings", Self::wipe_code__title_settings => "Wipe code",
Self::wipe_code__turn_off => "Turn off wipe code protection?", Self::wipe_code__turn_off => "Turn off wipe code protection?",
Self::wipe_code__turn_on => "Turn on wipe code protection?", Self::wipe_code__turn_on => "Turn on wipe code protection?",
Self::wipe_code__wipe_code_mismatch => "Wipe code mismatch", Self::wipe_code__wipe_code_mismatch => "Wipe code mismatch",

View File

@ -532,8 +532,25 @@ extern "C" fn new_flow_confirm_set_new_pin(
let block = move |_args: &[Obj], kwargs: &Map| { let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let description: TString = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; let description: TString = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?;
let cancel_title: TString = kwargs.get(Qstr::MP_QSTR_cancel_title)?.try_into()?;
let layout = ModelUI::flow_confirm_set_new_pin(title, description)?; let layout = ModelUI::flow_confirm_set_new_pin(title, description, cancel_title)?;
Ok(LayoutObj::new_root(layout)?.into())
};
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
}
extern "C" fn new_flow_confirm_set_new_wipe_code(
n_args: usize,
args: *const Obj,
kwargs: *mut Map,
) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
let description: TString = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?;
let cancel_title: TString = kwargs.get(Qstr::MP_QSTR_cancel_title)?.try_into()?;
let layout = ModelUI::flow_confirm_set_new_wipe_code(title, description, cancel_title)?;
Ok(LayoutObj::new_root(layout)?.into()) Ok(LayoutObj::new_root(layout)?.into())
}; };
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
@ -1378,16 +1395,24 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// """Confirm the recipient, (optionally) confirm the amount and (optionally) confirm the summary and present a Hold to Sign page.""" /// """Confirm the recipient, (optionally) confirm the amount and (optionally) confirm the summary and present a Hold to Sign page."""
Qstr::MP_QSTR_flow_confirm_output => obj_fn_kw!(0, new_flow_confirm_output).as_obj(), Qstr::MP_QSTR_flow_confirm_output => obj_fn_kw!(0, new_flow_confirm_output).as_obj(),
// TODO: supply more arguments for Wipe code setting (mercury)
///
/// def flow_confirm_set_new_pin( /// def flow_confirm_set_new_pin(
/// *, /// *,
/// title: str, /// title: str,
/// description: str, /// description: str,
/// cancel_title: str,
/// ) -> LayoutObj[UiResult]: /// ) -> LayoutObj[UiResult]:
/// """Confirm new PIN setup with an option to cancel action.""" /// """Confirm new PIN setup with an option to cancel action."""
Qstr::MP_QSTR_flow_confirm_set_new_pin => obj_fn_kw!(0, new_flow_confirm_set_new_pin).as_obj(), Qstr::MP_QSTR_flow_confirm_set_new_pin => obj_fn_kw!(0, new_flow_confirm_set_new_pin).as_obj(),
/// def flow_confirm_set_new_wipe_code(
/// *,
/// title: str,
/// description: str,
/// cancel_title: str,
/// ) -> LayoutObj[UiResult]:
/// """Confirm new wipe code setup with an option to cancel action."""
Qstr::MP_QSTR_flow_confirm_set_new_wipe_code => obj_fn_kw!(0, new_flow_confirm_set_new_wipe_code).as_obj(),
/// def flow_get_address( /// def flow_get_address(
/// *, /// *,
/// address: str | bytes, /// address: str | bytes,

View File

@ -65,13 +65,14 @@ impl FlowController for SetNewPin {
pub fn new_set_new_pin( pub fn new_set_new_pin(
title: TString<'static>, title: TString<'static>,
description: TString<'static>, description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<SwipeFlow, error::Error> { ) -> Result<SwipeFlow, error::Error> {
// TODO: supply more arguments for Wipe code setting when figma done
let paragraphs = Paragraphs::new(Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, description)); let paragraphs = Paragraphs::new(Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, description));
let content_intro = Frame::left_aligned(title, SwipeContent::new(paragraphs)) let content_intro = Frame::left_aligned(title, SwipeContent::new(paragraphs))
.with_menu_button() .with_menu_button()
.with_footer(TR::instructions__swipe_up.into(), None) .with_footer(TR::instructions__swipe_up.into(), None)
.with_swipe(Direction::Up, SwipeSettings::default()) .with_swipe(Direction::Up, SwipeSettings::default())
.with_subtitle(TR::words__settings.into())
.with_swipe(Direction::Left, SwipeSettings::default()) .with_swipe(Direction::Left, SwipeSettings::default())
.map(|msg| match msg { .map(|msg| match msg {
FrameMsg::Button(bm) => Some(bm), FrameMsg::Button(bm) => Some(bm),
@ -80,7 +81,7 @@ pub fn new_set_new_pin(
let content_menu = Frame::left_aligned( let content_menu = Frame::left_aligned(
"".into(), "".into(),
VerticalMenu::empty().danger(theme::ICON_CANCEL, TR::pin__cancel_setup.into()), VerticalMenu::empty().danger(theme::ICON_CANCEL, cancel_title),
) )
.with_cancel_button() .with_cancel_button()
.with_swipe(Direction::Right, SwipeSettings::immediate()) .with_swipe(Direction::Right, SwipeSettings::immediate())
@ -95,24 +96,22 @@ pub fn new_set_new_pin(
Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, TR::pin__cancel_info), Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, TR::pin__cancel_info),
]) ])
.into_paragraphs(); .into_paragraphs();
let content_cancel_intro = Frame::left_aligned( let content_cancel_intro =
TR::pin__cancel_setup.into(), Frame::left_aligned(cancel_title, SwipeContent::new(paragraphs_cancel_intro))
SwipeContent::new(paragraphs_cancel_intro), .with_cancel_button()
) .with_footer(
.with_cancel_button() TR::instructions__swipe_up.into(),
.with_footer( Some(TR::pin__cancel_description.into()),
TR::instructions__swipe_up.into(), )
Some(TR::pin__cancel_description.into()), .with_swipe(Direction::Up, SwipeSettings::default())
) .with_swipe(Direction::Right, SwipeSettings::immediate())
.with_swipe(Direction::Up, SwipeSettings::default()) .map(|msg| match msg {
.with_swipe(Direction::Right, SwipeSettings::immediate()) FrameMsg::Button(bm) => Some(bm),
.map(|msg| match msg { _ => None,
FrameMsg::Button(bm) => Some(bm), });
_ => None,
});
let content_cancel_confirm = Frame::left_aligned( let content_cancel_confirm = Frame::left_aligned(
TR::pin__cancel_setup.into(), cancel_title,
SwipeContent::new(PromptScreen::new_tap_to_cancel()), SwipeContent::new(PromptScreen::new_tap_to_cancel()),
) )
.with_cancel_button() .with_cancel_button()

View File

@ -0,0 +1,89 @@
use crate::{
error,
strutil::TString,
translations::TR,
ui::{
component::{
swipe_detect::SwipeSettings,
text::paragraphs::{Paragraph, Paragraphs},
ComponentExt,
},
flow::{
base::{Decision, DecisionBuilder as _},
FlowController, FlowMsg, SwipeFlow,
},
geometry::Direction,
model_mercury::component::SwipeContent,
},
};
use super::super::{
component::{Frame, FrameMsg, VerticalMenu, VerticalMenuChoiceMsg},
theme,
};
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum SetNewWipeCode {
Intro,
Menu,
}
impl FlowController for SetNewWipeCode {
#[inline]
fn index(&'static self) -> usize {
*self as usize
}
fn handle_swipe(&'static self, direction: Direction) -> Decision {
match (self, direction) {
(Self::Intro, Direction::Left) => Self::Menu.swipe(direction),
(Self::Intro, Direction::Up) => self.return_msg(FlowMsg::Confirmed),
(Self::Menu, Direction::Right) => Self::Intro.swipe(direction),
_ => self.do_nothing(),
}
}
fn handle_event(&'static self, msg: FlowMsg) -> Decision {
match (self, msg) {
(Self::Intro, FlowMsg::Info) => Self::Menu.goto(),
(Self::Menu, FlowMsg::Choice(0)) => self.return_msg(FlowMsg::Cancelled),
(Self::Menu, FlowMsg::Cancelled) => self.return_msg(FlowMsg::Cancelled),
_ => self.do_nothing(),
}
}
}
pub fn new_set_new_wipe_code(
title: TString<'static>,
description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<SwipeFlow, error::Error> {
let paragraphs = Paragraphs::new(Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, description));
let content_intro = Frame::left_aligned(title, SwipeContent::new(paragraphs))
.with_menu_button()
.with_footer(TR::instructions__swipe_up.into(), None)
.with_swipe(Direction::Up, SwipeSettings::default())
.with_subtitle(TR::words__settings.into())
.with_swipe(Direction::Left, SwipeSettings::default())
.map(|msg| match msg {
FrameMsg::Button(bm) => Some(bm),
_ => None,
});
let content_menu = Frame::left_aligned(
"".into(),
VerticalMenu::empty().danger(theme::ICON_CANCEL, cancel_title),
)
.with_cancel_button()
.with_swipe(Direction::Right, SwipeSettings::immediate())
.map(|msg| match msg {
FrameMsg::Content(VerticalMenuChoiceMsg::Selected(i)) => Some(FlowMsg::Choice(i)),
FrameMsg::Button(FlowMsg::Cancelled) => Some(FlowMsg::Cancelled),
FrameMsg::Button(_) => None,
});
let res = SwipeFlow::new(&SetNewWipeCode::Intro)?
.with_page(&SetNewWipeCode::Intro, content_intro)?
.with_page(&SetNewWipeCode::Menu, content_menu)?;
Ok(res)
}

View File

@ -6,6 +6,7 @@ pub mod confirm_homescreen;
pub mod confirm_output; pub mod confirm_output;
pub mod confirm_reset; pub mod confirm_reset;
pub mod confirm_set_new_pin; pub mod confirm_set_new_pin;
pub mod confirm_set_new_wipe_code;
pub mod confirm_summary; pub mod confirm_summary;
pub mod continue_recovery_homepage; pub mod continue_recovery_homepage;
pub mod get_address; pub mod get_address;
@ -29,6 +30,7 @@ pub use confirm_homescreen::new_confirm_homescreen;
pub use confirm_output::new_confirm_output; pub use confirm_output::new_confirm_output;
pub use confirm_reset::new_confirm_reset; pub use confirm_reset::new_confirm_reset;
pub use confirm_set_new_pin::SetNewPin; pub use confirm_set_new_pin::SetNewPin;
pub use confirm_set_new_wipe_code::SetNewWipeCode;
pub use confirm_summary::new_confirm_summary; pub use confirm_summary::new_confirm_summary;
pub use continue_recovery_homepage::new_continue_recovery_homepage; pub use continue_recovery_homepage::new_continue_recovery_homepage;
pub use get_address::GetAddress; pub use get_address::GetAddress;

View File

@ -631,8 +631,22 @@ impl FirmwareUI for UIMercury {
fn flow_confirm_set_new_pin( fn flow_confirm_set_new_pin(
title: TString<'static>, title: TString<'static>,
description: TString<'static>, description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> { ) -> Result<impl LayoutMaybeTrace, Error> {
let flow = flow::confirm_set_new_pin::new_set_new_pin(title, description)?; let flow = flow::confirm_set_new_pin::new_set_new_pin(title, description, cancel_title)?;
Ok(flow)
}
fn flow_confirm_set_new_wipe_code(
title: TString<'static>,
description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> {
let flow = flow::confirm_set_new_wipe_code::new_set_new_wipe_code(
title,
description,
cancel_title,
)?;
Ok(flow) Ok(flow)
} }

View File

@ -724,12 +724,23 @@ impl FirmwareUI for UIModelTR {
fn flow_confirm_set_new_pin( fn flow_confirm_set_new_pin(
_title: TString<'static>, _title: TString<'static>,
_description: TString<'static>, _description: TString<'static>,
_cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> { ) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError( Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError(
c"flow_confirm_set_new_pin not supported", c"flow_confirm_set_new_pin not supported",
)) ))
} }
fn flow_confirm_set_new_wipe_code(
_title: TString<'static>,
_description: TString<'static>,
_cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError(
c"flow_confirm_set_new_wipe_code not supported",
))
}
fn flow_get_address( fn flow_get_address(
_address: Obj, _address: Obj,
_title: TString<'static>, _title: TString<'static>,

View File

@ -575,12 +575,23 @@ impl FirmwareUI for UIModelTT {
fn flow_confirm_set_new_pin( fn flow_confirm_set_new_pin(
_title: TString<'static>, _title: TString<'static>,
_description: TString<'static>, _description: TString<'static>,
_cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> { ) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError( Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError(
c"flow_confirm_set_new_pin not supported", c"flow_confirm_set_new_pin not supported",
)) ))
} }
fn flow_confirm_set_new_wipe_code(
_title: TString<'static>,
_description: TString<'static>,
_cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::ValueError(
c"flow_confirm_set_new_wipe_code not supported",
))
}
fn flow_get_address( fn flow_get_address(
_address: Obj, _address: Obj,
_title: TString<'static>, _title: TString<'static>,

View File

@ -197,6 +197,13 @@ pub trait FirmwareUI {
fn flow_confirm_set_new_pin( fn flow_confirm_set_new_pin(
title: TString<'static>, title: TString<'static>,
description: TString<'static>, description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error>;
fn flow_confirm_set_new_wipe_code(
title: TString<'static>,
description: TString<'static>,
cancel_title: TString<'static>,
) -> Result<impl LayoutMaybeTrace, Error>; ) -> Result<impl LayoutMaybeTrace, Error>;
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]

View File

@ -340,10 +340,21 @@ def flow_confirm_set_new_pin(
*, *,
title: str, title: str,
description: str, description: str,
cancel_title: str,
) -> LayoutObj[UiResult]: ) -> LayoutObj[UiResult]:
"""Confirm new PIN setup with an option to cancel action.""" """Confirm new PIN setup with an option to cancel action."""
# rust/src/ui/api/firmware_micropython.rs
def flow_confirm_set_new_wipe_code(
*,
title: str,
description: str,
cancel_title: str,
) -> LayoutObj[UiResult]:
"""Confirm new wipe code setup with an option to cancel action."""
# rust/src/ui/api/firmware_micropython.rs # rust/src/ui/api/firmware_micropython.rs
def flow_get_address( def flow_get_address(
*, *,

View File

@ -526,7 +526,7 @@ class TR:
pin__enter: str = "Enter PIN" pin__enter: str = "Enter PIN"
pin__enter_new: str = "Enter new PIN" pin__enter_new: str = "Enter new PIN"
pin__entered_not_valid: str = "The PIN you have entered is not valid." pin__entered_not_valid: str = "The PIN you have entered is not valid."
pin__info: str = "PIN will be required to access this device." pin__info: str = "The PIN will be required to access this device."
pin__invalid_pin: str = "Invalid PIN" pin__invalid_pin: str = "Invalid PIN"
pin__last_attempt: str = "Last attempt" pin__last_attempt: str = "Last attempt"
pin__mismatch: str = "Entered PINs do not match!" pin__mismatch: str = "Entered PINs do not match!"
@ -536,7 +536,7 @@ class TR:
pin__reenter_to_confirm: str = "Please re-enter PIN to confirm." pin__reenter_to_confirm: str = "Please re-enter PIN to confirm."
pin__should_be_long: str = "PIN should be 4-50 digits long." pin__should_be_long: str = "PIN should be 4-50 digits long."
pin__title_check_pin: str = "Check PIN" pin__title_check_pin: str = "Check PIN"
pin__title_settings: str = "PIN settings" pin__title_settings: str = "PIN"
pin__title_wrong_pin: str = "Wrong PIN" pin__title_wrong_pin: str = "Wrong PIN"
pin__tries_left: str = "tries left" pin__tries_left: str = "tries left"
pin__turn_off: str = "Are you sure you want to turn off PIN protection?" pin__turn_off: str = "Are you sure you want to turn off PIN protection?"
@ -902,8 +902,8 @@ class TR:
wipe_code__change: str = "Change wipe code?" wipe_code__change: str = "Change wipe code?"
wipe_code__changed: str = "Wipe code changed." wipe_code__changed: str = "Wipe code changed."
wipe_code__diff_from_pin: str = "The wipe code must be different from your PIN." wipe_code__diff_from_pin: str = "The wipe code must be different from your PIN."
wipe_code__disabled: str = "Wipe code disabled." wipe_code__disabled: str = "Wipe code protection turned off."
wipe_code__enabled: str = "Wipe code enabled." wipe_code__enabled: str = "Wipe code protection turned on."
wipe_code__enter_new: str = "Enter new wipe code" wipe_code__enter_new: str = "Enter new wipe code"
wipe_code__info: str = "Wipe code can be used to erase all data from this device." wipe_code__info: str = "Wipe code can be used to erase all data from this device."
wipe_code__invalid: str = "Invalid wipe code" wipe_code__invalid: str = "Invalid wipe code"
@ -912,7 +912,7 @@ class TR:
wipe_code__reenter_to_confirm: str = "Please re-enter wipe code to confirm." wipe_code__reenter_to_confirm: str = "Please re-enter wipe code to confirm."
wipe_code__title_check: str = "Check wipe code" wipe_code__title_check: str = "Check wipe code"
wipe_code__title_invalid: str = "Invalid wipe code" wipe_code__title_invalid: str = "Invalid wipe code"
wipe_code__title_settings: str = "Wipe code settings" wipe_code__title_settings: str = "Wipe code"
wipe_code__turn_off: str = "Turn off wipe code protection?" wipe_code__turn_off: str = "Turn off wipe code protection?"
wipe_code__turn_on: str = "Turn on wipe code protection?" wipe_code__turn_on: str = "Turn on wipe code protection?"
wipe_code__wipe_code_mismatch: str = "Wipe code mismatch" wipe_code__wipe_code_mismatch: str = "Wipe code mismatch"

View File

@ -265,7 +265,7 @@ async def confirm_feeoverthreshold(
await layouts.show_warning( await layouts.show_warning(
"fee_over_threshold", "fee_over_threshold",
TR.bitcoin__unusually_high_fee, TR.bitcoin__unusually_high_fee,
fee_amount, subheader=fee_amount,
br_code=ButtonRequestType.FeeOverThreshold, br_code=ButtonRequestType.FeeOverThreshold,
) )
@ -274,7 +274,7 @@ async def confirm_change_count_over_threshold(change_count: int) -> None:
await layouts.show_warning( await layouts.show_warning(
"change_count_over_threshold", "change_count_over_threshold",
TR.bitcoin__lot_of_change_outputs, TR.bitcoin__lot_of_change_outputs,
f"{str(change_count)} {TR.words__outputs}", subheader=f"{str(change_count)} {TR.words__outputs}",
br_code=ButtonRequestType.SignTx, br_code=ButtonRequestType.SignTx,
) )
@ -283,7 +283,7 @@ async def confirm_unverified_external_input() -> None:
await layouts.show_warning( await layouts.show_warning(
"unverified_external_input", "unverified_external_input",
TR.bitcoin__unverified_external_inputs, TR.bitcoin__unverified_external_inputs,
TR.words__continue_anyway_question, subheader=TR.words__continue_anyway_question,
button=TR.buttons__continue, button=TR.buttons__continue,
br_code=ButtonRequestType.SignTx, br_code=ButtonRequestType.SignTx,
) )
@ -293,7 +293,7 @@ async def confirm_multiple_accounts() -> None:
await layouts.show_warning( await layouts.show_warning(
"sending_from_multiple_accounts", "sending_from_multiple_accounts",
TR.send__from_multiple_accounts, TR.send__from_multiple_accounts,
TR.words__continue_anyway_question, subheader=TR.words__continue_anyway_question,
button=TR.buttons__continue, button=TR.buttons__continue,
br_code=ButtonRequestType.SignTx, br_code=ButtonRequestType.SignTx,
) )
@ -306,7 +306,7 @@ async def confirm_nondefault_locktime(lock_time: int, lock_time_disabled: bool)
await layouts.show_warning( await layouts.show_warning(
"nondefault_locktime", "nondefault_locktime",
TR.bitcoin__locktime_no_effect, TR.bitcoin__locktime_no_effect,
TR.words__continue_anyway_question, subheader=TR.words__continue_anyway_question,
button=TR.buttons__continue, button=TR.buttons__continue,
br_code=ButtonRequestType.SignTx, br_code=ButtonRequestType.SignTx,
) )

View File

@ -486,7 +486,7 @@ async def warn_unknown_total_collateral() -> None:
await layouts.show_warning( await layouts.show_warning(
"confirm_unknown_total_collateral", "confirm_unknown_total_collateral",
TR.cardano__unknown_collateral_amount, TR.cardano__unknown_collateral_amount,
TR.cardano__check_all_items, subheader=TR.cardano__check_all_items,
br_code=BRT_Other, br_code=BRT_Other,
) )

View File

@ -1,6 +1,6 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from trezor import TR, config, wire from trezor import TR, config, utils, wire
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Awaitable from typing import Awaitable
@ -67,10 +67,16 @@ def _require_confirm_change_pin(msg: ChangePin) -> Awaitable[None]:
has_pin = config.has_pin() has_pin = config.has_pin()
if utils.UI_LAYOUT == "MERCURY":
title = TR.pin__title_settings
else:
title = TR.pin__title_settings + " " + TR.words__settings
if msg.remove and has_pin: # removing pin if msg.remove and has_pin: # removing pin
return confirm_action( return confirm_action(
"disable_pin", "disable_pin",
TR.pin__title_settings, title,
subtitle=TR.words__settings,
description=TR.pin__turn_off, description=TR.pin__turn_off,
verb=TR.buttons__turn_off, verb=TR.buttons__turn_off,
) )
@ -78,7 +84,8 @@ def _require_confirm_change_pin(msg: ChangePin) -> Awaitable[None]:
if not msg.remove and has_pin: # changing pin if not msg.remove and has_pin: # changing pin
return confirm_action( return confirm_action(
"change_pin", "change_pin",
TR.pin__title_settings, title,
subtitle=TR.words__settings,
description=TR.pin__change, description=TR.pin__change,
verb=TR.buttons__change, verb=TR.buttons__change,
prompt_screen=False, prompt_screen=False,
@ -87,8 +94,9 @@ def _require_confirm_change_pin(msg: ChangePin) -> Awaitable[None]:
if not msg.remove and not has_pin: # setting new pin if not msg.remove and not has_pin: # setting new pin
return confirm_set_new_pin( return confirm_set_new_pin(
"set_pin", "set_pin",
TR.pin__title_settings, title,
TR.pin__turn_on, TR.pin__turn_on,
TR.pin__cancel_setup,
TR.pin__info, TR.pin__info,
) )

View File

@ -1,6 +1,6 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from trezor import TR from trezor import TR, utils
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Awaitable from typing import Awaitable
@ -62,10 +62,16 @@ def _require_confirm_action(
from trezor.ui.layouts import confirm_action, confirm_set_new_pin from trezor.ui.layouts import confirm_action, confirm_set_new_pin
from trezor.wire import ProcessError from trezor.wire import ProcessError
if utils.UI_LAYOUT == "MERCURY":
title = TR.wipe_code__title_settings
else:
title = TR.wipe_code__title_settings + " " + TR.words__settings
if msg.remove and has_wipe_code: if msg.remove and has_wipe_code:
return confirm_action( return confirm_action(
"disable_wipe_code", "disable_wipe_code",
TR.wipe_code__title_settings, title,
subtitle=TR.words__settings,
description=TR.wipe_code__turn_off, description=TR.wipe_code__turn_off,
verb=TR.buttons__turn_off, verb=TR.buttons__turn_off,
prompt_screen=True, prompt_screen=True,
@ -74,7 +80,8 @@ def _require_confirm_action(
if not msg.remove and has_wipe_code: if not msg.remove and has_wipe_code:
return confirm_action( return confirm_action(
"change_wipe_code", "change_wipe_code",
TR.wipe_code__title_settings, title,
subtitle=TR.words__settings,
description=TR.wipe_code__change, description=TR.wipe_code__change,
verb=TR.buttons__change, verb=TR.buttons__change,
) )
@ -82,9 +89,11 @@ def _require_confirm_action(
if not msg.remove and not has_wipe_code: if not msg.remove and not has_wipe_code:
return confirm_set_new_pin( return confirm_set_new_pin(
"set_wipe_code", "set_wipe_code",
TR.wipe_code__title_settings, title,
TR.wipe_code__turn_on, TR.wipe_code__turn_on,
TR.buttons__cancel,
TR.wipe_code__info, TR.wipe_code__info,
is_wipe_code=True,
) )
# Removing non-existing wipe code. # Removing non-existing wipe code.

View File

@ -309,14 +309,16 @@ async def show_error_and_raise(
def show_warning( def show_warning(
br_name: str, br_name: str,
content: str, content: str,
title: str | None = None,
subheader: str | None = None, subheader: str | None = None,
button: str | None = None, button: str | None = None,
br_code: ButtonRequestType = ButtonRequestType.Warning, br_code: ButtonRequestType = ButtonRequestType.Warning,
) -> Awaitable[None]: ) -> Awaitable[None]:
button = button or TR.buttons__continue # def_arg button = button or TR.buttons__continue # def_arg
title = title or TR.words__important
return raise_if_not_confirmed( return raise_if_not_confirmed(
trezorui_api.show_warning( trezorui_api.show_warning(
title=TR.words__important, title=title,
value=content, value=content,
button=subheader or TR.words__continue_anyway_question, button=subheader or TR.words__continue_anyway_question,
danger=True, danger=True,
@ -1173,31 +1175,30 @@ async def confirm_reenter_pin(is_wipe_code: bool = False) -> None:
pass pass
def pin_mismatch_popup(is_wipe_code: bool = False) -> Awaitable[ui.UiResult]: def pin_mismatch_popup(is_wipe_code: bool = False) -> Awaitable[None]:
title = TR.wipe_code__mismatch if is_wipe_code else TR.pin__mismatch content = TR.wipe_code__mismatch if is_wipe_code else TR.pin__mismatch
description = TR.wipe_code__enter_new if is_wipe_code else TR.pin__reenter_new description = TR.wipe_code__enter_new if is_wipe_code else TR.pin__reenter_new
br_name = "wipe_code_mismatch" if is_wipe_code else "pin_mismatch" br_name = "wipe_code_mismatch" if is_wipe_code else "pin_mismatch"
return interact( return show_warning(
error_popup(
title,
description,
button=TR.buttons__try_again,
),
br_name, br_name,
BR_CODE_OTHER, content=content,
title=TR.words__warning,
subheader=description,
button="button",
br_code=BR_CODE_OTHER,
) )
def wipe_code_same_as_pin_popup() -> Awaitable[ui.UiResult]: def wipe_code_same_as_pin_popup() -> Awaitable[None]:
return interact(
error_popup( return show_warning(
TR.wipe_code__invalid,
TR.wipe_code__diff_from_pin,
button=TR.buttons__try_again,
),
"wipe_code_same_as_pin", "wipe_code_same_as_pin",
BR_CODE_OTHER, content=TR.wipe_code__diff_from_pin,
title=TR.words__warning,
subheader=TR.wipe_code__enter_new,
button="button",
br_code=BR_CODE_OTHER,
) )
@ -1205,14 +1206,31 @@ def confirm_set_new_pin(
br_name: str, br_name: str,
title: str, title: str,
description: str, description: str,
cancel_title: str,
information: str, information: str,
is_wipe_code: bool = False,
br_code: ButtonRequestType = BR_CODE_OTHER, br_code: ButtonRequestType = BR_CODE_OTHER,
) -> Awaitable[None]: ) -> Awaitable[None]:
return raise_if_not_confirmed( if is_wipe_code:
trezorui_api.flow_confirm_set_new_pin(title=title, description=description), return raise_if_not_confirmed(
br_name, trezorui_api.flow_confirm_set_new_wipe_code(
br_code, title=title,
) description=description + "\n" + information,
cancel_title=cancel_title,
),
br_name,
br_code,
)
else:
return raise_if_not_confirmed(
trezorui_api.flow_confirm_set_new_pin(
title=title,
description=description + "\n" + information,
cancel_title=cancel_title,
),
br_name,
br_code,
)
def confirm_firmware_update(description: str, fingerprint: str) -> Awaitable[None]: def confirm_firmware_update(description: str, fingerprint: str) -> Awaitable[None]:

View File

@ -1295,7 +1295,9 @@ async def confirm_set_new_pin(
br_name: str, br_name: str,
title: str, title: str,
description: str, description: str,
cancel_title: str, # unused for model r
information: str, information: str,
is_wipe_code: bool = False, # unused for model r
br_code: ButtonRequestType = BR_CODE_OTHER, br_code: ButtonRequestType = BR_CODE_OTHER,
) -> None: ) -> None:
await _confirm_multiple_pages_texts( await _confirm_multiple_pages_texts(

View File

@ -1277,7 +1277,9 @@ def confirm_set_new_pin(
br_name: str, br_name: str,
title: str, title: str,
description: str, description: str,
cancel_title: str, # unused for model t
information: str, information: str,
is_wipe_code: bool = False, # unused for model t
br_code: ButtonRequestType = BR_CODE_OTHER, br_code: ButtonRequestType = BR_CODE_OTHER,
) -> Awaitable[None]: ) -> Awaitable[None]:
return raise_if_not_confirmed( return raise_if_not_confirmed(

View File

@ -528,7 +528,7 @@
"pin__enter": "Enter PIN", "pin__enter": "Enter PIN",
"pin__enter_new": "Enter new PIN", "pin__enter_new": "Enter new PIN",
"pin__entered_not_valid": "The PIN you have entered is not valid.", "pin__entered_not_valid": "The PIN you have entered is not valid.",
"pin__info": "PIN will be required to access this device.", "pin__info": "The PIN will be required to access this device.",
"pin__invalid_pin": "Invalid PIN", "pin__invalid_pin": "Invalid PIN",
"pin__last_attempt": "Last attempt", "pin__last_attempt": "Last attempt",
"pin__mismatch": "Entered PINs do not match!", "pin__mismatch": "Entered PINs do not match!",
@ -538,7 +538,7 @@
"pin__reenter_to_confirm": "Please re-enter PIN to confirm.", "pin__reenter_to_confirm": "Please re-enter PIN to confirm.",
"pin__should_be_long": "PIN should be 4-50 digits long.", "pin__should_be_long": "PIN should be 4-50 digits long.",
"pin__title_check_pin": "Check PIN", "pin__title_check_pin": "Check PIN",
"pin__title_settings": "PIN settings", "pin__title_settings": "PIN",
"pin__title_wrong_pin": "Wrong PIN", "pin__title_wrong_pin": "Wrong PIN",
"pin__tries_left": "tries left", "pin__tries_left": "tries left",
"pin__turn_off": "Are you sure you want to turn off PIN protection?", "pin__turn_off": "Are you sure you want to turn off PIN protection?",
@ -904,8 +904,8 @@
"wipe_code__change": "Change wipe code?", "wipe_code__change": "Change wipe code?",
"wipe_code__changed": "Wipe code changed.", "wipe_code__changed": "Wipe code changed.",
"wipe_code__diff_from_pin": "The wipe code must be different from your PIN.", "wipe_code__diff_from_pin": "The wipe code must be different from your PIN.",
"wipe_code__disabled": "Wipe code disabled.", "wipe_code__disabled": "Wipe code protection turned off.",
"wipe_code__enabled": "Wipe code enabled.", "wipe_code__enabled": "Wipe code protection turned on.",
"wipe_code__enter_new": "Enter new wipe code", "wipe_code__enter_new": "Enter new wipe code",
"wipe_code__info": "Wipe code can be used to erase all data from this device.", "wipe_code__info": "Wipe code can be used to erase all data from this device.",
"wipe_code__invalid": "Invalid wipe code", "wipe_code__invalid": "Invalid wipe code",
@ -914,7 +914,7 @@
"wipe_code__reenter_to_confirm": "Please re-enter wipe code to confirm.", "wipe_code__reenter_to_confirm": "Please re-enter wipe code to confirm.",
"wipe_code__title_check": "Check wipe code", "wipe_code__title_check": "Check wipe code",
"wipe_code__title_invalid": "Invalid wipe code", "wipe_code__title_invalid": "Invalid wipe code",
"wipe_code__title_settings": "Wipe code settings", "wipe_code__title_settings": "Wipe code",
"wipe_code__turn_off": "Turn off wipe code protection?", "wipe_code__turn_off": "Turn off wipe code protection?",
"wipe_code__turn_on": "Turn on wipe code protection?", "wipe_code__turn_on": "Turn on wipe code protection?",
"wipe_code__wipe_code_mismatch": "Wipe code mismatch", "wipe_code__wipe_code_mismatch": "Wipe code mismatch",

View File

@ -1,8 +1,8 @@
{ {
"current": { "current": {
"merkle_root": "53515eead12df806f139761eddc91f2aa2d3de3b9e0eb831552167ee25897f4a", "merkle_root": "53515eead12df806f139761eddc91f2aa2d3de3b9e0eb831552167ee25897f4a",
"datetime": "2024-12-16T11:26:54.578708", "datetime": "2024-12-18T22:06:09.895866",
"commit": "76301b1e97ea5ce0a2e17967f44a9db2a2e905e4" "commit": "8dccc8e1d52ff8900bf7ef2a563ba230464fc831"
}, },
"history": [ "history": [
{ {