Files
Nexus/server/api/schema_path_validators.py
T

60 lines
2.1 KiB
Python

"""Pydantic coercers for Linux / remote path fields (wraps posix_paths)."""
from __future__ import annotations
from server.utils.posix_paths import PosixPathError, normalize_remote_abs_path, to_posix
def coerce_optional_remote_abs_path(value: str | None) -> str | None:
"""Optional remote absolute path (e.g. server.target_path)."""
if value is None:
return None
text = str(value).strip()
if not text:
return None
try:
return normalize_remote_abs_path(text)
except PosixPathError as exc:
raise ValueError(str(exc)) from exc
def coerce_remote_abs_path(value: str) -> str:
"""Required remote absolute path."""
try:
return normalize_remote_abs_path(str(value).strip())
except PosixPathError as exc:
raise ValueError(str(exc)) from exc
def coerce_remote_abs_path_list(values: list[str]) -> list[str]:
return [coerce_remote_abs_path(v) for v in values]
def coerce_nexus_host_abs_path(value: str) -> str:
"""Nexus 主机上的绝对路径(推送源、上传暂存区等)。"""
text = str(value).strip()
if not text:
raise ValueError("路径不能为空")
if "\\" in text or "\0" in text:
raise ValueError("路径必须使用 Linux 路径(不允许反斜杠)")
path = to_posix(text)
if not path.startswith("/"):
raise ValueError("路径必须为绝对路径")
parts = [p for p in path.split("/") if p and p != "."]
if ".." in parts:
raise ValueError("路径不允许包含 '..'")
normalized = "/" + "/".join(parts) if parts else "/"
if len(normalized) > 1 and normalized.endswith("/"):
normalized = normalized.rstrip("/")
return normalized or "/"
def coerce_remote_relative_path(value: str) -> str:
"""远程目录下的相对路径(不含前导 /)。"""
rel = to_posix(str(value).strip()).lstrip("/")
if not rel or ".." in rel.split("/"):
raise ValueError("相对路径无效")
if "\\" in str(value):
raise ValueError("路径必须使用 Linux 路径(不允许反斜杠)")
return rel