Skip to content

Commit 7367617

Browse files
committed
Fix PIN keyboard overlay: respect initial_keyboard in SeedAddPassphraseScreen._run()
The _run() loop always started with the lowercase letter keyboard regardless of which keyboard was rendered initially, causing arrow key navigation to operate on a hidden letter overlay instead of the visible digits keyboard. Also pass initial_keyboard='123' to all PIN/PUK entry screens so they start on digits.
1 parent 18a48ad commit 7367617

3 files changed

Lines changed: 44 additions & 10 deletions

File tree

src/seedsigner/gui/screens/seed_screens.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -890,9 +890,29 @@ def _render(self):
890890

891891
def _run(self):
892892
cursor_position = len(self.passphrase)
893-
cur_keyboard = self.keyboard_abc
894-
cur_button1_text = self.KEYBOARD__UPPERCASE_BUTTON_TEXT
895-
cur_button2_text = self.KEYBOARD__DIGITS_BUTTON_TEXT
893+
894+
# Respect initial_keyboard so the interactive loop starts on the same
895+
# keyboard that was rendered (e.g. digits for PIN entry screens).
896+
if self.initial_keyboard == self.KEYBOARD__UPPERCASE_BUTTON_TEXT:
897+
cur_keyboard = self.keyboard_ABC
898+
cur_button1_text = self.KEYBOARD__LOWERCASE_BUTTON_TEXT
899+
cur_button2_text = self.KEYBOARD__DIGITS_BUTTON_TEXT
900+
elif self.initial_keyboard == self.KEYBOARD__DIGITS_BUTTON_TEXT:
901+
cur_keyboard = self.keyboard_digits
902+
cur_button1_text = self.KEYBOARD__UPPERCASE_BUTTON_TEXT
903+
cur_button2_text = self.KEYBOARD__SYMBOLS_1_BUTTON_TEXT
904+
elif self.initial_keyboard == self.KEYBOARD__SYMBOLS_1_BUTTON_TEXT:
905+
cur_keyboard = self.keyboard_symbols_1
906+
cur_button1_text = self.KEYBOARD__UPPERCASE_BUTTON_TEXT
907+
cur_button2_text = self.KEYBOARD__SYMBOLS_2_BUTTON_TEXT
908+
elif self.initial_keyboard == self.KEYBOARD__SYMBOLS_2_BUTTON_TEXT:
909+
cur_keyboard = self.keyboard_symbols_2
910+
cur_button1_text = self.KEYBOARD__UPPERCASE_BUTTON_TEXT
911+
cur_button2_text = self.KEYBOARD__DIGITS_BUTTON_TEXT
912+
else:
913+
cur_keyboard = self.keyboard_abc
914+
cur_button1_text = self.KEYBOARD__UPPERCASE_BUTTON_TEXT
915+
cur_button2_text = self.KEYBOARD__DIGITS_BUTTON_TEXT
896916

897917
# Start the interactive update loop
898918
while True:

src/seedsigner/helpers/seedkeeper_utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ def prompt_for_pin(
213213
"""Prompt for a PIN and enforce configurable PIN requirements."""
214214

215215
while True:
216-
ret = seed_screens.SeedAddPassphraseScreen(title=title).display()
216+
ret = seed_screens.SeedAddPassphraseScreen(
217+
title=title, initial_keyboard="123"
218+
).display()
217219
if isinstance(ret, dict) and "is_back_button" in ret:
218220
return None
219221

src/seedsigner/views/smartcard_views.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,7 +1385,9 @@ def common_reset_factory_new(self, Satochip_Connector):
13851385
if ret == RET_CODE__BACK_BUTTON:
13861386
return resetStatus
13871387

1388-
puk = seed_screens.SeedAddPassphraseScreen(title="Enter PUK").display()
1388+
puk = seed_screens.SeedAddPassphraseScreen(
1389+
title="Enter PUK", initial_keyboard="123"
1390+
).display()
13891391

13901392
if "is_back_button" in puk:
13911393
return resetStatus
@@ -3053,7 +3055,9 @@ def run(self):
30533055
if not connector:
30543056
return Destination(BackStackView)
30553057

3056-
puk_ret = seed_screens.SeedAddPassphraseScreen(title="PUK").display()
3058+
puk_ret = seed_screens.SeedAddPassphraseScreen(
3059+
title="PUK", initial_keyboard="123"
3060+
).display()
30573061
if "is_back_button" in puk_ret:
30583062
return Destination(BackStackView)
30593063
puk_str = puk_ret.get("passphrase", "")
@@ -4415,7 +4419,9 @@ def run(self):
44154419
return Destination(BackStackView)
44164420

44174421
# PIN is set; prompt for the current PIN once, then the new PIN.
4418-
ret = seed_screens.SeedAddPassphraseScreen(title="Current PIN").display()
4422+
ret = seed_screens.SeedAddPassphraseScreen(
4423+
title="Current PIN", initial_keyboard="123"
4424+
).display()
44194425
if isinstance(ret, dict) and "is_back_button" in ret:
44204426
return Destination(BackStackView)
44214427
old_pin = ret.get("passphrase", "")
@@ -4699,7 +4705,9 @@ def _show_specter_incorrect_pin_warning(parent_view, secure_applet, secure_chann
46994705

47004706
def _prompt_specter_pin_once(parent_view, title: str) -> str | None:
47014707
while True:
4702-
ret = seed_screens.SeedAddPassphraseScreen(title=title).display()
4708+
ret = seed_screens.SeedAddPassphraseScreen(
4709+
title=title, initial_keyboard="123"
4710+
).display()
47034711
if isinstance(ret, dict) and "is_back_button" in ret:
47044712
return None
47054713

@@ -4748,7 +4756,9 @@ def _prompt_specter_new_pin(parent_view, title: str) -> str | None:
47484756

47494757
def _prompt_keycard_digits_once(parent_view, title: str, *, length: int, label: str) -> str | None:
47504758
while True:
4751-
ret = seed_screens.SeedAddPassphraseScreen(title=title).display()
4759+
ret = seed_screens.SeedAddPassphraseScreen(
4760+
title=title, initial_keyboard="123"
4761+
).display()
47524762
if isinstance(ret, dict) and "is_back_button" in ret:
47534763
return None
47544764

@@ -4821,7 +4831,9 @@ def _unlock_specter_card_if_needed(parent_view, secure_applet, secure_channel) -
48214831
if status.get("status") != "locked":
48224832
return True
48234833

4824-
ret = seed_screens.SeedAddPassphraseScreen(title="Card PIN").display()
4834+
ret = seed_screens.SeedAddPassphraseScreen(
4835+
title="Card PIN", initial_keyboard="123"
4836+
).display()
48254837
if isinstance(ret, dict) and "is_back_button" in ret:
48264838
return False
48274839
pin = ret.get("passphrase", "")

0 commit comments

Comments
 (0)