fix(todo-form): _safe_rel保留尾部/——目录型target(如 docs/资质/)不再丢原文件名
This commit is contained in:
parent
c714a98dd1
commit
370b7d0a4b
@ -103,16 +103,21 @@ if not project_dir or not os.path.isdir(project_dir):
|
|||||||
|
|
||||||
|
|
||||||
def _safe_rel(target):
|
def _safe_rel(target):
|
||||||
"""校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。"""
|
"""校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。
|
||||||
|
|
||||||
|
保留尾部 '/'——它是「目录 target」(保留原文件名)与「文件 target」
|
||||||
|
(直接用 target 作路径)的区分标志,归一化时不能丢。
|
||||||
|
"""
|
||||||
t = (target or '').strip()
|
t = (target or '').strip()
|
||||||
if not t:
|
if not t:
|
||||||
return ''
|
return ''
|
||||||
if t.startswith('/'):
|
if t.startswith('/'):
|
||||||
return ''
|
return ''
|
||||||
|
is_dir = t.endswith('/')
|
||||||
parts = [p for p in t.split('/') if p not in ('', '.')]
|
parts = [p for p in t.split('/') if p not in ('', '.')]
|
||||||
if '..' in parts:
|
if '..' in parts:
|
||||||
return ''
|
return ''
|
||||||
return '/'.join(parts)
|
return '/'.join(parts) + ('/' if is_dir else '')
|
||||||
|
|
||||||
|
|
||||||
uploaded = [] # [(name, rel_path)]
|
uploaded = [] # [(name, rel_path)]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user