From 95b13083dccc14aec74bda5df48bc9ae7dca1e99 Mon Sep 17 00:00:00 2001 From: scgbckbone Date: Fri, 27 Sep 2024 10:18:35 +0200 Subject: [PATCH] do not allow to delete current active tmp seed from seed vault and purge its settings --- releases/Next-ChangeLog.md | 1 + shared/seed.py | 49 +++++++++++++++++-------------------- testing/test_ephemeral.py | 50 +++++++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 36 deletions(-) diff --git a/releases/Next-ChangeLog.md b/releases/Next-ChangeLog.md index 9d8df9d8..31cbff4a 100644 --- a/releases/Next-ChangeLog.md +++ b/releases/Next-ChangeLog.md @@ -11,6 +11,7 @@ This lists the new changes that have not yet been published in a normal release. On Q, result is blank screen, on Mk4, result is three-dots screen. - Bugfix: Do not allow to enable/disable Seed Vault feature when in temporary seed mode - Bugfix: Bless Firmware causes hanging progress bar +- Change: Do not allow to purge settings of current active tmp seed when deleting it from Seed Vault # Mk4 Specific Changes diff --git a/shared/seed.py b/shared/seed.py index f6c3289c..ec82a81e 100644 --- a/shared/seed.py +++ b/shared/seed.py @@ -830,42 +830,37 @@ class SeedVaultMenu(MenuSystem): async def _remove(menu, label, item): from glob import dis, settings + esc = "" + tmp_val = False idx, xfp_str, encoded = item.arg + current_active = (pa.tmp_value == bytes(encoded)) - msg = ("Remove seed from seed vault and delete its " - "settings?\n\nPress %s to continue, press (1) to " - "only remove from seed vault and keep " - "encrypted settings for later use.\n\n" - "WARNING: Funds will be lost if wallet is" - " not backed-up elsewhere.") % OK + msg = "Remove seed from seed vault " + if pa.tmp_value and current_active: + tmp_val = True + msg += "?\n\n" + else: + msg += ("and delete its settings?\n\n" + "Press %s to continue, press (1) to " + "only remove from seed vault and keep " + "encrypted settings for later use.\n\n") % OK + esc += "1" - ch = await ux_show_story(title="[" + xfp_str + "]", msg=msg, escape="1") + msg += "WARNING: Funds will be lost if wallet is not backed-up elsewhere." + + ch = await ux_show_story(title="[" + xfp_str + "]", msg=msg, escape=esc) if ch == "x": return dis.fullscreen("Saving...") - wipe_slot = (ch != "1") - tmp_val = False - - if pa.tmp_value: - tmp_val = True + wipe_slot = not current_active and (ch != "1") if wipe_slot: - # are we deleting current active ephemeral wallet - # and its settings ? - # slot wiping - if tmp_val: - # wipe current settings - settings.blank() - pa.tmp_value = False - settings.return_to_master_seed() - else: - # in main settings - xs = SettingsObject() - xs.set_key(encoded) - xs.load() - xs.blank() - del xs + xs = SettingsObject() + xs.set_key(encoded) + xs.load() + xs.blank() + del xs # CAUTION: will get shadow copy if in tmp seed mode already seeds = settings.master_get("seeds", []) diff --git a/testing/test_ephemeral.py b/testing/test_ephemeral.py index 4f6e5409..c57c26f9 100644 --- a/testing/test_ephemeral.py +++ b/testing/test_ephemeral.py @@ -256,7 +256,7 @@ def confirm_tmp_seed(need_keypress, cap_story, press_select): @pytest.fixture def seed_vault_delete(pick_menu_item, need_keypress, cap_menu, cap_story, - goto_home, press_select): + goto_home, press_select, settings_get): def doit(xfp, wipe=True): # delete it from records goto_home() @@ -276,12 +276,17 @@ def seed_vault_delete(pick_menu_item, need_keypress, cap_menu, cap_story, title, story = cap_story() assert "Remove" in story assert xfp in title - assert "press (1)" in story + if wipe: press_select() else: - # preserve settings - remove just from seed vaul - need_keypress("1") + if xfp2str(settings_get("xfp")) == xfp: + assert "press (1)" not in story + press_select() # will NOT wipe settings + else: + assert "press (1)" in story + # preserve settings - remove just from seed vaul + need_keypress("1") time.sleep(.1) goto_home() @@ -1117,16 +1122,21 @@ def test_seed_vault_modifications(settings_set, reset_seed_words, pick_menu_item m = cap_menu() assert m[0] == "AAA" pick_menu_item("Delete") + time.sleep(.1) + title, story = cap_story() + # current active does not offer to purge the slot, only to remove from Seed Vault + assert "delete its settings?" not in story press_select() time.sleep(.1) + goto_home() m = cap_menu() - # after we delete from seed vault together with its settings - # we're back to master secret - assert m[0] == "Ready To Sign" + # still in tmp mode + assert m[0] != "Ready To Sign" pick_menu_item("Seed Vault") time.sleep(.1) m = cap_menu() - assert len(m) == 2 + # Ignore Add Current and Restore Master (only SV items are numbered with colon) + assert len([mi for mi in m if ":" in mi]) == 2 press_down() press_select() @@ -1146,7 +1156,10 @@ def test_seed_vault_modifications(settings_set, reset_seed_words, pick_menu_item assert "Delete" in m pick_menu_item("Delete") - need_keypress("1") # only delete from seed vault + time.sleep(.1) + _, story = cap_story() + assert "delete its settings?" not in story + press_select() # only delete from seed vault, no other option provided time.sleep(.1) m = cap_menu() assert len(m) == 3 @@ -1164,6 +1177,25 @@ def test_seed_vault_modifications(settings_set, reset_seed_words, pick_menu_item # still in ephemeral assert title == m[0] + restore_main_seed() + pick_menu_item("Seed Vault") + press_select() + time.sleep(.1) + m = cap_menu() + assert "Rename" in m + assert "Use This Seed" in m + assert "Delete" in m + + pick_menu_item("Delete") + time.sleep(.1) + _, story = cap_story() + assert "delete its settings?" in story + need_keypress("1") # only remove from seed vault, keep settings + time.sleep(.1) + m = cap_menu() + assert all([":" not in mi for mi in m]) + assert "(none saved yet)" in m + def test_xfp_collision(reset_seed_words, settings_set, import_ephemeral_xprv, cap_story, press_cancel, pick_menu_item, cap_menu,