feat(core/bitcoin): do not show path warning when GetAddress is called silently (fixes #1206)

pull/1328/head
matejcik 4 years ago committed by matejcik
parent f3b6de399a
commit f10084117b

@ -43,12 +43,14 @@ async def show_xpubs(
async def get_address( async def get_address(
ctx: wire.Context, msg: GetAddress, keychain: Keychain, coin: CoinInfo ctx: wire.Context, msg: GetAddress, keychain: Keychain, coin: CoinInfo
) -> Address: ) -> Address:
await validate_path( if msg.show_display:
ctx, # skip soft-validation for silent calls
keychain, await validate_path(
msg.address_n, ctx,
validate_path_against_script_type(coin, msg), keychain,
) msg.address_n,
validate_path_against_script_type(coin, msg),
)
node = keychain.derive(msg.address_n) node = keychain.derive(msg.address_n)

@ -16,7 +16,7 @@
import pytest import pytest
from trezorlib import btc, messages, device from trezorlib import btc, device, messages
from trezorlib.exceptions import TrezorFailure from trezorlib.exceptions import TrezorFailure
from trezorlib.messages import SafetyCheckLevel from trezorlib.messages import SafetyCheckLevel
from trezorlib.tools import parse_path from trezorlib.tools import parse_path
@ -227,10 +227,11 @@ def test_invalid_path(client):
@pytest.mark.skip_t1 @pytest.mark.skip_t1
def test_unknown_path(client): def test_unknown_path_tt(client):
UNKNOWN_PATH = parse_path("m/44'/9'/0'/0/0")
with pytest.raises(TrezorFailure, match="Forbidden key path"): with pytest.raises(TrezorFailure, match="Forbidden key path"):
# account number is too high # account number is too high
btc.get_address(client, "Bitcoin", parse_path("m/44'/0'/101'/0/0")) btc.get_address(client, "Bitcoin", UNKNOWN_PATH)
# disable safety checks # disable safety checks
device.apply_settings(client, safety_checks=SafetyCheckLevel.PromptTemporarily) device.apply_settings(client, safety_checks=SafetyCheckLevel.PromptTemporarily)
@ -241,11 +242,37 @@ def test_unknown_path(client):
messages.ButtonRequest( messages.ButtonRequest(
code=messages.ButtonRequestType.UnknownDerivationPath code=messages.ButtonRequestType.UnknownDerivationPath
), ),
messages.ButtonRequest(code=messages.ButtonRequestType.Address),
messages.Address, messages.Address,
] ]
) )
# try again with a warning # try again with a warning
btc.get_address(client, "Bitcoin", parse_path("m/44'/0'/101'/0/0")) btc.get_address(client, "Bitcoin", UNKNOWN_PATH, show_display=True)
with client:
# no warning is displayed when the call is silent
client.set_expected_responses([messages.Address])
btc.get_address(client, "Bitcoin", UNKNOWN_PATH, show_display=False)
@pytest.mark.skip_t2
def test_unknown_path_t1(client):
UNKNOWN_PATH = parse_path("m/44'/9'/0'/0/0")
with client:
client.set_expected_responses(
[
messages.ButtonRequest(code=messages.ButtonRequestType.Other),
messages.ButtonRequest(code=messages.ButtonRequestType.Address),
messages.Address,
]
)
# warning is shown when showing address
btc.get_address(client, "Bitcoin", UNKNOWN_PATH, show_display=True)
with client:
# no warning is displayed when the call is silent
client.set_expected_responses([messages.Address])
btc.get_address(client, "Bitcoin", UNKNOWN_PATH, show_display=False)
@pytest.mark.altcoin @pytest.mark.altcoin

Loading…
Cancel
Save