mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2025-09-07 14:58:56 +00:00
Refactor password manager modules
This commit is contained in:
@@ -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
|
||||||
|
@@ -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}")
|
||||||
|
@@ -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 (
|
||||||
|
@@ -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),
|
||||||
|
@@ -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()
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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."""
|
||||||
|
|
@@ -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
|
@@ -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(
|
@@ -1,4 +1,4 @@
|
|||||||
# /src/password_manager/encryption.py
|
# /src/seedpass.core/encryption.py
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import traceback
|
import traceback
|
@@ -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
|
||||||
|
|
@@ -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
|
@@ -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()
|
@@ -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__)
|
@@ -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__)
|
@@ -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,
|
||||||
|
@@ -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:
|
||||||
|
@@ -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):
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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}
|
||||||
|
|
||||||
|
@@ -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):
|
||||||
|
@@ -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):
|
||||||
|
@@ -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,
|
||||||
)
|
)
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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"):
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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):
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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():
|
||||||
|
@@ -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():
|
||||||
|
@@ -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():
|
||||||
|
@@ -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():
|
||||||
|
@@ -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()
|
||||||
|
|
||||||
|
@@ -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():
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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(
|
||||||
|
@@ -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():
|
||||||
|
@@ -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"
|
||||||
|
@@ -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)
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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"
|
||||||
|
@@ -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"
|
||||||
|
@@ -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()),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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))
|
||||||
|
@@ -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",
|
||||||
|
@@ -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()
|
||||||
|
@@ -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
|
||||||
|
@@ -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):
|
||||||
|
@@ -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):
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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():
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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():
|
||||||
|
@@ -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):
|
||||||
|
@@ -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))
|
||||||
|
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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)
|
||||||
|
@@ -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():
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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",
|
||||||
|
@@ -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)
|
||||||
|
@@ -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):
|
||||||
|
@@ -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()
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
@@ -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:
|
||||||
|
@@ -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)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
Reference in New Issue
Block a user