1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-26 00:18:15 +00:00

fix(core): don't send ButtonRequests during menu handling

Use `LayoutContent.page_count()` instead of `ButtonRequest.pages`.

[no changelog]
This commit is contained in:
Roman Zeyde 2025-07-02 15:35:54 +03:00 committed by Roman Zeyde
parent 9d9f3732a3
commit 09be64d1e7
2 changed files with 37 additions and 38 deletions

View File

@ -80,6 +80,7 @@ async def confirm_with_menu(
) -> None: ) -> None:
while True: while True:
result = await interact(main, br_name, br_code) result = await interact(main, br_name, br_code)
br_name = None # ButtonRequest should be sent once (for the main layout)
if result is trezorui_api.INFO: if result is trezorui_api.INFO:
await show_menu(menu, br_name, br_code) await show_menu(menu, br_name, br_code)
else: else:

View File

@ -930,9 +930,13 @@ class DebugUI:
def default_input_flow(self) -> InputFlowType: def default_input_flow(self) -> InputFlowType:
while True: while True:
yield from self._handle_button_request() br = yield
if br.code == messages.ButtonRequestType.PinEntry:
self.debuglink.input(self.get_pin())
else:
self._paginate_and_confirm(br.pages)
def _visit_menu_items(self) -> InputFlowType: def _visit_menu_items(self) -> None:
layout = self.debuglink.read_layout() layout = self.debuglink.read_layout()
if not layout.has_menu(): if not layout.has_menu():
return return
@ -942,54 +946,48 @@ class DebugUI:
# enter info menu layout and paginate through its items # enter info menu layout and paginate through its items
self.debuglink.press_info() self.debuglink.press_info()
br = yield menu_items_count = self.debuglink.read_layout().page_count()
assert br.pages is not None for _ in range(menu_items_count):
for _ in range(br.pages):
self.debuglink.press_middle() self.debuglink.press_middle()
# paginate through all properties and confirm # paginate through all properties and confirm
yield from self._handle_button_request() self._paginate_and_confirm(None)
# paginate to next menu item # paginate to next menu item
br = yield
self.debuglink.press_right() self.debuglink.press_right()
# cancel info menu layout # cancel info menu layout
self.debuglink.press_no() self.debuglink.press_no()
# back to the main layout
br = yield
def _handle_button_request(self) -> InputFlowType: def _paginate_and_confirm(self, pages: int | None) -> None:
br = yield if pages is None:
if br.code == messages.ButtonRequestType.PinEntry: pages = self.debuglink.read_layout().page_count()
self.debuglink.input(self.get_pin())
else:
# Paginating (going as further as possible)
if br.pages is not None:
for _ in range(br.pages - 1):
if self.debuglink.model is models.T3W1:
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.swipe_up()
# Visit info menus (if exist) # Paginating (going as further as possible)
yield from self._visit_menu_items() for _ in range(pages - 1):
if self.debuglink.model is models.T3W1:
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.swipe_up()
# Confirm current layout # Visit info menus (if exist)
if self.debuglink.model is models.T3T1: self._visit_menu_items()
layout = self.debuglink.read_layout()
if "PromptScreen" in layout.all_components(): # Confirm current layout
self.debuglink.press_yes() if self.debuglink.model is models.T3T1:
elif "SwipeContent" in layout.all_components(): layout = self.debuglink.read_layout()
self.debuglink.swipe_up() if "PromptScreen" in layout.all_components():
else: self.debuglink.press_yes()
self.debuglink.press_yes() elif "SwipeContent" in layout.all_components():
elif self.debuglink.model is models.T3W1: self.debuglink.swipe_up()
layout = self.debuglink.read_layout()
if "TextScreen" in layout.all_components():
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.press_yes()
else: else:
self.debuglink.press_yes() self.debuglink.press_yes()
elif self.debuglink.model is models.T3W1:
layout = self.debuglink.read_layout()
if "TextScreen" in layout.all_components():
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.press_yes()
else:
self.debuglink.press_yes()
def button_request(self, br: messages.ButtonRequest) -> None: def button_request(self, br: messages.ButtonRequest) -> None:
self.debuglink.snapshot_legacy() self.debuglink.snapshot_legacy()