A security- and stability-focused patch release. Hardens the API surface,
clears a critical dependency advisory, and resolves a batch of self-hosting
bugs. Backward compatible except for the two upgrade notes below.
Security
- Path traversal in storage import:
StorageServiceextracted tar archive
entries (and read/wrote files) using unvalidated paths, allowing writes
outside the storage root. Added a path-containment check on local read/write.
Fixes #151. (#207) - Broken access control on infrastructure endpoints: every
/api/infra/*
mutating and data-exfiltration endpoint (config, restart, export-data,
import-data, storage/export, storage/import) required only any valid API key.
They now require the ADMIN role. (#207) - X-Forwarded-For IP spoofing:
ApiKeyGuardtrusted the client-controllable
X-Forwarded-Forheader for the per-keyallowedIpswhitelist. It now ignores
it by default and only honours it for configuredTRUSTED_PROXIES. (#211) - Fail-closed IP whitelist: a key with an
allowedIpswhitelist but an
undetermined client IP previously skipped the check (failed open); it now
rejects. The QR endpoint (GET /sessions/:id/qr) now requiresOPERATOR. (#213) - Bull Board queue UI (
/api/admin/queues) was reachable unauthenticated;
it now requires an ADMIN API key. (#214) - Critical dependency advisory: bumped
concurrentlyto v10 to clear the
criticalshell-quoteadvisories. (#208)
Fixed
- Swagger UI now sends the
X-API-Keyheader (global security scheme). Fixes #173. (#109) - Dashboard Docker build failed on the Vite 8 /
@vitejs/plugin-reactv5 peer
conflict; upgraded the plugin to v6. Fixes #103, #123, #197. (#136) - Bulk send (
/messages/send-bulk) returned 400 for text-only messages
(missing@IsOptional()on media fields). Fixes #192. (#193) - Group participant endpoints returned 400 because their DTOs lacked
class-validatordecorators. Fixes #190. (#210) - Cross-platform
postinstall: replaced POSIX-only shell syntax that broke
npm installon Windows. Fixes #181. (#209) - Controllers now throw proper NestJS HTTP exceptions instead of generic
Error
(correct 400/404 instead of 500). (#102) - Dashboard QR modal shows a loading state and keeps polling until ready. (#97)
- Traefik dashboard image now proxies
/apiand/socket.io. Fixes #116. (#131) - Wired the documented
API_MASTER_KEYenv var into the initial key seed. Fixes #153. (#133) - Fixed the
Locationconstructor ESM/CJS interop in the whatsapp-web.js adapter. (#186) - Incoming webhook messages now include location data for location messages. (#202)
Changed
- Lint is now enforced:
lintruns ESLint in check mode (fails on
violations) with a newlint:fixfor local auto-fixing; fixed the latent
lint issues this surfaced across the codebase. (#208) - CI publishes multi-arch Docker images (
linux/amd64+linux/arm64).
Closes #164. (#166)
Added
- Documented the API key management endpoints. Closes #110. (#130)
- Indonesian Docker deployment guide and an API-spec diagram fix. (#188, #189)
Dependencies
- Dependabot minor/patch group (NestJS, BullMQ, Bull Board, helmet, ioredis,
etc.) and@types/uuidv11. (#194, #143)
Upgrade notes
- Infrastructure endpoints are now ADMIN-only. Integrations calling
/api/infra/config|restart|export-data|import-data|storage/*with a
non-admin key will now receive an auth error; use an ADMIN key. - Reverse-proxy + per-key
allowedIps: if you run behind Traefik/nginx and
restrict keys by IP, setTRUSTED_PROXIES(e.g.TRUSTED_PROXIES=172.18.0.0/16)
so the real client IP is resolved; otherwiseX-Forwarded-Foris ignored.