"""Security-focused tests for native DOCX IR drawing asset handling."""
from __future__ import annotations
import pytest
from lightrag.parser.docx.ir_builder import NativeDocxIRBuilder
def _build_ir(content: str):
return NativeDocxIRBuilder().normalize(
[
{
"uuid": "p1",
"uuid_end": "p1",
"heading": "Section",
"content": content,
"parent_headings": [],
"level": 1,
}
],
document_name="doc.docx",
asset_dir_name="doc.blocks.assets",
)
@pytest.mark.offline
def test_native_docx_ir_accepts_safe_local_drawing_asset() -> None:
ir = _build_ir(
''
)
drawing = ir.blocks[0].drawings[0]
assert drawing.asset_ref == "fig.png"
assert drawing.path_override is None
assert len(ir.assets) == 1
assert ir.assets[0].ref == "fig.png"
assert ir.assets[0].suggested_name == "fig.png"
assert ir.assets[0].source is None
@pytest.mark.offline
@pytest.mark.parametrize(
"path",
[
"doc.blocks.assets/../secret.png",
"doc.blocks.assets//tmp/secret.png",
r"doc.blocks.assets/..\secret.png",
],
)
def test_native_docx_ir_rejects_unsafe_local_drawing_asset(path: str) -> None:
ir = _build_ir(f'')
drawing = ir.blocks[0].drawings[0]
assert drawing.asset_ref == ""
assert drawing.path_override is None
assert ir.assets == []
@pytest.mark.offline
def test_native_docx_ir_preserves_non_asset_external_drawing_path() -> None:
ir = _build_ir(
''
)
drawing = ir.blocks[0].drawings[0]
assert drawing.asset_ref == ""
assert drawing.path_override == "../images/legacy.gif"
assert ir.assets == []