17 lines
595 B
Python
17 lines
595 B
Python
import re
|
|
|
|
SAFE_MANIFEST_PATH = re.compile(r"^[A-Za-z0-9._/-]+$")
|
|
MAX_MANIFEST_PATH_LENGTH = 512
|
|
|
|
|
|
def normalize_manifest_path(path: str) -> str:
|
|
normalized = path.strip().removeprefix("./")
|
|
if not normalized:
|
|
raise ValueError("path must not be empty")
|
|
if len(normalized) > MAX_MANIFEST_PATH_LENGTH:
|
|
raise ValueError(
|
|
f"path exceeds {MAX_MANIFEST_PATH_LENGTH} characters: {path!r}"
|
|
)
|
|
if not SAFE_MANIFEST_PATH.match(normalized) or ".." in normalized.split("/"):
|
|
raise ValueError(f"path is not allowed: {path!r}")
|
|
return normalized
|