(target: Path, relative_path: str)
| 3481 | |
| 3482 | |
| 3483 | def safe_source_path(target: Path, relative_path: str) -> Path | None: |
| 3484 | if "\\" in relative_path: |
| 3485 | return None |
| 3486 | parsed = PurePosixPath(relative_path) |
| 3487 | if parsed.is_absolute() or ".." in parsed.parts: |
| 3488 | return None |
| 3489 | try: |
| 3490 | path = (target / parsed.as_posix()).resolve() |
| 3491 | path.relative_to(target) |
| 3492 | except (OSError, RuntimeError, ValueError): |
| 3493 | return None |
| 3494 | return path |
| 3495 | |
| 3496 | |
| 3497 | def available_artifact_path(scan_dir: Path, candidate: Path) -> Path | None: |