56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
STATIC_ROOT = Path(__file__).resolve().parent.parent / "static"
|
|
|
|
|
|
def _local_static_file_exists(url: str) -> bool:
|
|
if not url.startswith("/static/"):
|
|
return True
|
|
relative_path = url.removeprefix("/static/")
|
|
file_path = STATIC_ROOT / Path(relative_path)
|
|
return file_path.is_file()
|
|
|
|
|
|
def sanitize_media_url(url: str | None) -> str | None:
|
|
if not url:
|
|
return None
|
|
if url.startswith("/static/") and not _local_static_file_exists(url):
|
|
return None
|
|
return url
|
|
|
|
|
|
def sanitize_media_list(urls: list[str] | None) -> list[str]:
|
|
if not isinstance(urls, list):
|
|
return []
|
|
items: list[str] = []
|
|
for item in urls:
|
|
if not isinstance(item, str):
|
|
continue
|
|
safe_url = sanitize_media_url(item)
|
|
if safe_url:
|
|
items.append(safe_url)
|
|
return items
|
|
|
|
|
|
def sanitize_user_media_payload(payload: dict[str, Any]) -> dict[str, Any]:
|
|
data = dict(payload)
|
|
avatar_url = sanitize_media_url(data.get("avatar_url"))
|
|
avatar_blur_url = sanitize_media_url(data.get("avatar_blur_url"))
|
|
profile_images = sanitize_media_list(data.get("profile_images"))
|
|
|
|
if not avatar_url and profile_images:
|
|
avatar_url = profile_images[0]
|
|
if not avatar_blur_url:
|
|
avatar_blur_url = avatar_url
|
|
if avatar_url and not profile_images:
|
|
profile_images = [avatar_url]
|
|
|
|
data["avatar_url"] = avatar_url
|
|
data["avatar_blur_url"] = avatar_blur_url
|
|
data["profile_images"] = profile_images
|
|
return data
|