From 5af3228d4b9b6f9320678378b58f8194dfa4fb44 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Fri, 11 Jul 2025 22:20:56 -0400 Subject: [PATCH] Prompt for fingerprint selection if multiple --- src/password_manager/manager.py | 9 ++- src/tests/test_multiple_fingerprint_prompt.py | 64 +++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 src/tests/test_multiple_fingerprint_prompt.py diff --git a/src/password_manager/manager.py b/src/password_manager/manager.py index 9b0a948..7c62dda 100644 --- a/src/password_manager/manager.py +++ b/src/password_manager/manager.py @@ -276,13 +276,16 @@ class PasswordManager: try: fingerprints = self.fingerprint_manager.list_fingerprints() current = self.fingerprint_manager.current_fingerprint - if current and current in fingerprints: - self.select_fingerprint(current) + + # Auto-select when only one fingerprint exists + if len(fingerprints) == 1: + self.select_fingerprint(fingerprints[0]) return print(colored("\nAvailable Seed Profiles:", "cyan")) for idx, fp in enumerate(fingerprints, start=1): - print(colored(f"{idx}. {fp}", "cyan")) + marker = " *" if fp == current else "" + print(colored(f"{idx}. {fp}{marker}", "cyan")) print(colored(f"{len(fingerprints)+1}. Add a new seed profile", "cyan")) diff --git a/src/tests/test_multiple_fingerprint_prompt.py b/src/tests/test_multiple_fingerprint_prompt.py new file mode 100644 index 0000000..f065ac6 --- /dev/null +++ b/src/tests/test_multiple_fingerprint_prompt.py @@ -0,0 +1,64 @@ +import importlib +from pathlib import Path +from tempfile import TemporaryDirectory + +import constants +import password_manager.manager as manager_module +from utils.fingerprint_manager import FingerprintManager + +from helpers import TEST_SEED + +OTHER_SEED = ( + "legal winner thank year wave sausage worth useful legal winner thank yellow" +) + + +def test_prompt_when_multiple_fingerprints(monkeypatch): + with TemporaryDirectory() as tmpdir: + tmp_path = Path(tmpdir) + monkeypatch.setattr(Path, "home", lambda: tmp_path) + + importlib.reload(constants) + importlib.reload(manager_module) + + fm = FingerprintManager(constants.APP_DIR) + fp1 = fm.add_fingerprint(TEST_SEED) + fm.add_fingerprint(OTHER_SEED) + + def init_fm(self): + self.fingerprint_manager = fm + + monkeypatch.setattr( + manager_module.PasswordManager, "initialize_fingerprint_manager", init_fm + ) + monkeypatch.setattr( + manager_module.PasswordManager, + "setup_encryption_manager", + lambda *a, **k: True, + ) + monkeypatch.setattr( + manager_module.PasswordManager, "initialize_bip85", lambda self: None + ) + monkeypatch.setattr( + manager_module.PasswordManager, "initialize_managers", lambda self: None + ) + monkeypatch.setattr( + manager_module.PasswordManager, + "sync_index_from_nostr_if_missing", + lambda self: None, + ) + monkeypatch.setattr( + manager_module.PasswordManager, "verify_password", lambda *a, **k: True + ) + + calls = {"count": 0} + + def fake_input(*args, **kwargs): + calls["count"] += 1 + return "1" # select first fingerprint + + monkeypatch.setattr("builtins.input", fake_input) + + pm = manager_module.PasswordManager() + assert calls["count"] == 1 + assert pm.current_fingerprint == fp1