mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-25 15:58:08 +00:00
client: convert generic classname-based dispatch to a static list
Only a limited number of messages should be dispatched to handlers that can be inserted anywhere in the protocol flow. Having a fixed list of interjecting handlers makes this clearer and prevents hard-to-find bugs.
This commit is contained in:
parent
786bccfa34
commit
f3f521b028
@ -114,7 +114,7 @@ class BaseClient(object):
|
|||||||
__tracebackhide__ = True # for pytest # pylint: disable=W0612
|
__tracebackhide__ = True # for pytest # pylint: disable=W0612
|
||||||
return self.transport.read()
|
return self.transport.read()
|
||||||
|
|
||||||
def callback_PinMatrixRequest(self, msg):
|
def _callback_pin(self, msg):
|
||||||
pin = self.ui.get_pin(msg.type)
|
pin = self.ui.get_pin(msg.type)
|
||||||
if not pin.isdigit():
|
if not pin.isdigit():
|
||||||
raise ValueError("Non-numeric PIN provided")
|
raise ValueError("Non-numeric PIN provided")
|
||||||
@ -129,7 +129,7 @@ class BaseClient(object):
|
|||||||
else:
|
else:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
def callback_PassphraseRequest(self, msg):
|
def _callback_passphrase(self, msg):
|
||||||
if msg.on_device:
|
if msg.on_device:
|
||||||
passphrase = None
|
passphrase = None
|
||||||
else:
|
else:
|
||||||
@ -142,7 +142,7 @@ class BaseClient(object):
|
|||||||
else:
|
else:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
def callback_ButtonRequest(self, msg):
|
def _callback_button(self, msg):
|
||||||
__tracebackhide__ = True # for pytest # pylint: disable=W0612
|
__tracebackhide__ = True # for pytest # pylint: disable=W0612
|
||||||
# do this raw - send ButtonAck first, notify UI later
|
# do this raw - send ButtonAck first, notify UI later
|
||||||
self._raw_write(proto.ButtonAck())
|
self._raw_write(proto.ButtonAck())
|
||||||
@ -153,23 +153,19 @@ class BaseClient(object):
|
|||||||
def call(self, msg):
|
def call(self, msg):
|
||||||
resp = self.call_raw(msg)
|
resp = self.call_raw(msg)
|
||||||
while True:
|
while True:
|
||||||
handler_name = "callback_{}".format(resp.__class__.__name__)
|
if isinstance(resp, proto.PinMatrixRequest):
|
||||||
handler = getattr(self, handler_name, None)
|
resp = self._callback_pin(resp)
|
||||||
if handler is None:
|
elif isinstance(resp, proto.PassphraseRequest):
|
||||||
break
|
resp = self._callback_passphrase(resp)
|
||||||
resp = handler(resp) # pylint: disable=E1102
|
elif isinstance(resp, proto.ButtonRequest):
|
||||||
|
resp = self._callback_button(resp)
|
||||||
if isinstance(resp, proto.Failure):
|
elif isinstance(resp, proto.Failure):
|
||||||
if resp.code == proto.FailureType.ActionCancelled:
|
if resp.code == proto.FailureType.ActionCancelled:
|
||||||
raise exceptions.Cancelled
|
raise exceptions.Cancelled
|
||||||
raise exceptions.TrezorFailure(resp)
|
raise exceptions.TrezorFailure(resp)
|
||||||
|
else:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
def register_message(self, msg):
|
|
||||||
"""Allow application to register custom protobuf message type"""
|
|
||||||
mapping.register_message(msg)
|
|
||||||
|
|
||||||
|
|
||||||
class ProtocolMixin(object):
|
class ProtocolMixin(object):
|
||||||
VENDORS = ("bitcointrezor.com", "trezor.io")
|
VENDORS = ("bitcointrezor.com", "trezor.io")
|
||||||
|
Loading…
Reference in New Issue
Block a user