- Shipped
- October 14, 2026 at 11:02 PM UTC
- Author
- Kamo
- Commit
- f527486
A visitor on a lender's website can now send documents, images, zips and ordinary audio/video to the agent in the Live Support tab, and read back both their own files and the agent's. Scripts, autoruns and executables are refused. The gate is PublicVisitorAttachmentPolicy, judged against the bytes rather than the name or declared type: a default-deny extension allowlist (by the last extension, with dangerous inner extensions, bidi overrides and Windows trailing dots refused), magic bytes that must match the claimed family, PE/ELF/Mach-O refused whatever the name, text that must really be text, and ZIP-family files read through their central directory only (no decompression) — no executables, nested archives, symlinks or path traversal in a .zip; no macros, ActiveX or embedded OLE packages in Office/OpenDocument; no VBA project or packaged object in legacy OLE2; no embedded object in RTF. New endpoints (behind APIService's key/origin/rate gate, session-token authorized): - POST **************** (multipart "files", 1-5, 25 MB each) - GET|HEAD …/attachments/{objImgId} and …/preview (same safety headers as the member route, now shared through AttachmentResponses) - POST …/messages accepts "attachments": [{imgId, sortId}] — only the visitor's own uploads into this conversation; history rows carry attachments in the member shape. Visitor files are stored like any chat attachment (CHAT_ATTACHMENT, the session guid, created by the org's system member) so the agent's window renders them unchanged. sendSupportMessage now announces everything (NATS frame with attachments, activity with hasAttachments, pending count) after commit, and is @RetryOnDbConflict.
