Refactor password manager modules

This commit is contained in:
thePR0M3TH3AN
2025-07-17 19:21:10 -04:00
parent 87149517d8
commit c23b2e4913
115 changed files with 388 additions and 404 deletions

View File

@@ -38,11 +38,11 @@ consts.SCRIPT_CHECKSUM_FILE = consts.APP_DIR / "seedpass_script_checksum.txt"
from constants import APP_DIR, initialize_app
from utils.key_derivation import derive_key_from_password, derive_index_key
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from password_manager.backup import BackupManager
from password_manager.entry_management import EntryManager
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
from seedpass.core.backup import BackupManager
from seedpass.core.entry_management import EntryManager
from nostr.client import NostrClient
from utils.fingerprint import generate_fingerprint
from utils.fingerprint_manager import FingerprintManager

View File

@@ -14,7 +14,7 @@ from constants import SCRIPT_CHECKSUM_FILE, initialize_app
def main() -> None:
"""Calculate checksum for the main script and write it to SCRIPT_CHECKSUM_FILE."""
initialize_app()
script_path = SRC_DIR / "password_manager" / "manager.py"
script_path = SRC_DIR / "seedpass/core" / "manager.py"
if not update_checksum_file(str(script_path), str(SCRIPT_CHECKSUM_FILE)):
raise SystemExit(f"Failed to update checksum for {script_path}")
print(f"Updated checksum written to {SCRIPT_CHECKSUM_FILE}")

View File

@@ -20,9 +20,9 @@ from termcolor import colored
from utils.color_scheme import color_text
import traceback
from password_manager.manager import PasswordManager
from seedpass.core.manager import PasswordManager
from nostr.client import NostrClient
from password_manager.entry_types import EntryType
from seedpass.core.entry_types import EntryType
from constants import INACTIVITY_TIMEOUT, initialize_app
from utils.password_prompt import PasswordPromptError
from utils import (

View File

@@ -26,12 +26,12 @@ from nostr_sdk import EventId, Timestamp
from .key_manager import KeyManager as SeedPassKeyManager
from .backup_models import Manifest, ChunkMeta, KIND_MANIFEST, KIND_SNAPSHOT_CHUNK
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from constants import MAX_RETRIES, RETRY_DELAY
from utils.file_lock import exclusive_lock
if TYPE_CHECKING: # pragma: no cover - imported for type hints
from password_manager.config_manager import ConfigManager
from seedpass.core.config_manager import ConfigManager
# Backwards compatibility for tests that patch these symbols
KeyManager = SeedPassKeyManager
@@ -295,8 +295,8 @@ class NostrClient:
if retries is None or delay is None:
if self.config_manager is None:
from password_manager.config_manager import ConfigManager
from password_manager.vault import Vault
from seedpass.core.config_manager import ConfigManager
from seedpass.core.vault import Vault
cfg_mgr = ConfigManager(
Vault(self.encryption_manager, self.fingerprint_dir),

View File

@@ -14,8 +14,8 @@ import asyncio
import sys
from fastapi.middleware.cors import CORSMiddleware
from password_manager.manager import PasswordManager
from password_manager.entry_types import EntryType
from seedpass.core.manager import PasswordManager
from seedpass.core.entry_types import EntryType
app = FastAPI()

View File

@@ -4,8 +4,8 @@ import json
import typer
from password_manager.manager import PasswordManager
from password_manager.entry_types import EntryType
from seedpass.core.manager import PasswordManager
from seedpass.core.entry_types import EntryType
import uvicorn
from . import api as api_module

View File

@@ -1,4 +1,4 @@
# password_manager/__init__.py
# seedpass.core/__init__.py
"""Expose password manager components with lazy imports."""

View File

@@ -1,4 +1,4 @@
# password_manager/backup.py
# seedpass.core/backup.py
"""
Backup Manager Module
@@ -19,7 +19,7 @@ import traceback
from pathlib import Path
from termcolor import colored
from password_manager.config_manager import ConfigManager
from .config_manager import ConfigManager
from utils.file_lock import exclusive_lock
from constants import APP_DIR

View File

@@ -10,7 +10,7 @@ from utils.seed_prompt import masked_input
import bcrypt
from password_manager.vault import Vault
from .vault import Vault
from nostr.client import DEFAULT_RELAYS as DEFAULT_NOSTR_RELAYS
from constants import INACTIVITY_TIMEOUT
@@ -251,7 +251,7 @@ class ConfigManager:
# Password policy settings
def get_password_policy(self) -> "PasswordPolicy":
"""Return the password complexity policy."""
from password_manager.password_generation import PasswordPolicy
from .password_generation import PasswordPolicy
cfg = self.load_config(require_pin=False)
return PasswordPolicy(

View File

@@ -1,4 +1,4 @@
# /src/password_manager/encryption.py
# /src/seedpass.core/encryption.py
import logging
import traceback

View File

@@ -1,4 +1,4 @@
# password_manager/entry_management.py
# seedpass.core/entry_management.py
"""
Entry Management Module
@@ -31,14 +31,14 @@ from typing import Optional, Tuple, Dict, Any, List
from pathlib import Path
from termcolor import colored
from password_manager.migrations import LATEST_VERSION
from password_manager.entry_types import EntryType
from password_manager.totp import TotpManager
from .migrations import LATEST_VERSION
from .entry_types import EntryType
from .totp import TotpManager
from utils.fingerprint import generate_fingerprint
from utils.checksum import canonical_json_dumps
from password_manager.vault import Vault
from password_manager.backup import BackupManager
from .vault import Vault
from .backup import BackupManager
# Instantiate the logger
@@ -312,7 +312,7 @@ class EntryManager:
if not entry or (etype != EntryType.SSH.value and kind != EntryType.SSH.value):
raise ValueError("Entry is not an SSH key entry")
from password_manager.password_generation import derive_ssh_key_pair
from .password_generation import derive_ssh_key_pair
key_index = int(entry.get("index", index))
return derive_ssh_key_pair(parent_seed, key_index)
@@ -360,7 +360,7 @@ class EntryManager:
if not entry or (etype != EntryType.PGP.value and kind != EntryType.PGP.value):
raise ValueError("Entry is not a PGP key entry")
from password_manager.password_generation import derive_pgp_key
from .password_generation import derive_pgp_key
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator
@@ -501,7 +501,7 @@ class EntryManager:
):
raise ValueError("Entry is not a seed entry")
from password_manager.password_generation import derive_seed_phrase
from .password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator
@@ -530,7 +530,7 @@ class EntryManager:
if index is None:
index = self.get_next_index()
from password_manager.password_generation import derive_seed_phrase
from .password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator
@@ -576,7 +576,7 @@ class EntryManager:
):
raise ValueError("Entry is not a managed account entry")
from password_manager.password_generation import derive_seed_phrase
from .password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator

View File

@@ -1,4 +1,4 @@
# password_manager/entry_types.py
# seedpass.core/entry_types.py
"""Enumerations for entry types used by SeedPass."""
from enum import Enum

View File

@@ -1,4 +1,4 @@
# password_manager/manager.py
# seedpass.core/manager.py
"""
Password Manager Module
@@ -25,14 +25,14 @@ from termcolor import colored
from utils.color_scheme import color_text
from utils.input_utils import timed_input
from password_manager.encryption import EncryptionManager
from password_manager.entry_management import EntryManager
from password_manager.password_generation import PasswordGenerator
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.portable_backup import export_backup, import_backup
from password_manager.totp import TotpManager
from password_manager.entry_types import EntryType
from .encryption import EncryptionManager
from .entry_management import EntryManager
from .password_generation import PasswordGenerator
from .backup import BackupManager
from .vault import Vault
from .portable_backup import export_backup, import_backup
from .totp import TotpManager
from .entry_types import EntryType
from utils.key_derivation import (
derive_key_from_parent_seed,
derive_key_from_password,
@@ -64,7 +64,7 @@ from utils.terminal_utils import (
)
from utils.fingerprint import generate_fingerprint
from constants import MIN_HEALTHY_RELAYS
from password_manager.migrations import LATEST_VERSION
from .migrations import LATEST_VERSION
from constants import (
APP_DIR,
@@ -94,7 +94,7 @@ from utils.fingerprint_manager import FingerprintManager
# Import NostrClient
from nostr.client import NostrClient, DEFAULT_RELAYS
from password_manager.config_manager import ConfigManager
from .config_manager import ConfigManager
# Instantiate the logger
logger = logging.getLogger(__name__)
@@ -1579,7 +1579,7 @@ class PasswordManager:
print(colored("Seed Phrase:", "cyan"))
print(color_text(phrase, "deterministic"))
if confirm_action("Show Compact Seed QR? (Y/N): "):
from password_manager.seedqr import encode_seedqr
from .seedqr import encode_seedqr
TotpManager.print_qr_code(encode_seedqr(phrase))
try:
@@ -1841,7 +1841,7 @@ class PasswordManager:
else:
print(color_text(seed, "deterministic"))
if confirm_action("Show Compact Seed QR? (Y/N): "):
from password_manager.seedqr import encode_seedqr
from .seedqr import encode_seedqr
TotpManager.print_qr_code(encode_seedqr(seed))
try:
@@ -2075,7 +2075,7 @@ class PasswordManager:
)
print(color_text(seed, "deterministic"))
from password_manager.seedqr import encode_seedqr
from .seedqr import encode_seedqr
TotpManager.print_qr_code(encode_seedqr(seed))
pause()

View File

@@ -1,4 +1,4 @@
# password_manager/password_generation.py
# seedpass.core/password_generation.py
"""
Password Generation Module
@@ -43,7 +43,7 @@ except ModuleNotFoundError: # pragma: no cover - fallback for removed module
from local_bip85.bip85 import BIP85
from constants import DEFAULT_PASSWORD_LENGTH, MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH
from password_manager.encryption import EncryptionManager
from .encryption import EncryptionManager
# Instantiate the logger
logger = logging.getLogger(__name__)

View File

@@ -12,14 +12,14 @@ import asyncio
from enum import Enum
from pathlib import Path
from password_manager.vault import Vault
from password_manager.backup import BackupManager
from .vault import Vault
from .backup import BackupManager
from nostr.client import NostrClient
from utils.key_derivation import (
derive_index_key,
EncryptionMode,
)
from password_manager.encryption import EncryptionManager
from .encryption import EncryptionManager
from utils.checksum import json_checksum, canonical_json_dumps
logger = logging.getLogger(__name__)

View File

@@ -5,8 +5,8 @@ from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.vault import Vault
from password_manager.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.encryption import EncryptionManager
from utils.key_derivation import (
derive_index_key,
derive_key_from_password,

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator:

View File

@@ -4,9 +4,9 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_entry_manager_additional_backup(monkeypatch):

View File

@@ -8,10 +8,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator:

View File

@@ -6,9 +6,9 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def setup_entry_mgr(tmp_path: Path) -> EntryManager:

View File

@@ -10,10 +10,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.manager import PasswordManager, EncryptionMode
def setup_entry_mgr(tmp_path: Path) -> EntryManager:

View File

@@ -6,7 +6,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager
from seedpass.core.manager import PasswordManager
from constants import MIN_HEALTHY_RELAYS

View File

@@ -4,8 +4,8 @@ from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager
import password_manager.manager as manager_module
from seedpass.core.manager import PasswordManager
import seedpass.core.manager as manager_module
def test_switch_fingerprint_triggers_bg_sync(monkeypatch, tmp_path):
@@ -23,16 +23,14 @@ def test_switch_fingerprint_triggers_bg_sync(monkeypatch, tmp_path):
monkeypatch.setattr("builtins.input", lambda *_a, **_k: "1")
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_a, **_k: "pw"
"seedpass.core.manager.prompt_existing_password", lambda *_a, **_k: "pw"
)
monkeypatch.setattr(
PasswordManager, "setup_encryption_manager", lambda *a, **k: True
)
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda *a, **k: None)
monkeypatch.setattr(PasswordManager, "initialize_managers", lambda *a, **k: None)
monkeypatch.setattr(
"password_manager.manager.NostrClient", lambda *a, **kw: object()
)
monkeypatch.setattr("seedpass.core.manager.NostrClient", lambda *a, **kw: object())
calls = {"count": 0}

View File

@@ -4,8 +4,8 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_backup_interval(monkeypatch):

View File

@@ -8,8 +8,8 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_backup_restore_workflow(monkeypatch):

View File

@@ -5,7 +5,7 @@ import pytest
sys.path.append(str(Path(__file__).resolve().parents[1]))
from local_bip85.bip85 import BIP85, Bip85Error
from password_manager.password_generation import (
from seedpass.core.password_generation import (
derive_ssh_key,
derive_seed_phrase,
)

View File

@@ -8,7 +8,7 @@ sys.path.append(str(Path(__file__).resolve().parents[1] / "src"))
from typer.testing import CliRunner
from seedpass import cli
from password_manager.entry_types import EntryType
from seedpass.core.entry_types import EntryType
class DummyPM:

View File

@@ -6,9 +6,9 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
import main
from password_manager.portable_backup import export_backup, import_backup
from password_manager.config_manager import ConfigManager
from password_manager.backup import BackupManager
from seedpass.core.portable_backup import export_backup, import_backup
from seedpass.core.config_manager import ConfigManager
from seedpass.core.backup import BackupManager
from helpers import create_vault, TEST_SEED

View File

@@ -5,7 +5,7 @@ from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
import main
from password_manager.entry_types import EntryType
from seedpass.core.entry_types import EntryType
def make_pm(search_results, entry=None, totp_code="123456"):

View File

@@ -6,10 +6,10 @@ from helpers import TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from utils.key_derivation import derive_index_key, derive_key_from_password

View File

@@ -7,8 +7,8 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.config_manager import ConfigManager
from password_manager.vault import Vault
from seedpass.core.config_manager import ConfigManager
from seedpass.core.vault import Vault
from nostr.client import DEFAULT_RELAYS
from constants import INACTIVITY_TIMEOUT

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
def test_retrieve_entry_shows_custom_fields(monkeypatch, capsys):

View File

@@ -6,7 +6,7 @@ sys.path.append(str(Path(__file__).resolve().parents[1]))
from types import SimpleNamespace
from pathlib import Path
from password_manager.manager import PasswordManager
from seedpass.core.manager import PasswordManager
from utils.key_derivation import EncryptionMode

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator:

View File

@@ -8,7 +8,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from utils.checksum import verify_and_update_checksum

View File

@@ -8,7 +8,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
def test_json_save_and_load_round_trip():

View File

@@ -5,10 +5,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
def test_list_entries_empty():

View File

@@ -8,10 +8,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
def test_add_and_retrieve_entry():

View File

@@ -5,10 +5,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
def test_update_checksum_writes_to_expected_path():

View File

@@ -8,11 +8,11 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from password_manager.totp import TotpManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
from seedpass.core.totp import TotpManager
class FakeNostrClient:
@@ -42,9 +42,7 @@ def test_handle_export_totp_codes(monkeypatch, tmp_path):
export_path = tmp_path / "out.json"
monkeypatch.setattr("builtins.input", lambda *a, **k: str(export_path))
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *_a, **_k: False
)
monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *_a, **_k: False)
pm.handle_export_totp_codes()

View File

@@ -9,7 +9,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.fingerprint import generate_fingerprint
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
def test_generate_fingerprint_deterministic():

View File

@@ -4,10 +4,10 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.manager import PasswordManager, EncryptionMode
def _init_pm(dir_path: Path, client) -> PasswordManager:

View File

@@ -4,10 +4,10 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.manager import PasswordManager, EncryptionMode
def _init_pm(dir_path: Path, client) -> PasswordManager:

View File

@@ -9,7 +9,7 @@ from utils.key_derivation import (
derive_key_from_password_argon2,
derive_index_key,
)
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
cfg_values = st.one_of(

View File

@@ -3,9 +3,9 @@ from tempfile import TemporaryDirectory
from unittest.mock import patch
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_index_caching():

View File

@@ -7,8 +7,8 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from utils.key_derivation import derive_index_key, derive_key_from_password
SEED = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"

View File

@@ -8,10 +8,10 @@ from utils.key_derivation import (
derive_key_from_password_argon2,
derive_index_key,
)
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
from seedpass.core.manager import PasswordManager, EncryptionMode
TEST_SEED = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
TEST_PASSWORD = "pw"
@@ -59,12 +59,12 @@ def test_setup_encryption_manager_kdf_modes(monkeypatch):
cfg = _setup_profile(path, mode)
pm = _make_pm(path, cfg)
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password",
"seedpass.core.manager.prompt_existing_password",
lambda *_: TEST_PASSWORD,
)
if mode == "argon2":
monkeypatch.setattr(
"password_manager.manager.derive_key_from_password_argon2",
"seedpass.core.manager.derive_key_from_password_argon2",
lambda pw: derive_key_from_password_argon2(pw, **argon_kwargs),
)
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda self: None)

View File

@@ -6,9 +6,9 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def setup_entry_mgr(tmp_path: Path) -> EntryManager:

View File

@@ -3,9 +3,9 @@ from pathlib import Path
from tempfile import TemporaryDirectory
import constants
import password_manager.manager as manager_module
import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager
from password_manager.manager import EncryptionMode
from seedpass.core.manager import EncryptionMode
from helpers import TEST_SEED

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.entry_types import EntryType
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.entry_types import EntryType
def setup_entry_manager(tmp_path: Path) -> EntryManager:

View File

@@ -4,14 +4,14 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from utils.fingerprint import generate_fingerprint
import password_manager.manager as manager_module
from password_manager.manager import EncryptionMode
import seedpass.core.manager as manager_module
from seedpass.core.manager import EncryptionMode
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def setup_entry_manager(tmp_path: Path) -> EntryManager:

View File

@@ -4,15 +4,15 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from utils.fingerprint import generate_fingerprint
import password_manager.manager as manager_module
from password_manager.manager import EncryptionMode
import seedpass.core.manager as manager_module
from seedpass.core.manager import EncryptionMode
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.password_generation import derive_seed_phrase
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakeNostrClient:

View File

@@ -3,7 +3,7 @@ from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.manager import PasswordManager, EncryptionMode
import queue
@@ -29,8 +29,8 @@ def test_handle_verify_checksum_success(monkeypatch, tmp_path, capsys):
pm = _make_pm()
chk_file = tmp_path / "chk.txt"
chk_file.write_text("abc")
monkeypatch.setattr("password_manager.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("password_manager.manager.calculate_checksum", lambda _: "abc")
monkeypatch.setattr("seedpass.core.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("seedpass.core.manager.calculate_checksum", lambda _: "abc")
pm.handle_verify_checksum()
out = capsys.readouterr().out
assert "Checksum verification passed." in out
@@ -40,8 +40,8 @@ def test_handle_verify_checksum_failure(monkeypatch, tmp_path, capsys):
pm = _make_pm()
chk_file = tmp_path / "chk.txt"
chk_file.write_text("xyz")
monkeypatch.setattr("password_manager.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("password_manager.manager.calculate_checksum", lambda _: "abc")
monkeypatch.setattr("seedpass.core.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("seedpass.core.manager.calculate_checksum", lambda _: "abc")
pm.handle_verify_checksum()
out = capsys.readouterr().out
assert "Checksum verification failed" in out
@@ -50,13 +50,13 @@ def test_handle_verify_checksum_failure(monkeypatch, tmp_path, capsys):
def test_handle_verify_checksum_missing(monkeypatch, tmp_path, capsys):
pm = _make_pm()
chk_file = tmp_path / "chk.txt"
monkeypatch.setattr("password_manager.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("password_manager.manager.calculate_checksum", lambda _: "abc")
monkeypatch.setattr("seedpass.core.manager.SCRIPT_CHECKSUM_FILE", chk_file)
monkeypatch.setattr("seedpass.core.manager.calculate_checksum", lambda _: "abc")
def raise_missing(*_args, **_kwargs):
raise FileNotFoundError
monkeypatch.setattr("password_manager.manager.verify_checksum", raise_missing)
monkeypatch.setattr("seedpass.core.manager.verify_checksum", raise_missing)
pm.handle_verify_checksum()
note = pm.notifications.get_nowait()
assert note.level == "WARNING"

View File

@@ -5,7 +5,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager, Notification
from seedpass.core.manager import PasswordManager, Notification
from constants import NOTIFICATION_DURATION
@@ -20,7 +20,7 @@ def _make_pm():
def test_notify_sets_current(monkeypatch):
pm = _make_pm()
current = {"val": 100.0}
monkeypatch.setattr("password_manager.manager.time.time", lambda: current["val"])
monkeypatch.setattr("seedpass.core.manager.time.time", lambda: current["val"])
pm.notify("hello")
note = pm._current_notification
assert hasattr(note, "message")
@@ -32,7 +32,7 @@ def test_notify_sets_current(monkeypatch):
def test_get_current_notification_ttl(monkeypatch):
pm = _make_pm()
now = {"val": 0.0}
monkeypatch.setattr("password_manager.manager.time.time", lambda: now["val"])
monkeypatch.setattr("seedpass.core.manager.time.time", lambda: now["val"])
pm.notify("note1")
assert pm.get_current_notification().message == "note1"

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakeNostrClient:
@@ -50,7 +50,7 @@ def test_handle_display_totp_codes(monkeypatch, capsys):
# interrupt the loop after first iteration
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
)
@@ -91,7 +91,7 @@ def test_display_totp_codes_excludes_archived(monkeypatch, capsys):
)
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
)

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakeNostrClient:
@@ -49,8 +49,8 @@ def test_edit_totp_period_from_retrieve(monkeypatch):
monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1
)
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("password_manager.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
pm.handle_retrieve_entry()
entry = entry_mgr.retrieve_entry(0)

View File

@@ -10,11 +10,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.entry_types import EntryType
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_types import EntryType
from seedpass.core.config_manager import ConfigManager
def test_handle_list_entries(monkeypatch, capsys):
@@ -79,9 +79,9 @@ def test_list_entries_show_details(monkeypatch, capsys):
monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1
)
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: "b",
)
@@ -119,7 +119,7 @@ def test_show_entry_details_by_index(monkeypatch):
header_calls = []
monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification",
"seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: header_calls.append(True),
)
@@ -134,9 +134,9 @@ def test_show_entry_details_by_index(monkeypatch):
"_entry_actions_menu",
lambda *a, **k: call_order.append("actions"),
)
monkeypatch.setattr("password_manager.manager.pause", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.pause", lambda *a, **k: None)
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: False
"seedpass.core.manager.confirm_action", lambda *a, **k: False
)
pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
monkeypatch.setattr(pm, "notify", lambda *a, **k: None)
@@ -168,16 +168,14 @@ def _setup_manager(tmp_path):
def _detail_common(monkeypatch, pm):
monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification",
"seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: None,
)
monkeypatch.setattr("password_manager.manager.pause", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.pause", lambda *a, **k: None)
monkeypatch.setattr("builtins.input", lambda *a, **k: "")
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: False
)
monkeypatch.setattr("password_manager.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *a, **k: False)
monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr(pm, "notify", lambda *a, **k: None)
pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
called = []
@@ -300,21 +298,21 @@ def test_show_entry_details_sensitive(monkeypatch, capsys, entry_type):
pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: True
"seedpass.core.manager.confirm_action", lambda *a, **k: True
)
monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard", lambda *a, **k: None
"seedpass.core.manager.copy_to_clipboard", lambda *a, **k: None
)
monkeypatch.setattr("password_manager.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code", lambda *a, **k: None
"seedpass.core.manager.TotpManager.print_qr_code", lambda *a, **k: None
)
monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification",
"seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: None,
)
monkeypatch.setattr("password_manager.manager.pause", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.pause", lambda *a, **k: None)
input_val = "r" if entry_type == "managed_account" else ""
monkeypatch.setattr("builtins.input", lambda *a, **k: input_val)

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode, TotpManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode, TotpManager
from seedpass.core.config_manager import ConfigManager
class FakeNostrClient:
@@ -49,9 +49,9 @@ def test_handle_retrieve_totp_entry(monkeypatch, capsys):
monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1
)
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: "b",
)

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
def test_search_entries_prompt_for_details(monkeypatch, capsys):
@@ -38,8 +38,8 @@ def test_search_entries_prompt_for_details(monkeypatch, capsys):
monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1
)
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("password_manager.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
inputs = iter(["Example", "0"])
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))

View File

@@ -1,6 +1,6 @@
import builtins
from mnemonic import Mnemonic
from password_manager.manager import PasswordManager
from seedpass.core.manager import PasswordManager
from utils import seed_prompt
@@ -28,7 +28,7 @@ def test_setup_existing_seed_words(monkeypatch):
words = phrase.split()
word_iter = iter(words)
monkeypatch.setattr(
"password_manager.manager.masked_input",
"seedpass.core.manager.masked_input",
lambda *_: next(word_iter),
)
# Ensure prompt_seed_words uses the patched function
@@ -52,7 +52,7 @@ def test_setup_existing_seed_paste(monkeypatch):
called["prompt"] = prompt
return phrase
monkeypatch.setattr("password_manager.manager.masked_input", fake_masked_input)
monkeypatch.setattr("seedpass.core.manager.masked_input", fake_masked_input)
monkeypatch.setattr(
builtins,
"input",

View File

@@ -5,11 +5,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.config_manager import ConfigManager
from seedpass.core.config_manager import ConfigManager
def _make_pm(tmp_path: Path) -> PasswordManager:
@@ -34,9 +34,9 @@ def _make_pm(tmp_path: Path) -> PasswordManager:
def test_handle_search_entries_no_query(monkeypatch, tmp_path):
pm = _make_pm(tmp_path)
monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification", lambda *a, **k: None
"seedpass.core.manager.clear_header_with_notification", lambda *a, **k: None
)
monkeypatch.setattr("password_manager.manager.pause", lambda: None)
monkeypatch.setattr("seedpass.core.manager.pause", lambda: None)
monkeypatch.setattr("builtins.input", lambda *_: "")
pm.handle_search_entries()

View File

@@ -5,11 +5,11 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.vault import Vault
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.vault import Vault
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator:
@@ -34,7 +34,7 @@ def test_manager_workflow(monkeypatch):
backup_mgr = BackupManager(tmp_path, cfg_mgr)
entry_mgr = EntryManager(vault, backup_mgr)
monkeypatch.setattr("password_manager.manager.NostrClient", FakeNostrClient)
monkeypatch.setattr("seedpass.core.manager.NostrClient", FakeNostrClient)
pm = PasswordManager.__new__(PasswordManager)
pm.encryption_mode = EncryptionMode.SEED_ONLY

View File

@@ -5,7 +5,7 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.migrations import LATEST_VERSION
from seedpass.core.migrations import LATEST_VERSION
def setup(tmp_path: Path):

View File

@@ -1,9 +1,9 @@
from helpers import create_vault, TEST_SEED, TEST_PASSWORD
import pytest
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_modify_totp_entry_period_digits_and_archive(tmp_path):

View File

@@ -3,7 +3,7 @@ from pathlib import Path
from tempfile import TemporaryDirectory
import constants
import password_manager.manager as manager_module
import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager
from helpers import TEST_SEED

View File

@@ -4,9 +4,9 @@ from pathlib import Path
from tempfile import TemporaryDirectory
import constants
import password_manager.manager as manager_module
import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager
from password_manager.config_manager import ConfigManager
from seedpass.core.config_manager import ConfigManager
from tests.helpers import TEST_SEED, TEST_PASSWORD, create_vault

View File

@@ -7,10 +7,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
from nostr.client import NostrClient

View File

@@ -9,7 +9,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from nostr.client import NostrClient
import nostr.client as nostr_client

View File

@@ -8,7 +8,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from nostr.client import NostrClient, Manifest

View File

@@ -3,9 +3,9 @@ import gzip
import math
from helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from nostr.client import prepare_snapshot
from nostr.backup_models import KIND_SNAPSHOT_CHUNK

View File

@@ -8,10 +8,10 @@ from nostr.coincurve_keys import Keys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
def test_nostr_key_determinism():

View File

@@ -15,11 +15,11 @@ import os
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.config_manager import ConfigManager
from seedpass.core.encryption import EncryptionManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.config_manager import ConfigManager
from nostr.client import NostrClient, Kind, KindStandard

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode, TotpManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode, TotpManager
from seedpass.core.config_manager import ConfigManager
from utils.color_scheme import color_text
@@ -49,7 +49,7 @@ def test_show_qr_for_nostr_keys(monkeypatch):
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = []
monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code",
"seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data),
)
@@ -85,7 +85,7 @@ def test_show_private_key_qr(monkeypatch, capsys):
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = []
monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code",
"seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data),
)
@@ -130,7 +130,7 @@ def test_qr_menu_case_insensitive(monkeypatch):
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = []
monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code",
"seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data),
)

View File

@@ -13,7 +13,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from nostr.client import NostrClient

View File

@@ -9,7 +9,7 @@ import asyncio
from unittest.mock import patch
from nostr import prepare_snapshot, NostrClient
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
def test_prepare_snapshot_roundtrip():

View File

@@ -1,7 +1,7 @@
import time
from types import SimpleNamespace
from password_manager.manager import PasswordManager
from seedpass.core.manager import PasswordManager
def test_sync_vault_skips_network(monkeypatch):

View File

@@ -6,7 +6,7 @@ import queue
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.manager import PasswordManager, EncryptionMode
from constants import DEFAULT_SEED_BACKUP_FILENAME
@@ -25,11 +25,11 @@ def test_handle_backup_reveal_parent_seed_confirm(monkeypatch, tmp_path, capsys)
pm = _make_pm(tmp_path)
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "pw"
"seedpass.core.manager.prompt_existing_password", lambda *_: "pw"
)
confirms = iter([True, True])
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *_a, **_k: next(confirms)
"seedpass.core.manager.confirm_action", lambda *_a, **_k: next(confirms)
)
saved = []
@@ -51,11 +51,9 @@ def test_handle_backup_reveal_parent_seed_cancel(monkeypatch, tmp_path, capsys):
pm = _make_pm(tmp_path)
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "pw"
)
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *_a, **_k: False
"seedpass.core.manager.prompt_existing_password", lambda *_: "pw"
)
monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *_a, **_k: False)
saved = []
pm.encryption_manager = SimpleNamespace(
encrypt_and_save_file=lambda data, path: saved.append((data, path))

View File

@@ -8,11 +8,11 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.config_manager import ConfigManager
from password_manager.backup import BackupManager
from password_manager.vault import Vault
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.entry_management import EntryManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.backup import BackupManager
from seedpass.core.vault import Vault
from seedpass.core.manager import PasswordManager, EncryptionMode
def test_change_password_triggers_nostr_backup(monkeypatch):
@@ -37,13 +37,11 @@ def test_change_password_triggers_nostr_backup(monkeypatch):
pm.verify_password = lambda pw: True
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "old"
)
monkeypatch.setattr(
"password_manager.manager.prompt_for_password", lambda: "new"
"seedpass.core.manager.prompt_existing_password", lambda *_: "old"
)
monkeypatch.setattr("seedpass.core.manager.prompt_for_password", lambda: "new")
with patch("password_manager.manager.NostrClient") as MockClient:
with patch("seedpass.core.manager.NostrClient") as MockClient:
mock_instance = MockClient.return_value
mock_instance.publish_snapshot = AsyncMock(return_value=(None, "abcd"))
pm.nostr_client = mock_instance

View File

@@ -4,7 +4,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.password_generation import PasswordGenerator, PasswordPolicy
from seedpass.core.password_generation import PasswordGenerator, PasswordPolicy
class DummyEnc:

View File

@@ -1,5 +1,5 @@
import string
from password_manager.password_generation import PasswordGenerator, PasswordPolicy
from seedpass.core.password_generation import PasswordGenerator, PasswordPolicy
class DummyEnc:

View File

@@ -4,7 +4,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.password_generation import PasswordGenerator, PasswordPolicy
from seedpass.core.password_generation import PasswordGenerator, PasswordPolicy
from constants import MIN_PASSWORD_LENGTH

View File

@@ -5,8 +5,8 @@ from hypothesis import given, strategies as st, settings
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.password_generation import PasswordGenerator, PasswordPolicy
from password_manager.entry_types import EntryType
from seedpass.core.password_generation import PasswordGenerator, PasswordPolicy
from seedpass.core.entry_types import EntryType
class DummyEnc:

View File

@@ -7,12 +7,12 @@ import bcrypt
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from utils.key_derivation import derive_index_key, derive_key_from_password
SEED = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
@@ -61,13 +61,11 @@ def test_password_change_and_unlock(monkeypatch):
)
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: old_pw
"seedpass.core.manager.prompt_existing_password", lambda *_: old_pw
)
monkeypatch.setattr("seedpass.core.manager.prompt_for_password", lambda: new_pw)
monkeypatch.setattr(
"password_manager.manager.prompt_for_password", lambda: new_pw
)
monkeypatch.setattr(
"password_manager.manager.NostrClient",
"seedpass.core.manager.NostrClient",
lambda *a, **kw: SimpleNamespace(
publish_snapshot=lambda *a, **k: (None, "abcd")
),
@@ -77,7 +75,7 @@ def test_password_change_and_unlock(monkeypatch):
pm.lock_vault()
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: new_pw
"seedpass.core.manager.prompt_existing_password", lambda *_: new_pw
)
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda self: None)
monkeypatch.setattr(PasswordManager, "initialize_managers", lambda self: None)

View File

@@ -6,9 +6,9 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def test_pgp_key_determinism():

View File

@@ -9,11 +9,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.vault import Vault
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.portable_backup import export_backup, import_backup
from seedpass.core.encryption import EncryptionManager
from seedpass.core.vault import Vault
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.portable_backup import export_backup, import_backup
from utils.key_derivation import derive_index_key, derive_key_from_password

View File

@@ -11,7 +11,7 @@ sys.path.append(str(Path(__file__).resolve().parents[1]))
def setup_pm(tmp_path):
import constants
import password_manager.manager as manager_module
import seedpass.core.manager as manager_module
importlib.reload(constants)
importlib.reload(manager_module)
@@ -30,7 +30,7 @@ def test_generate_seed_cleanup_on_failure(monkeypatch):
pm, const, mgr = setup_pm(tmp_path)
with patch("password_manager.manager.confirm_action", return_value=True):
with patch("seedpass.core.manager.confirm_action", return_value=True):
monkeypatch.setattr(
pm,
"save_and_encrypt_seed",

View File

@@ -3,7 +3,7 @@ import importlib.util
from pathlib import Path
from tempfile import TemporaryDirectory
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.manager import PasswordManager, EncryptionMode
def load_script():
@@ -33,7 +33,7 @@ def test_initialize_profile_and_manager(monkeypatch):
pm.current_fingerprint = fingerprint
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password",
"seedpass.core.manager.prompt_existing_password",
lambda *_: gtp.DEFAULT_PASSWORD,
)
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda self: None)

View File

@@ -11,12 +11,12 @@ sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.fingerprint_manager import FingerprintManager
import constants
import password_manager.manager as manager_module
from password_manager.vault import Vault
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import EncryptionMode
from password_manager.config_manager import ConfigManager
import seedpass.core.manager as manager_module
from seedpass.core.vault import Vault
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import EncryptionMode
from seedpass.core.config_manager import ConfigManager
def test_add_and_delete_entry(monkeypatch):

View File

@@ -5,7 +5,7 @@ from tempfile import TemporaryDirectory
sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.fingerprint_manager import FingerprintManager
from password_manager.manager import PasswordManager, EncryptionMode
from seedpass.core.manager import PasswordManager, EncryptionMode
from helpers import create_vault, dummy_nostr_client
import gzip
from nostr.backup_models import Manifest, ChunkMeta
@@ -32,7 +32,7 @@ def test_add_and_switch_fingerprint(monkeypatch):
monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "1")
monkeypatch.setattr(
"password_manager.manager.prompt_existing_password",
"seedpass.core.manager.prompt_existing_password",
lambda *_a, **_k: "pass",
)
monkeypatch.setattr(
@@ -47,7 +47,7 @@ def test_add_and_switch_fingerprint(monkeypatch):
PasswordManager, "sync_index_from_nostr_if_missing", lambda self: None
)
monkeypatch.setattr(
"password_manager.manager.NostrClient", lambda *a, **kw: object()
"seedpass.core.manager.NostrClient", lambda *a, **kw: object()
)
assert pm.handle_switch_fingerprint()

View File

@@ -9,7 +9,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from seedpass.core.encryption import EncryptionManager
from nostr.client import NostrClient, Manifest

View File

@@ -6,10 +6,10 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
import pytest
@@ -45,13 +45,13 @@ def test_pause_before_entry_actions(monkeypatch, adder, needs_confirm):
pause_calls = []
monkeypatch.setattr(
"password_manager.manager.pause", lambda *a, **k: pause_calls.append(True)
"seedpass.core.manager.pause", lambda *a, **k: pause_calls.append(True)
)
monkeypatch.setattr(pm, "_entry_actions_menu", lambda *a, **k: None)
monkeypatch.setattr("builtins.input", lambda *a, **k: str(index))
if needs_confirm:
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: True
"seedpass.core.manager.confirm_action", lambda *a, **k: True
)
pm.handle_retrieve_entry()

View File

@@ -6,9 +6,9 @@ from helpers import create_vault, TEST_SEED, TEST_PASSWORD
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
def setup_entry_manager(tmp_path: Path) -> EntryManager:

View File

@@ -8,10 +8,10 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.manager import PasswordManager, EncryptionMode
from seedpass.core.config_manager import ConfigManager
def setup_pm(tmp_path):
@@ -45,7 +45,7 @@ def test_password_retrieve_secret_mode(monkeypatch, capsys):
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = []
monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard",
"seedpass.core.manager.copy_to_clipboard",
lambda text, t: called.append((text, t)),
)
@@ -67,12 +67,12 @@ def test_totp_display_secret_mode(monkeypatch, capsys):
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 30
)
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
)
called = []
monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard",
"seedpass.core.manager.copy_to_clipboard",
lambda text, t: called.append((text, t)),
)
@@ -94,7 +94,7 @@ def test_password_retrieve_no_secret_mode(monkeypatch, capsys):
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = []
monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard",
"seedpass.core.manager.copy_to_clipboard",
lambda *a, **k: called.append((a, k)),
)
@@ -117,12 +117,12 @@ def test_totp_display_no_secret_mode(monkeypatch, capsys):
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 30
)
monkeypatch.setattr(
"password_manager.manager.timed_input",
"seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
)
called = []
monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard",
"seedpass.core.manager.copy_to_clipboard",
lambda *a, **k: called.append((a, k)),
)

View File

@@ -7,10 +7,10 @@ from mnemonic import Mnemonic
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager
from password_manager.backup import BackupManager
from password_manager.config_manager import ConfigManager
from password_manager.password_generation import derive_seed_phrase
from seedpass.core.entry_management import EntryManager
from seedpass.core.backup import BackupManager
from seedpass.core.config_manager import ConfigManager
from seedpass.core.password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator

View File

@@ -10,7 +10,7 @@ sys.path.append(str(Path(__file__).resolve().parents[1]))
def setup_password_manager():
"""Instantiate PasswordManager using a temporary APP_DIR without running __init__."""
import constants
import password_manager.manager as manager_module
import seedpass.core.manager as manager_module
# Reload modules so constants use the mocked home directory
importlib.reload(constants)
@@ -34,7 +34,7 @@ def test_generate_bip85_and_new_seed(monkeypatch):
mnemonic = pm.generate_bip85_seed()
assert len(mnemonic.split()) == 12
with patch("password_manager.manager.confirm_action", return_value=True):
with patch("seedpass.core.manager.confirm_action", return_value=True):
fingerprint = pm.generate_new_seed()
expected_dir = const.APP_DIR / fingerprint

Some files were not shown because too many files have changed in this diff Show More