fix: harden palace security checks

Agent-Logs-Url: https://github.com/MemPalace/mempalace/sessions/775f2fc4-3051-462e-8586-6d694b55da0d

Co-authored-by: igorls <4753812+igorls@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-04-12 22:21:42 +00:00
committed by Igor Lins e Silva
parent bb577bb41f
commit c478dfa173
8 changed files with 238 additions and 15 deletions
+17 -3
View File
@@ -156,7 +156,7 @@ def cmd_migrate(args):
from .migrate import migrate
palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path
migrate(palace_path=palace_path, dry_run=args.dry_run)
migrate(palace_path=palace_path, dry_run=args.dry_run, confirm=getattr(args, "yes", False))
def cmd_status(args):
@@ -170,12 +170,19 @@ def cmd_repair(args):
"""Rebuild palace vector index from SQLite metadata."""
import chromadb
import shutil
from .migrate import confirm_destructive_action, has_palace_database
palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path
palace_path = os.path.abspath(
os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path
)
db_path = os.path.join(palace_path, "chroma.sqlite3")
if not os.path.isdir(palace_path):
print(f"\n No palace found at {palace_path}")
return
if not has_palace_database(palace_path):
print(f"\n No palace database found at {db_path}")
return
print(f"\n{'=' * 55}")
print(" MemPalace Repair")
@@ -197,6 +204,9 @@ def cmd_repair(args):
print(" Nothing to repair.")
return
if not confirm_destructive_action("Repair", palace_path, assume_yes=getattr(args, "yes", False)):
return
# Extract all drawers in batches
print("\n Extracting drawers...")
batch_size = 5000
@@ -216,6 +226,9 @@ def cmd_repair(args):
palace_path = palace_path.rstrip(os.sep)
backup_path = palace_path + ".backup"
if os.path.exists(backup_path):
if not has_palace_database(backup_path):
print(f" Refusing to delete non-palace backup path: {backup_path}")
return
shutil.rmtree(backup_path)
print(f" Backing up to {backup_path}...")
shutil.copytree(palace_path, backup_path)
@@ -532,7 +545,7 @@ def main():
sub.add_parser(
"repair",
help="Rebuild palace vector index from stored data (fixes segfaults after corruption)",
)
).add_argument("--yes", action="store_true", help="Skip confirmation for destructive changes")
# mcp
sub.add_parser(
@@ -551,6 +564,7 @@ def main():
action="store_true",
help="Show what would be migrated without changing anything",
)
p_migrate.add_argument("--yes", action="store_true", help="Skip confirmation for destructive changes")
sub.add_parser("status", help="Show what's been filed")