From ad7f152ea76962986bf9bf92c17576f840b5c3e1 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 21 Jul 2026 17:58:03 +0800 Subject: [PATCH] fix: whitelist parser metadata to its documented fields before storing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The unfiltered metadata spread let a custom parser overwrite managed columns — stashing 'file_path' in metadata silently repointed the stored row at the user's original file, which delete_document would then unlink. ParsedDocument documents page_count/line_count as the only persisted metadata; merge exactly those. --- pageindex/backend/local.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pageindex/backend/local.py b/pageindex/backend/local.py index 97bb728..d73d4bf 100644 --- a/pageindex/backend/local.py +++ b/pageindex/backend/local.py @@ -128,13 +128,16 @@ class LocalBackend: **({"images": n.images} if n.images else {})} for n in parsed.nodes if n.content] + meta = parsed.metadata or {} self._storage.save_document(collection, doc_id, { "doc_name": parsed.doc_name, "doc_description": result.get("doc_description", ""), "file_path": str(managed_path), "file_hash": file_hash, "doc_type": ext.lstrip("."), - **(parsed.metadata or {}), # parser-reported, e.g. page_count / line_count + # Only the documented parser metadata fields — anything else a + # parser reports must not reach (or overwrite) storage columns. + **{k: meta[k] for k in ("page_count", "line_count") if k in meta}, "structure": result["structure"], "pages": pages, })