consume only artifacts the runtime produced
tile_manifest_path arrives in the detection and segmentation request and was read straight off disk, and a manifest entry may name an absolute tile path. That makes an API field an unbounded reference to the host filesystem, and it contradicts the rule the persistence model rests on: only a governed, runtime-produced artifact may be consumed, and a file outside the storage root is not one. Both the manifest and every tile it names now resolve under STORAGE_ROOT. Resolution happens before the comparison, so ".." cannot climb out and a sibling that merely shares a name prefix does not pass. GEOINTEL_ALLOW_EXTERNAL_ARTIFACT_PATHS opts out for provisioning workflows that stage tiles before ingest. The check honours the Settings the caller is operating under rather than the process-wide ones, because every analysis path already threads its own. The affected tests write manifests into tmp_path, so they now declare tmp_path as the storage root — which is what a deployment does, and makes the fixtures more honest than they were. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -114,7 +114,10 @@ def _session(tmp_path: Path, *, with_manifest: bool):
|
||||
return db, analysis_run_id, reference_dataset_id
|
||||
|
||||
|
||||
def test_segmentation_qa_scores_only_inside_persisted_tile_coverage(tmp_path: Path) -> None:
|
||||
def test_segmentation_qa_scores_only_inside_persisted_tile_coverage(tmp_path: Path, monkeypatch) -> None:
|
||||
# A manifest written into tmp_path is only a governed artifact if
|
||||
# tmp_path is the storage root.
|
||||
monkeypatch.setenv("STORAGE_ROOT", str(tmp_path))
|
||||
db, analysis_run_id, reference_dataset_id = _session(tmp_path, with_manifest=True)
|
||||
|
||||
result = SegmentationService.compare_segmentations_with_reference(
|
||||
@@ -151,7 +154,10 @@ def test_segmentation_qa_without_manifest_reports_unbounded_coverage(tmp_path: P
|
||||
assert result["coverage"]["mode"] == "unbounded_no_manifest"
|
||||
|
||||
|
||||
def test_segmentation_qa_rejects_reference_entirely_outside_coverage(tmp_path: Path) -> None:
|
||||
def test_segmentation_qa_rejects_reference_entirely_outside_coverage(tmp_path: Path, monkeypatch) -> None:
|
||||
# A manifest written into tmp_path is only a governed artifact if
|
||||
# tmp_path is the storage root.
|
||||
monkeypatch.setenv("STORAGE_ROOT", str(tmp_path))
|
||||
db, analysis_run_id, reference_dataset_id = _session(tmp_path, with_manifest=True)
|
||||
db.query_rows[VectorFeature] = [
|
||||
_reference(reference_dataset_id, box(8.0, 8.0, 8.1, 8.1)),
|
||||
|
||||
Reference in New Issue
Block a user