该提交新增了完整的BlueBubbles渠道插件,支持通过BlueBubbles Server集成iMessage功能,包含以下核心能力: 1. 支持私聊和群聊会话管理,自动区分会话类型 2. 完整的消息收发支持,包括文本、图片、语音、文件、视频消息 3. 支持消息反应、已读回执、消息编辑与撤回 4. 内置去重、防抖处理机制 5. 支持Webhook和WebSocket两种事件接收方式 6. 完善的权限与安全校验机制 7. 历史消息同步与抓包功能 8. TTS语音合成与发送支持 9. 群组管理能力,包括重命名、修改头像、增减成员等
56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
import os
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def is_path_inside_root(file_path: str, root: str) -> bool:
|
|
try:
|
|
real_path = os.path.realpath(file_path)
|
|
real_root = os.path.realpath(root)
|
|
return os.path.commonpath([real_path, real_root]) == real_root
|
|
except (ValueError, OSError):
|
|
return False
|
|
|
|
|
|
def validate_media_path(file_path: str, local_roots: list[str]) -> bool:
|
|
if not local_roots:
|
|
return False
|
|
for root in local_roots:
|
|
if is_path_inside_root(file_path, root):
|
|
return True
|
|
return False
|
|
|
|
|
|
def get_media_size_mb(file_path: str) -> float:
|
|
try:
|
|
return os.path.getsize(file_path) / (1024 * 1024)
|
|
except OSError:
|
|
return 0.0
|
|
|
|
|
|
def sanitize_filename(filename: str) -> str:
|
|
base = os.path.basename(filename)
|
|
base = base.replace("\r", "").replace("\n", "")
|
|
return base
|
|
|
|
|
|
def guess_mime_type(file_path: str) -> str:
|
|
ext = Path(file_path).suffix.lower()
|
|
mime_map = {
|
|
".jpg": "image/jpeg",
|
|
".jpeg": "image/jpeg",
|
|
".png": "image/png",
|
|
".gif": "image/gif",
|
|
".webp": "image/webp",
|
|
".mp4": "video/mp4",
|
|
".mov": "video/quicktime",
|
|
".mp3": "audio/mpeg",
|
|
".caf": "audio/x-caf",
|
|
".m4a": "audio/mp4",
|
|
".pdf": "application/pdf",
|
|
".txt": "text/plain",
|
|
}
|
|
return mime_map.get(ext, "application/octet-stream")
|