mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2025-09-09 15:58:48 +00:00
Merge pull request #15 from PR0M3TH3AN/codex/ensure-at-least-one-nostr-relay-present
Enforce relay presence and backup index
This commit is contained in:
12
src/main.py
12
src/main.py
@@ -296,6 +296,10 @@ def handle_add_relay(password_manager: PasswordManager) -> None:
|
|||||||
cfg_mgr.set_relays(relays)
|
cfg_mgr.set_relays(relays)
|
||||||
_reload_relays(password_manager, relays)
|
_reload_relays(password_manager, relays)
|
||||||
print(colored("Relay added.", "green"))
|
print(colored("Relay added.", "green"))
|
||||||
|
try:
|
||||||
|
handle_post_to_nostr(password_manager)
|
||||||
|
except Exception as backup_error:
|
||||||
|
logging.error(f"Failed to backup index to Nostr: {backup_error}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error adding relay: {e}")
|
logging.error(f"Error adding relay: {e}")
|
||||||
print(colored(f"Error: {e}", "red"))
|
print(colored(f"Error: {e}", "red"))
|
||||||
@@ -319,6 +323,14 @@ def handle_remove_relay(password_manager: PasswordManager) -> None:
|
|||||||
if not choice.isdigit() or not (1 <= int(choice) <= len(relays)):
|
if not choice.isdigit() or not (1 <= int(choice) <= len(relays)):
|
||||||
print(colored("Invalid selection.", "red"))
|
print(colored("Invalid selection.", "red"))
|
||||||
return
|
return
|
||||||
|
if len(relays) == 1:
|
||||||
|
print(
|
||||||
|
colored(
|
||||||
|
"At least one relay must be configured. Add another before removing this one.",
|
||||||
|
"red",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return
|
||||||
relays.pop(int(choice) - 1)
|
relays.pop(int(choice) - 1)
|
||||||
cfg_mgr.set_relays(relays)
|
cfg_mgr.set_relays(relays)
|
||||||
_reload_relays(password_manager, relays)
|
_reload_relays(password_manager, relays)
|
||||||
|
@@ -68,6 +68,8 @@ class ConfigManager:
|
|||||||
|
|
||||||
def set_relays(self, relays: List[str], require_pin: bool = True) -> None:
|
def set_relays(self, relays: List[str], require_pin: bool = True) -> None:
|
||||||
"""Update relay list and save."""
|
"""Update relay list and save."""
|
||||||
|
if not relays:
|
||||||
|
raise ValueError("At least one Nostr relay must be configured")
|
||||||
config = self.load_config(require_pin=require_pin)
|
config = self.load_config(require_pin=require_pin)
|
||||||
config["relays"] = relays
|
config["relays"] = relays
|
||||||
self.save_config(config)
|
self.save_config(config)
|
||||||
|
@@ -2,6 +2,7 @@ import bcrypt
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
from cryptography.fernet import Fernet
|
from cryptography.fernet import Fernet
|
||||||
|
import pytest
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
sys.path.append(str(Path(__file__).resolve().parents[1]))
|
sys.path.append(str(Path(__file__).resolve().parents[1]))
|
||||||
@@ -67,7 +68,15 @@ def test_set_relays_persists_changes():
|
|||||||
key = Fernet.generate_key()
|
key = Fernet.generate_key()
|
||||||
enc_mgr = EncryptionManager(key, Path(tmpdir))
|
enc_mgr = EncryptionManager(key, Path(tmpdir))
|
||||||
cfg_mgr = ConfigManager(enc_mgr, Path(tmpdir))
|
cfg_mgr = ConfigManager(enc_mgr, Path(tmpdir))
|
||||||
|
|
||||||
cfg_mgr.set_relays(["wss://custom"], require_pin=False)
|
cfg_mgr.set_relays(["wss://custom"], require_pin=False)
|
||||||
cfg = cfg_mgr.load_config(require_pin=False)
|
cfg = cfg_mgr.load_config(require_pin=False)
|
||||||
assert cfg["relays"] == ["wss://custom"]
|
assert cfg["relays"] == ["wss://custom"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_relays_requires_at_least_one():
|
||||||
|
with TemporaryDirectory() as tmpdir:
|
||||||
|
key = Fernet.generate_key()
|
||||||
|
enc_mgr = EncryptionManager(key, Path(tmpdir))
|
||||||
|
cfg_mgr = ConfigManager(enc_mgr, Path(tmpdir))
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
cfg_mgr.set_relays([], require_pin=False)
|
||||||
|
Reference in New Issue
Block a user