feat(cv-import): add source-grounded review and explicit corrections
This commit is contained in:
@@ -242,6 +242,10 @@ def _validate_import_docx(data: bytes) -> None:
|
||||
if node.tag.rsplit("}", 1)[-1] in {"altChunk", "OLEObject", "object"}:
|
||||
raise ParserError("external_content")
|
||||
if node.attrib.get("TargetMode", "").lower() == "external":
|
||||
# Hyperlinks are inert source data; converters cannot follow them in the sandbox.
|
||||
from urllib.parse import urlsplit
|
||||
if node.attrib.get("Type", "").endswith("/hyperlink") and urlsplit(node.attrib.get("Target", "")).scheme.lower() in {"http", "https", "mailto"}:
|
||||
continue
|
||||
raise ParserError("external_content")
|
||||
target = node.attrib.get("Target", "")
|
||||
if ":" in target or "\\" in target or target.startswith("/"):
|
||||
@@ -265,7 +269,7 @@ def _validate_import_pdf(data: bytes) -> int:
|
||||
count = len(reader.pages)
|
||||
if count > MAX_PDF_PAGES:
|
||||
raise ParserError("pdf_page_limit")
|
||||
forbidden = {"/OpenAction", "/AA", "/JS", "/JavaScript", "/Launch", "/GoToR", "/URI", "/SubmitForm", "/ImportData", "/EmbeddedFiles", "/Filespec", "/RichMedia", "/XFA"}
|
||||
forbidden = {"/OpenAction", "/AA", "/JS", "/JavaScript", "/Launch", "/GoToR", "/SubmitForm", "/ImportData", "/EmbeddedFiles", "/Filespec", "/RichMedia", "/XFA"}
|
||||
pending = [(reader.trailer, 0)]
|
||||
seen: set[int] = set()
|
||||
while pending:
|
||||
@@ -278,6 +282,9 @@ def _validate_import_pdf(data: bytes) -> int:
|
||||
if depth > 40 or len(seen) > 10_000:
|
||||
raise ParserError("pdf_object_limit")
|
||||
if isinstance(value, DictionaryObject):
|
||||
from urllib.parse import urlsplit
|
||||
if "/URI" in value and urlsplit(str(value["/URI"])).scheme.lower() not in {"http", "https", "mailto"}:
|
||||
raise ParserError("external_content")
|
||||
if forbidden.intersection(value) or str(value.get("/S", "")) in forbidden or str(value.get("/Type", "")) in forbidden:
|
||||
raise ParserError("external_content")
|
||||
pending.extend((item, depth + 1) for item in value.values())
|
||||
|
||||
Reference in New Issue
Block a user