Use HIS数据处理 as Gitea backup root
This commit is contained in:
@@ -3,6 +3,7 @@ REVIEW_APP_PASSWORD=change-me
|
||||
REVIEW_APP_SECRET_KEY=change-me-to-a-random-string
|
||||
REVIEW_APP_PORT=8090
|
||||
REVIEW_POSTGRES_SYNC=1
|
||||
HIS_LIST_DATA_ROOT=/path/to/HIS数据/患者列表
|
||||
KIMI_API_KEY=change-me
|
||||
KIMI_API_ENABLED=1
|
||||
KIMI_MODEL=kimi-k2.6
|
||||
|
||||
@@ -47,6 +47,7 @@ DATETIME_PATTERN = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}")
|
||||
FLEX_DATETIME_PATTERN = re.compile(r"^(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})$")
|
||||
INPATIENT_NO_PATTERN = re.compile(r".*")
|
||||
IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".bmp", ".webp"}
|
||||
IMAGE_DATA_LINK_NAMES = ("已处理-患者目录图片集群", "待处理-患者目录图片集群")
|
||||
IGNORED_REVIEW_TIPS = {"缺少出院时间"}
|
||||
IGNORED_AI_ISSUE_PATTERNS = (
|
||||
"最后书写时间与出院时间顺序异常",
|
||||
@@ -1579,11 +1580,41 @@ def filtered_items() -> list[dict[str, Any]]:
|
||||
return items
|
||||
|
||||
|
||||
def path_is_relative_to(path: Path, root: Path) -> bool:
|
||||
try:
|
||||
path.relative_to(root)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
|
||||
def allowed_file_roots() -> list[Path]:
|
||||
roots = [WORKSPACE_ROOT.resolve()]
|
||||
for name in IMAGE_DATA_LINK_NAMES:
|
||||
link_path = WORKSPACE_ROOT / name
|
||||
if link_path.exists() or link_path.is_symlink():
|
||||
roots.append(link_path.resolve(strict=False))
|
||||
extra_roots = os.getenv("REVIEW_ALLOWED_PATH_ROOTS", "")
|
||||
for root_text in extra_roots.split(os.pathsep):
|
||||
root_text = root_text.strip()
|
||||
if root_text:
|
||||
roots.append(Path(root_text).expanduser().resolve(strict=False))
|
||||
|
||||
unique_roots: list[Path] = []
|
||||
seen: set[str] = set()
|
||||
for root in roots:
|
||||
key = str(root)
|
||||
if key not in seen:
|
||||
seen.add(key)
|
||||
unique_roots.append(root)
|
||||
return unique_roots
|
||||
|
||||
|
||||
def safe_workspace_path(path_text: str) -> Path:
|
||||
raw = Path(path_text)
|
||||
path = raw if raw.is_absolute() else WORKSPACE_ROOT / raw
|
||||
resolved = path.resolve()
|
||||
if WORKSPACE_ROOT not in resolved.parents and resolved != WORKSPACE_ROOT:
|
||||
resolved = path.resolve(strict=False)
|
||||
if not any(path_is_relative_to(resolved, root) or resolved == root for root in allowed_file_roots()):
|
||||
abort(403)
|
||||
if not resolved.exists():
|
||||
abort(404)
|
||||
|
||||
@@ -12,8 +12,10 @@ services:
|
||||
WORKSPACE_ROOT: /workspace
|
||||
REVIEW_APP_HOST: 0.0.0.0
|
||||
REVIEW_APP_PORT: 8000
|
||||
REVIEW_ALLOWED_PATH_ROOTS: ${HIS_LIST_DATA_ROOT:-/data/his-list-images}
|
||||
ports:
|
||||
- "${REVIEW_APP_PORT:-8090}:8000"
|
||||
volumes:
|
||||
- ..:/workspace
|
||||
- ${HIS_LIST_DATA_ROOT:-../待处理-患者目录图片集群}:${HIS_LIST_DATA_ROOT:-/data/his-list-images}:ro
|
||||
restart: unless-stopped
|
||||
|
||||
Reference in New Issue
Block a user