fix(todo-form): _safe_rel保留尾部/——目录型target(如 docs/资质/)不再丢原文件名

This commit is contained in:
ymq 2026-09-01 13:54:58 +08:00
parent c714a98dd1
commit 370b7d0a4b

View File

@ -103,16 +103,21 @@ if not project_dir or not os.path.isdir(project_dir):
def _safe_rel(target):
"""校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。"""
"""校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。
保留尾部 '/'——它是「目录 target」保留原文件名与「文件 target」
(直接用 target 作路径)的区分标志,归一化时不能丢。
"""
t = (target or '').strip()
if not t:
return ''
if t.startswith('/'):
return ''
is_dir = t.endswith('/')
parts = [p for p in t.split('/') if p not in ('', '.')]
if '..' in parts:
return ''
return '/'.join(parts)
return '/'.join(parts) + ('/' if is_dir else '')
uploaded = [] # [(name, rel_path)]