Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions gateway/platforms/wecom.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,17 @@ async def _on_message(self, payload: Dict[str, Any]) -> None:
if not isinstance(body, dict):
return

# Debug: log full message structure for media debugging
import json
msgtype = str(body.get("msgtype") or "").lower()
if msgtype in ("image", "file", "mixed"):
logger.info(
"[%s] Received %s message, full body: %s",
self.name,
msgtype,
json.dumps(body, ensure_ascii=False, indent=2),
)

msg_id = str(body.get("msgid") or self._payload_req_id(payload) or uuid.uuid4().hex)
if self._dedup.is_duplicate(msg_id):
logger.debug("[%s] Duplicate message %s ignored", self.name, msg_id)
Expand Down Expand Up @@ -1010,6 +1021,8 @@ def _decrypt_file_bytes(encrypted_data: bytes, aes_key: str) -> bytes:
if not aes_key:
raise ValueError("aes_key is required")

# WeCom doesn't pad base64 keys; add padding if needed
aes_key = aes_key + '=' * ((4 - len(aes_key) % 4) % 4)
key = base64.b64decode(aes_key)
if len(key) != 32:
raise ValueError(f"Invalid WeCom AES key length: expected 32 bytes, got {len(key)}")
Expand Down
1 change: 1 addition & 0 deletions tools/url_safety.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
# to 198.18.0.0/15 behind local proxy/benchmark infrastructure.
_TRUSTED_PRIVATE_IP_HOSTS = frozenset({
"multimedia.nt.qq.com.cn",
"ww-aibot-img-1258476243.cos.ap-guangzhou.myqcloud.com",
})

# 100.64.0.0/10 (CGNAT / Shared Address Space, RFC 6598) is NOT covered by
Expand Down