feat(eckhart): external menu on `confirm_action`
What changed, and why it matters
This commit updates the user interface code for the Trezor hardware wallet's 'Eckhart' layout. It makes the optional external menu actually appear when requested, by adding a menu icon to the screen header and passing the setting through to the screen component. There is no direct evidence this fixes a security vulnerability; it appears to be a normal UI feature implementation.
No immediate security action required. Treat as a normal UI feature commit. If auditing, verify that enabling the external menu does not expose unintended actions or bypass existing confirmation flows.
Security signals we found
No security-relevant keywords in commit title or message
No changelog entry provided
Change is purely UI feature wiring with no privilege, crypto, or memory-safety changes visible
No references to vulnerabilities, fixes, researchers, or CVEs in commit materials
Evidence from the diff
In core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs, the confirm_action implementation for the Eckhart layout stops ignoring the external_menu parameter and instead uses it. When external_menu is true, it adds a right header button with the menu icon and calls .with_external_menu(true) on the TextScreen. The TODO comment indicates this is intended to replace the internal menu eventually. The change is small and localized to UI wiring.
Changed components
Trezor firmware core UI layerEckhart layout confirm_action screenHeader and TextScreen componentsInspect captured patch +8 / −2
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index 2dde01f6..b5585f34 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -70,7 +70,7 @@ impl FirmwareUI for UIEckhart {
reverse: bool,
_prompt_screen: bool,
_prompt_title: Option<TString<'static>>,
- _external_menu: bool, // TODO: will eventually replace the internal menu
+ external_menu: bool, // TODO: will eventually replace the internal menu
) -> Result<impl LayoutMaybeTrace, Error> {
let paragraphs = {
let action = action.unwrap_or("".into());
@@ -110,8 +110,14 @@ impl FirmwareUI for UIEckhart {
}
};
+ let mut header = Header::new(title);
+ if external_menu {
+ header = header.with_right_button(Button::with_icon(theme::ICON_MENU), HeaderMsg::Menu);
+ }
+
let mut screen = TextScreen::new(paragraphs)
- .with_header(Header::new(title))
+ .with_header(header)
+ .with_external_menu(external_menu)
.with_action_bar(if cancel {
ActionBar::new_double(Button::with_icon(theme::ICON_CROSS), right_button)
} else {
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.