wip: default input flows

M1nd3r/thp-dealloc
matejcik 2 months ago committed by M1nd3r
parent 4710306b9a
commit 66a74855f1

@ -1055,7 +1055,7 @@ class TrezorClientDebugLink(TrezorClient):
return msg
def set_input_flow(
self, input_flow: Generator[None, Optional[messages.ButtonRequest], None]
self, input_flow: Generator[None, Optional[messages.ButtonRequest], None] | None
) -> None:
"""Configure a sequence of input events for the current with-block.
@ -1084,6 +1084,10 @@ class TrezorClientDebugLink(TrezorClient):
if not self.in_with_statement:
raise RuntimeError("Must be called inside 'with' statement")
if input_flow is None:
self.ui.input_flow = None
return
if callable(input_flow):
input_flow = input_flow()
if not hasattr(input_flow, "send"):

@ -45,35 +45,27 @@ class InputFlowBase:
self.BAK = BackupFlow(self.client)
self.ETH = EthereumFlow(self.client)
def model(self) -> str | models.TrezorModel:
@property
def model(self) -> models.TrezorModel:
return self.client.model
def get(self) -> Callable[[], BRGeneratorType]:
def get(self) -> Callable[[], BRGeneratorType] | None:
self.client.watch_layout(True)
# There could be one common input flow for all models
if hasattr(self, "input_flow_common"):
return getattr(self, "input_flow_common")
elif self.model() is models.T2T1:
return self.input_flow_tt
elif self.model() is models.T2B1:
return self.input_flow_tr
elif self.model() is models.T3T1:
return self.input_flow_t3t1
else:
raise ValueError("Unknown model")
def input_flow_tt(self) -> BRGeneratorType:
"""Special for TT"""
raise NotImplementedError
def input_flow_tr(self) -> BRGeneratorType:
"""Special for TR"""
raise NotImplementedError
models_dict = {
models.T2T1: "tt",
models.T2B1: "tr",
models.T3T1: "t3t1",
}
model_str = models_dict.get(self.model)
if model_str is None:
raise ValueError("Unknown model")
def input_flow_t3t1(self) -> BRGeneratorType:
"""Special for T3T1"""
raise NotImplementedError
return getattr(self, f"input_flow_{model_str}", None)
def text_content(self) -> str:
return self.debug.read_layout().text_content()
@ -98,7 +90,7 @@ class InputFlowSetupDevicePINWIpeCode(InputFlowBase):
yield # do you want to set/change the wipe code?
self.debug.press_yes()
if self.model() is models.T2B1:
if self.model is models.T2B1:
layout = self.debug.read_layout()
if "PinKeyboard" not in layout.all_components():
yield from swipe_if_necessary(self.debug) # wipe code info
@ -129,7 +121,7 @@ class InputFlowNewCodeMismatch(InputFlowBase):
yield # do you want to set/change the pin/wipe code?
self.debug.press_yes()
if self.model() is models.T2B1:
if self.model is models.T2B1:
layout = self.debug.read_layout()
if "PinKeyboard" not in layout.all_components():
yield from swipe_if_necessary(self.debug) # code info
@ -845,43 +837,6 @@ def sign_tx_go_to_info_t3t1(
return content
def sign_tx_go_to_info_t3t1(
client: Client, multi_account: bool = False
) -> Generator[None, None, str]:
yield # confirm output
client.debug.read_layout()
client.debug.swipe_up()
yield # confirm output
client.debug.read_layout()
client.debug.swipe_up()
if multi_account:
yield
client.debug.read_layout()
client.debug.swipe_up()
yield # confirm transaction
client.debug.read_layout()
client.debug.click(buttons.CORNER_BUTTON)
client.debug.synchronize_at("VerticalMenu")
client.debug.click(buttons.VERTICAL_MENU[0])
layout = client.debug.read_layout()
content = layout.text_content()
client.debug.click(buttons.CORNER_BUTTON)
client.debug.synchronize_at("VerticalMenu")
client.debug.click(buttons.VERTICAL_MENU[1])
layout = client.debug.read_layout()
content += " " + layout.text_content()
client.debug.click(buttons.CORNER_BUTTON)
client.debug.click(buttons.CORNER_BUTTON)
return content
def sign_tx_go_to_info_tr(
client: Client,
) -> Generator[None, None, str]:
@ -1146,9 +1101,9 @@ class InputFlowEIP712ShowMore(InputFlowBase):
def _confirm_show_more(self) -> None:
"""Model-specific, either clicks a screen or presses a button."""
if self.model() in (models.T2T1, models.T3T1):
if self.model in (models.T2T1, models.T3T1):
self.debug.click(self.SHOW_MORE)
elif self.model() is models.T2B1:
elif self.model is models.T2B1:
self.debug.press_right()
def input_flow_common(self) -> BRGeneratorType:
@ -2006,7 +1961,7 @@ class InputFlowSlip39AdvancedRecoveryAbort(InputFlowBase):
def input_flow_common(self) -> BRGeneratorType:
yield from self.REC.confirm_recovery()
if self.model() in (models.T2T1, models.T3T1):
if self.model in (models.T2T1, models.T3T1):
yield from self.REC.input_number_of_words(20)
yield from self.REC.abort_recovery(True)
@ -2019,7 +1974,7 @@ class InputFlowSlip39AdvancedRecoveryNoAbort(InputFlowBase):
def input_flow_common(self) -> BRGeneratorType:
yield from self.REC.confirm_recovery()
if self.model() in (models.T2T1, models.T3T1):
if self.model in (models.T2T1, models.T3T1):
yield from self.REC.input_number_of_words(self.word_count)
yield from self.REC.abort_recovery(False)
else:
@ -2128,7 +2083,7 @@ class InputFlowSlip39BasicRecoveryAbort(InputFlowBase):
def input_flow_common(self) -> BRGeneratorType:
yield from self.REC.confirm_recovery()
if self.model() in (models.T2T1, models.T3T1):
if self.model in (models.T2T1, models.T3T1):
yield from self.REC.input_number_of_words(20)
yield from self.REC.abort_recovery(True)
@ -2161,7 +2116,7 @@ class InputFlowSlip39BasicRecoveryNoAbort(InputFlowBase):
def input_flow_common(self) -> BRGeneratorType:
yield from self.REC.confirm_recovery()
if self.model() in (models.T2T1, models.T3T1):
if self.model in (models.T2T1, models.T3T1):
yield from self.REC.input_number_of_words(self.word_count)
yield from self.REC.abort_recovery(False)
else:
@ -2295,17 +2250,6 @@ class InputFlowConfirmAllWarnings(InputFlowBase):
def __init__(self, client: Client):
super().__init__(client)
def input_flow_tt(self) -> BRGeneratorType:
br = yield
while True:
# wait for homescreen to go away
self.debug.read_layout()
self.client.ui._default_input_flow(br)
br = yield
def input_flow_tr(self) -> BRGeneratorType:
return self.input_flow_tt()
def input_flow_t3t1(self) -> BRGeneratorType:
br = yield
while True:

Loading…
Cancel
Save