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 constants import APP_DIR, initialize_app
from utils.key_derivation import derive_key_from_password, derive_index_key from utils.key_derivation import derive_key_from_password, derive_index_key
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from nostr.client import NostrClient from nostr.client import NostrClient
from utils.fingerprint import generate_fingerprint from utils.fingerprint import generate_fingerprint
from utils.fingerprint_manager import FingerprintManager from utils.fingerprint_manager import FingerprintManager

View File

@@ -14,7 +14,7 @@ from constants import SCRIPT_CHECKSUM_FILE, initialize_app
def main() -> None: def main() -> None:
"""Calculate checksum for the main script and write it to SCRIPT_CHECKSUM_FILE.""" """Calculate checksum for the main script and write it to SCRIPT_CHECKSUM_FILE."""
initialize_app() 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)): if not update_checksum_file(str(script_path), str(SCRIPT_CHECKSUM_FILE)):
raise SystemExit(f"Failed to update checksum for {script_path}") raise SystemExit(f"Failed to update checksum for {script_path}")
print(f"Updated checksum written to {SCRIPT_CHECKSUM_FILE}") 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 from utils.color_scheme import color_text
import traceback import traceback
from password_manager.manager import PasswordManager from seedpass.core.manager import PasswordManager
from nostr.client import NostrClient 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 constants import INACTIVITY_TIMEOUT, initialize_app
from utils.password_prompt import PasswordPromptError from utils.password_prompt import PasswordPromptError
from utils import ( from utils import (

View File

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

View File

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

View File

@@ -4,8 +4,8 @@ import json
import typer import typer
from password_manager.manager import PasswordManager from seedpass.core.manager import PasswordManager
from password_manager.entry_types import EntryType from seedpass.core.entry_types import EntryType
import uvicorn import uvicorn
from . import api as api_module 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.""" """Expose password manager components with lazy imports."""

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,8 +5,8 @@ from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from utils.key_derivation import ( from utils.key_derivation import (
derive_index_key, derive_index_key,
derive_key_from_password, 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator: class FakePasswordGenerator:

View File

@@ -4,9 +4,9 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_entry_manager_additional_backup(monkeypatch): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator: 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def setup_entry_mgr(tmp_path: Path) -> EntryManager: 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
def setup_entry_mgr(tmp_path: Path) -> EntryManager: 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])) 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 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager from seedpass.core.manager import PasswordManager
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
def test_switch_fingerprint_triggers_bg_sync(monkeypatch, tmp_path): 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("builtins.input", lambda *_a, **_k: "1")
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_a, **_k: "pw" "seedpass.core.manager.prompt_existing_password", lambda *_a, **_k: "pw"
) )
monkeypatch.setattr( monkeypatch.setattr(
PasswordManager, "setup_encryption_manager", lambda *a, **k: True PasswordManager, "setup_encryption_manager", lambda *a, **k: True
) )
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda *a, **k: None) monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda *a, **k: None)
monkeypatch.setattr(PasswordManager, "initialize_managers", lambda *a, **k: None) monkeypatch.setattr(PasswordManager, "initialize_managers", lambda *a, **k: None)
monkeypatch.setattr( monkeypatch.setattr("seedpass.core.manager.NostrClient", lambda *a, **kw: object())
"password_manager.manager.NostrClient", lambda *a, **kw: object()
)
calls = {"count": 0} calls = {"count": 0}

View File

@@ -4,8 +4,8 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, TEST_SEED, TEST_PASSWORD from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_backup_interval(monkeypatch): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_backup_restore_workflow(monkeypatch): def test_backup_restore_workflow(monkeypatch):

View File

@@ -5,7 +5,7 @@ import pytest
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from local_bip85.bip85 import BIP85, Bip85Error from local_bip85.bip85 import BIP85, Bip85Error
from password_manager.password_generation import ( from seedpass.core.password_generation import (
derive_ssh_key, derive_ssh_key,
derive_seed_phrase, 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 typer.testing import CliRunner
from seedpass import cli from seedpass import cli
from password_manager.entry_types import EntryType from seedpass.core.entry_types import EntryType
class DummyPM: class DummyPM:

View File

@@ -6,9 +6,9 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
import main import main
from password_manager.portable_backup import export_backup, import_backup from seedpass.core.portable_backup import export_backup, import_backup
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from helpers import create_vault, TEST_SEED 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
import main 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"): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from utils.key_derivation import derive_index_key, derive_key_from_password 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from nostr.client import DEFAULT_RELAYS from nostr.client import DEFAULT_RELAYS
from constants import INACTIVITY_TIMEOUT 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_retrieve_entry_shows_custom_fields(monkeypatch, capsys): 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 types import SimpleNamespace
from pathlib import Path from pathlib import Path
from password_manager.manager import PasswordManager from seedpass.core.manager import PasswordManager
from utils.key_derivation import EncryptionMode 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator: class FakePasswordGenerator:

View File

@@ -8,7 +8,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 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])) 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(): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_list_entries_empty(): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_add_and_retrieve_entry(): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_update_checksum_writes_to_expected_path(): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.totp import TotpManager from seedpass.core.totp import TotpManager
class FakeNostrClient: class FakeNostrClient:
@@ -42,9 +42,7 @@ def test_handle_export_totp_codes(monkeypatch, tmp_path):
export_path = tmp_path / "out.json" export_path = tmp_path / "out.json"
monkeypatch.setattr("builtins.input", lambda *a, **k: str(export_path)) monkeypatch.setattr("builtins.input", lambda *a, **k: str(export_path))
monkeypatch.setattr( monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *_a, **_k: False)
"password_manager.manager.confirm_action", lambda *_a, **_k: False
)
pm.handle_export_totp_codes() pm.handle_export_totp_codes()

View File

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

View File

@@ -4,10 +4,10 @@ from tempfile import TemporaryDirectory
from helpers import create_vault, dummy_nostr_client from helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
def _init_pm(dir_path: Path, client) -> PasswordManager: 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 helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
def _init_pm(dir_path: Path, client) -> PasswordManager: 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_key_from_password_argon2,
derive_index_key, derive_index_key,
) )
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
cfg_values = st.one_of( cfg_values = st.one_of(

View File

@@ -3,9 +3,9 @@ from tempfile import TemporaryDirectory
from unittest.mock import patch from unittest.mock import patch
from helpers import create_vault, TEST_SEED, TEST_PASSWORD from helpers import create_vault, TEST_SEED, TEST_PASSWORD
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_index_caching(): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from utils.key_derivation import derive_index_key, derive_key_from_password 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" 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_key_from_password_argon2,
derive_index_key, derive_index_key,
) )
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
TEST_SEED = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" TEST_SEED = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
TEST_PASSWORD = "pw" TEST_PASSWORD = "pw"
@@ -59,12 +59,12 @@ def test_setup_encryption_manager_kdf_modes(monkeypatch):
cfg = _setup_profile(path, mode) cfg = _setup_profile(path, mode)
pm = _make_pm(path, cfg) pm = _make_pm(path, cfg)
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", "seedpass.core.manager.prompt_existing_password",
lambda *_: TEST_PASSWORD, lambda *_: TEST_PASSWORD,
) )
if mode == "argon2": if mode == "argon2":
monkeypatch.setattr( 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), lambda pw: derive_key_from_password_argon2(pw, **argon_kwargs),
) )
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda self: None) 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def setup_entry_mgr(tmp_path: Path) -> EntryManager: def setup_entry_mgr(tmp_path: Path) -> EntryManager:

View File

@@ -3,9 +3,9 @@ from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
import constants import constants
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager from utils.fingerprint_manager import FingerprintManager
from password_manager.manager import EncryptionMode from seedpass.core.manager import EncryptionMode
from helpers import TEST_SEED 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.entry_types import EntryType from seedpass.core.entry_types import EntryType
def setup_entry_manager(tmp_path: Path) -> EntryManager: 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 helpers import create_vault, TEST_SEED, TEST_PASSWORD
from utils.fingerprint import generate_fingerprint from utils.fingerprint import generate_fingerprint
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from password_manager.manager import EncryptionMode from seedpass.core.manager import EncryptionMode
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def setup_entry_manager(tmp_path: Path) -> EntryManager: 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 helpers import create_vault, TEST_SEED, TEST_PASSWORD
from utils.fingerprint import generate_fingerprint from utils.fingerprint import generate_fingerprint
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from password_manager.manager import EncryptionMode from seedpass.core.manager import EncryptionMode
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.password_generation import derive_seed_phrase from seedpass.core.password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85 from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakeNostrClient: class FakeNostrClient:

View File

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

View File

@@ -5,7 +5,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 from constants import NOTIFICATION_DURATION
@@ -20,7 +20,7 @@ def _make_pm():
def test_notify_sets_current(monkeypatch): def test_notify_sets_current(monkeypatch):
pm = _make_pm() pm = _make_pm()
current = {"val": 100.0} 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") pm.notify("hello")
note = pm._current_notification note = pm._current_notification
assert hasattr(note, "message") assert hasattr(note, "message")
@@ -32,7 +32,7 @@ def test_notify_sets_current(monkeypatch):
def test_get_current_notification_ttl(monkeypatch): def test_get_current_notification_ttl(monkeypatch):
pm = _make_pm() pm = _make_pm()
now = {"val": 0.0} 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") pm.notify("note1")
assert pm.get_current_notification().message == "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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakeNostrClient: class FakeNostrClient:
@@ -50,7 +50,7 @@ def test_handle_display_totp_codes(monkeypatch, capsys):
# interrupt the loop after first iteration # interrupt the loop after first iteration
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()), lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
) )
@@ -91,7 +91,7 @@ def test_display_totp_codes_excludes_archived(monkeypatch, capsys):
) )
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()), 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakeNostrClient: class FakeNostrClient:
@@ -49,8 +49,8 @@ def test_edit_totp_period_from_retrieve(monkeypatch):
monkeypatch.setattr( monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1 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", lambda *a, **k: "b") monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
pm.handle_retrieve_entry() pm.handle_retrieve_entry()
entry = entry_mgr.retrieve_entry(0) entry = entry_mgr.retrieve_entry(0)

View File

@@ -10,11 +10,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.entry_types import EntryType from seedpass.core.entry_types import EntryType
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_handle_list_entries(monkeypatch, capsys): def test_handle_list_entries(monkeypatch, capsys):
@@ -79,9 +79,9 @@ def test_list_entries_show_details(monkeypatch, capsys):
monkeypatch.setattr( monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1 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( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: "b", lambda *a, **k: "b",
) )
@@ -119,7 +119,7 @@ def test_show_entry_details_by_index(monkeypatch):
header_calls = [] header_calls = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification", "seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: header_calls.append(True), lambda *a, **k: header_calls.append(True),
) )
@@ -134,9 +134,9 @@ def test_show_entry_details_by_index(monkeypatch):
"_entry_actions_menu", "_entry_actions_menu",
lambda *a, **k: call_order.append("actions"), 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( 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") pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
monkeypatch.setattr(pm, "notify", lambda *a, **k: None) monkeypatch.setattr(pm, "notify", lambda *a, **k: None)
@@ -168,16 +168,14 @@ def _setup_manager(tmp_path):
def _detail_common(monkeypatch, pm): def _detail_common(monkeypatch, pm):
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification", "seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: None, 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("builtins.input", lambda *a, **k: "")
monkeypatch.setattr( monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *a, **k: False)
"password_manager.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("password_manager.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr(pm, "notify", lambda *a, **k: None) monkeypatch.setattr(pm, "notify", lambda *a, **k: None)
pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123") pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
called = [] 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") pm.password_generator = SimpleNamespace(generate_password=lambda l, i: "pw123")
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: True "seedpass.core.manager.confirm_action", lambda *a, **k: True
) )
monkeypatch.setattr( 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("seedpass.core.manager.timed_input", lambda *a, **k: "b")
monkeypatch.setattr("password_manager.manager.time.sleep", lambda *a, **k: None) monkeypatch.setattr("seedpass.core.manager.time.sleep", lambda *a, **k: None)
monkeypatch.setattr( 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( monkeypatch.setattr(
"password_manager.manager.clear_header_with_notification", "seedpass.core.manager.clear_header_with_notification",
lambda *a, **k: None, 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 "" input_val = "r" if entry_type == "managed_account" else ""
monkeypatch.setattr("builtins.input", lambda *a, **k: input_val) 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode, TotpManager from seedpass.core.manager import PasswordManager, EncryptionMode, TotpManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakeNostrClient: class FakeNostrClient:
@@ -49,9 +49,9 @@ def test_handle_retrieve_totp_entry(monkeypatch, capsys):
monkeypatch.setattr( monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1 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( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: "b", 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_search_entries_prompt_for_details(monkeypatch, capsys): def test_search_entries_prompt_for_details(monkeypatch, capsys):
@@ -38,8 +38,8 @@ def test_search_entries_prompt_for_details(monkeypatch, capsys):
monkeypatch.setattr( monkeypatch.setattr(
pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 1 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", lambda *a, **k: "b") monkeypatch.setattr("seedpass.core.manager.timed_input", lambda *a, **k: "b")
inputs = iter(["Example", "0"]) inputs = iter(["Example", "0"])
monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))

View File

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

View File

@@ -5,11 +5,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from helpers import create_vault, TEST_SEED, TEST_PASSWORD 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: 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): def test_handle_search_entries_no_query(monkeypatch, tmp_path):
pm = _make_pm(tmp_path) pm = _make_pm(tmp_path)
monkeypatch.setattr( 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 *_: "") monkeypatch.setattr("builtins.input", lambda *_: "")
pm.handle_search_entries() 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
class FakePasswordGenerator: class FakePasswordGenerator:
@@ -34,7 +34,7 @@ def test_manager_workflow(monkeypatch):
backup_mgr = BackupManager(tmp_path, cfg_mgr) backup_mgr = BackupManager(tmp_path, cfg_mgr)
entry_mgr = EntryManager(vault, backup_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 = PasswordManager.__new__(PasswordManager)
pm.encryption_mode = EncryptionMode.SEED_ONLY 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])) 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): def setup(tmp_path: Path):

View File

@@ -1,9 +1,9 @@
from helpers import create_vault, TEST_SEED, TEST_PASSWORD from helpers import create_vault, TEST_SEED, TEST_PASSWORD
import pytest import pytest
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_modify_totp_entry_period_digits_and_archive(tmp_path): 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 from tempfile import TemporaryDirectory
import constants import constants
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager from utils.fingerprint_manager import FingerprintManager
from helpers import TEST_SEED from helpers import TEST_SEED

View File

@@ -4,9 +4,9 @@ from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
import constants import constants
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from utils.fingerprint_manager import FingerprintManager 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 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from nostr.client import NostrClient from nostr.client import NostrClient

View File

@@ -9,7 +9,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 from nostr.client import NostrClient
import nostr.client as nostr_client import nostr.client as nostr_client

View File

@@ -8,7 +8,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 from nostr.client import NostrClient, Manifest

View File

@@ -3,9 +3,9 @@ import gzip
import math import math
from helpers import create_vault, dummy_nostr_client from helpers import create_vault, dummy_nostr_client
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from nostr.client import prepare_snapshot from nostr.client import prepare_snapshot
from nostr.backup_models import KIND_SNAPSHOT_CHUNK 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_nostr_key_determinism(): def test_nostr_key_determinism():

View File

@@ -15,11 +15,11 @@ import os
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from nostr.client import NostrClient, Kind, KindStandard 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode, TotpManager from seedpass.core.manager import PasswordManager, EncryptionMode, TotpManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from utils.color_scheme import color_text 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)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code", "seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data), 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)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code", "seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data), 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)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.TotpManager.print_qr_code", "seedpass.core.manager.TotpManager.print_qr_code",
lambda data: called.append(data), lambda data: called.append(data),
) )

View File

@@ -13,7 +13,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 from nostr.client import NostrClient

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ import queue
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 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) pm = _make_pm(tmp_path)
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "pw" "seedpass.core.manager.prompt_existing_password", lambda *_: "pw"
) )
confirms = iter([True, True]) confirms = iter([True, True])
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *_a, **_k: next(confirms) "seedpass.core.manager.confirm_action", lambda *_a, **_k: next(confirms)
) )
saved = [] saved = []
@@ -51,11 +51,9 @@ def test_handle_backup_reveal_parent_seed_cancel(monkeypatch, tmp_path, capsys):
pm = _make_pm(tmp_path) pm = _make_pm(tmp_path)
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "pw" "seedpass.core.manager.prompt_existing_password", lambda *_: "pw"
)
monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *_a, **_k: False
) )
monkeypatch.setattr("seedpass.core.manager.confirm_action", lambda *_a, **_k: False)
saved = [] saved = []
pm.encryption_manager = SimpleNamespace( pm.encryption_manager = SimpleNamespace(
encrypt_and_save_file=lambda data, path: saved.append((data, path)) 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
def test_change_password_triggers_nostr_backup(monkeypatch): 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 pm.verify_password = lambda pw: True
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", lambda *_: "old" "seedpass.core.manager.prompt_existing_password", lambda *_: "old"
)
monkeypatch.setattr(
"password_manager.manager.prompt_for_password", lambda: "new"
) )
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 = MockClient.return_value
mock_instance.publish_snapshot = AsyncMock(return_value=(None, "abcd")) mock_instance.publish_snapshot = AsyncMock(return_value=(None, "abcd"))
pm.nostr_client = mock_instance pm.nostr_client = mock_instance

View File

@@ -4,7 +4,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) 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: class DummyEnc:

View File

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

View File

@@ -4,7 +4,7 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 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])) 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 password_manager.entry_types import EntryType from seedpass.core.entry_types import EntryType
class DummyEnc: class DummyEnc:

View File

@@ -7,12 +7,12 @@ import bcrypt
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from utils.key_derivation import derive_index_key, derive_key_from_password 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" 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( 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( monkeypatch.setattr(
"password_manager.manager.prompt_for_password", lambda: new_pw "seedpass.core.manager.NostrClient",
)
monkeypatch.setattr(
"password_manager.manager.NostrClient",
lambda *a, **kw: SimpleNamespace( lambda *a, **kw: SimpleNamespace(
publish_snapshot=lambda *a, **k: (None, "abcd") publish_snapshot=lambda *a, **k: (None, "abcd")
), ),
@@ -77,7 +75,7 @@ def test_password_change_and_unlock(monkeypatch):
pm.lock_vault() pm.lock_vault()
monkeypatch.setattr( 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_bip85", lambda self: None)
monkeypatch.setattr(PasswordManager, "initialize_managers", 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_pgp_key_determinism(): def test_pgp_key_determinism():

View File

@@ -9,11 +9,11 @@ import sys
sys.path.append(str(Path(__file__).resolve().parents[1])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager from seedpass.core.encryption import EncryptionManager
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.portable_backup import export_backup, import_backup from seedpass.core.portable_backup import export_backup, import_backup
from utils.key_derivation import derive_index_key, derive_key_from_password 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): def setup_pm(tmp_path):
import constants import constants
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
importlib.reload(constants) importlib.reload(constants)
importlib.reload(manager_module) importlib.reload(manager_module)
@@ -30,7 +30,7 @@ def test_generate_seed_cleanup_on_failure(monkeypatch):
pm, const, mgr = setup_pm(tmp_path) 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( monkeypatch.setattr(
pm, pm,
"save_and_encrypt_seed", "save_and_encrypt_seed",

View File

@@ -3,7 +3,7 @@ import importlib.util
from pathlib import Path from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
def load_script(): def load_script():
@@ -33,7 +33,7 @@ def test_initialize_profile_and_manager(monkeypatch):
pm.current_fingerprint = fingerprint pm.current_fingerprint = fingerprint
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", "seedpass.core.manager.prompt_existing_password",
lambda *_: gtp.DEFAULT_PASSWORD, lambda *_: gtp.DEFAULT_PASSWORD,
) )
monkeypatch.setattr(PasswordManager, "initialize_bip85", lambda self: None) 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 from utils.fingerprint_manager import FingerprintManager
import constants import constants
import password_manager.manager as manager_module import seedpass.core.manager as manager_module
from password_manager.vault import Vault from seedpass.core.vault import Vault
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import EncryptionMode from seedpass.core.manager import EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def test_add_and_delete_entry(monkeypatch): 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.fingerprint_manager import FingerprintManager 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 from helpers import create_vault, dummy_nostr_client
import gzip import gzip
from nostr.backup_models import Manifest, ChunkMeta 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("builtins.input", lambda *_args, **_kwargs: "1")
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.prompt_existing_password", "seedpass.core.manager.prompt_existing_password",
lambda *_a, **_k: "pass", lambda *_a, **_k: "pass",
) )
monkeypatch.setattr( monkeypatch.setattr(
@@ -47,7 +47,7 @@ def test_add_and_switch_fingerprint(monkeypatch):
PasswordManager, "sync_index_from_nostr_if_missing", lambda self: None PasswordManager, "sync_index_from_nostr_if_missing", lambda self: None
) )
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.NostrClient", lambda *a, **kw: object() "seedpass.core.manager.NostrClient", lambda *a, **kw: object()
) )
assert pm.handle_switch_fingerprint() assert pm.handle_switch_fingerprint()

View File

@@ -9,7 +9,7 @@ import base64
sys.path.append(str(Path(__file__).resolve().parents[1])) 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 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
import pytest import pytest
@@ -45,13 +45,13 @@ def test_pause_before_entry_actions(monkeypatch, adder, needs_confirm):
pause_calls = [] pause_calls = []
monkeypatch.setattr( 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(pm, "_entry_actions_menu", lambda *a, **k: None)
monkeypatch.setattr("builtins.input", lambda *a, **k: str(index)) monkeypatch.setattr("builtins.input", lambda *a, **k: str(index))
if needs_confirm: if needs_confirm:
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.confirm_action", lambda *a, **k: True "seedpass.core.manager.confirm_action", lambda *a, **k: True
) )
pm.handle_retrieve_entry() 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def setup_entry_manager(tmp_path: Path) -> EntryManager: 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.manager import PasswordManager, EncryptionMode from seedpass.core.manager import PasswordManager, EncryptionMode
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
def setup_pm(tmp_path): 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)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard", "seedpass.core.manager.copy_to_clipboard",
lambda text, t: called.append((text, t)), 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 pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 30
) )
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()), lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
) )
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard", "seedpass.core.manager.copy_to_clipboard",
lambda text, t: called.append((text, t)), 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)) monkeypatch.setattr("builtins.input", lambda *a, **k: next(inputs))
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard", "seedpass.core.manager.copy_to_clipboard",
lambda *a, **k: called.append((a, k)), 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 pm.entry_manager, "get_totp_time_remaining", lambda *a, **k: 30
) )
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.timed_input", "seedpass.core.manager.timed_input",
lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()), lambda *a, **k: (_ for _ in ()).throw(KeyboardInterrupt()),
) )
called = [] called = []
monkeypatch.setattr( monkeypatch.setattr(
"password_manager.manager.copy_to_clipboard", "seedpass.core.manager.copy_to_clipboard",
lambda *a, **k: called.append((a, k)), 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])) sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.entry_management import EntryManager from seedpass.core.entry_management import EntryManager
from password_manager.backup import BackupManager from seedpass.core.backup import BackupManager
from password_manager.config_manager import ConfigManager from seedpass.core.config_manager import ConfigManager
from password_manager.password_generation import derive_seed_phrase from seedpass.core.password_generation import derive_seed_phrase
from local_bip85.bip85 import BIP85 from local_bip85.bip85 import BIP85
from bip_utils import Bip39SeedGenerator from bip_utils import Bip39SeedGenerator

View File

@@ -10,7 +10,7 @@ sys.path.append(str(Path(__file__).resolve().parents[1]))
def setup_password_manager(): def setup_password_manager():
"""Instantiate PasswordManager using a temporary APP_DIR without running __init__.""" """Instantiate PasswordManager using a temporary APP_DIR without running __init__."""
import constants 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 # Reload modules so constants use the mocked home directory
importlib.reload(constants) importlib.reload(constants)
@@ -34,7 +34,7 @@ def test_generate_bip85_and_new_seed(monkeypatch):
mnemonic = pm.generate_bip85_seed() mnemonic = pm.generate_bip85_seed()
assert len(mnemonic.split()) == 12 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() fingerprint = pm.generate_new_seed()
expected_dir = const.APP_DIR / fingerprint expected_dir = const.APP_DIR / fingerprint

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