mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-06 17:38:35 +00:00
fix(wecom): fallback to default filename when sanitize strips to empty
This commit is contained in:
parent
cb2f9d0bbd
commit
98507ae4fe
@ -30,12 +30,12 @@ WECOM_UPLOAD_MAX_BYTES = 1024 * 1024 * 200 # 200MB
|
|||||||
_SAFE_NAME_RE = re.compile(r"[^\w.\-()\[\]()【】\u4e00-\u9fff]+", re.UNICODE)
|
_SAFE_NAME_RE = re.compile(r"[^\w.\-()\[\]()【】\u4e00-\u9fff]+", re.UNICODE)
|
||||||
|
|
||||||
|
|
||||||
def _sanitize_filename(name: str) -> str:
|
def _sanitize_filename(name: str, fallback: str = "unnamed") -> str:
|
||||||
"""Sanitize filename to avoid traversal and problematic chars."""
|
"""Sanitize filename to avoid traversal and problematic chars."""
|
||||||
name = (name or "").strip()
|
name = (name or "").strip()
|
||||||
name = Path(name).name
|
name = Path(name).name
|
||||||
name = _SAFE_NAME_RE.sub("_", name).strip("._ ")
|
name = _SAFE_NAME_RE.sub("_", name).strip("._ ")
|
||||||
return name
|
return name or fallback
|
||||||
|
|
||||||
|
|
||||||
_IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"}
|
_IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"}
|
||||||
@ -399,9 +399,8 @@ class WecomChannel(BaseChannel):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
media_dir = get_media_dir("wecom")
|
media_dir = get_media_dir("wecom")
|
||||||
if not filename:
|
fallback_name = fname or f"{media_type}_{hash(file_url) % 100000}"
|
||||||
filename = fname or f"{media_type}_{hash(file_url) % 100000}"
|
filename = _sanitize_filename(cast(str, filename or fallback_name), fallback=fallback_name)
|
||||||
filename = _sanitize_filename(cast(str, filename))
|
|
||||||
|
|
||||||
file_path = media_dir / filename
|
file_path = media_dir / filename
|
||||||
await asyncio.to_thread(file_path.write_bytes, data)
|
await asyncio.to_thread(file_path.write_bytes, data)
|
||||||
|
|||||||
@ -93,9 +93,14 @@ def test_sanitize_filename_keeps_chinese_chars() -> None:
|
|||||||
|
|
||||||
|
|
||||||
def test_sanitize_filename_empty_input() -> None:
|
def test_sanitize_filename_empty_input() -> None:
|
||||||
assert _sanitize_filename("") == ""
|
assert _sanitize_filename("") == "unnamed"
|
||||||
|
|
||||||
|
|
||||||
|
def test_sanitize_filename_empty_or_dots_fallback() -> None:
|
||||||
|
assert _sanitize_filename("...") == "unnamed"
|
||||||
|
assert _sanitize_filename("..", fallback="fallback.txt") == "fallback.txt"
|
||||||
|
assert _sanitize_filename("") == "unnamed"
|
||||||
|
|
||||||
def test_guess_wecom_media_type_image() -> None:
|
def test_guess_wecom_media_type_image() -> None:
|
||||||
for ext in (".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"):
|
for ext in (".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"):
|
||||||
assert _guess_wecom_media_type(f"photo{ext}") == "image"
|
assert _guess_wecom_media_type(f"photo{ext}") == "image"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user