Skip to content

v0.7.2

Choose a tag to compare

@rmyndharis rmyndharis released this 24 Jun 09:32
· 1462 commits to main since this release

Added

  • Sessions (Baileys): pre-connection chat history is now persisted. On a fresh link Baileys pushes the recent (and, with BAILEYS_SYNC_FULL_HISTORY=true, full) message history via messaging-history.set; these batches are now mapped and saved into the messages table for the chat view, so a newly linked session shows past conversations instead of an empty panel. The batches are de-duplicated and stamped with each message's real timestamp, and are persisted only (no webhook/hook/websocket dispatch, since they predate the live session). Sender push-names from the history are also harvested so chats show names rather than bare ids, and each chat's last-message preview and sort time are seeded from the history so the chat list no longer reads "No messages yet".
  • Sessions (Baileys): chat display names are now backfilled on connect. Baileys 6.7.x frequently skips the initial app-state sync (the state machine goes Online before it runs when the first history notification is non-processable) and the PUSH_NAME sync can fail to decrypt, so chats showed bare ids/numbers. On connection open the adapter now fetches group subjects via groupFetchAllParticipating and re-triggers an app-state resync (best-effort) to recover saved contact names; both are non-fatal and complement the push-names that arrive on live messages.
  • Webhooks: an opt-in WEBHOOK_CONTACT_DETAILS flag enriches the message.received payload's sender contact object with the free, already-cached WhatsApp contact fields — id, number, shortName, type, isMyContact, isWAContact, isBusiness, isEnterprise, verifiedName, verifiedLevel, isBlocked, and labels (IDs) — alongside the existing name/pushName. Off by default (the payload keeps the minimal name/pushName). All fields are read synchronously from the contact already fetched per message, so no extra WhatsApp API calls are made (profile picture and about/status are intentionally excluded to avoid rate-limit/ban risk).

Fixed

  • Sessions (Baileys): when a session is logged out — unlinked from the phone or via the API — the now-invalid on-disk auth state is cleared, so re-linking shows a fresh QR instead of getting stuck silently reloading the dead credentials. (#453 — thanks @ulises2k)
  • Webhooks: registering a webhook (POST /sessions/:id/webhooks) to a host whose DNS lookup rejects (NXDOMAIN, or a transient EAI_AGAIN/ESERVFAIL under resolver pressure) now returns 400 Could not resolve host: <host> (<code>) instead of a generic 500 Internal server error. The SSRF guard's DNS deadline already mapped resolution timeouts and empty results to a 4xx; a rejected lookup leaked the raw DNS error, which surfaced as an intermittent 500 during back-to-back session-create → webhook-register flows.
  • Infrastructure: the dashboard config form no longer shows Server, Webhook, and Rate-Limit sections that were never persisted — they returned a fake "saved" while silently discarding every value. The form now exposes only the settings it actually writes (Database, Redis/Queue, Storage, Engine); the removed settings remain configurable via environment variables.
  • Infrastructure: data export/import (the documented backup and SQLite↔PostgreSQL migration flow) is now complete. It previously exported and restored only sessions, webhooks, messages, and message batches — so a restore silently lost all message templates and stored Baileys messages (cascade-deleted with the old sessions and never re-imported) and dropped every webhook's filters, causing a filtered webhook to come back firing on all events. Templates, stored Baileys messages, and webhook filters now round-trip intact.
  • Engine selection: pinning the engine from the environment works again after the v0.7.1 compose change. The bundled compose files forward ENGINE_TYPE into the container again (- ENGINE_TYPE=${ENGINE_TYPE:-}) and the app treats a blank value as unset, so an .env/host ENGINE_TYPE=baileys is honoured while the dashboard's Infrastructure > Engine selection still wins when no engine is pinned. .env.example no longer ships ENGINE_TYPE pre-pinned. Upgrade note: if you relied on ENGINE_TYPE=baileys in your .env, confirm the active engine after upgrading. (#453 — thanks @ulises2k)

Security

  • Infrastructure: configuration values saved from the dashboard are now rejected if they contain a line break, which could otherwise write an extra KEY=value line into data/.env.generated and inject an arbitrary environment variable on the next boot.