XMPP: geen chat-geschiedenis (MAM) — late joiners en reconnecters verliezen het hele gesprek #1425

Closed
opened 2026-08-09 18:29:54 +00:00 by brenno · 0 comments
Owner

Bevinding

lib/xmpp/xmpp_chat.dart — de chat-lijst (_messages, regel 106) is puur in-memory en wordt niet gesynchroniseerd met MAM (XEP-0313 Message Archive Management) of enige andere vorm van server-side geschiedenis. Een deelnemer die laat joint of na een reconnect terugkomt, ziet alleen berichten die ná zijn join/return zijn verzonden — het hele eerdere gesprek is weg.

De snapshot-channel (xmpp_snapshot.dart) stuurt wel de deck-baseline opnieuw naar newcomers (de slide-lijst op een versie), maar de chat-geschiedenis is geen onderdeel van de snapshot. Chat en deck zijn gescheiden kanalen.

Wat er gebeurt per scenario

Late joiner: een deelnemer die 10 minuten na sessie-start joinet, ziet geen van de 10 minuten aan chatberichten die al zijn verzonden. Hij ziet alleen berichten vanaf zijn eigen join.

Reconnect: een deelnemer die na een netwerkdrop terugkomt (als reconnect is aangesloten, zie #1421), mist alle chatberichten die tijdens de drop zijn verzonden. De _pending-buffer in chat vangt alleen berichten die ná de reconnect-join zijn ontvangen — niet de berichten die tijdens de drop zijn verzonden.

Nieuwe device van dezelfde gebruiker: een gebruiker die van device wisselt, ziet geen geschiedenis — elk device start met een lege chat-lijst.

Trust boundary

Interne architectuur — geen externe aanvaller. Een normaal unhappy-flow scenario (late join, reconnect, device-wissel) volstaat.

Impact

  • Chat-geschiedenis gaat verloren bij late join, reconnect, en device-wissel.
  • De deelnemer heeft geen context van het eerdere gesprek — in een samenwerkingssessie is dat een UX-stabiliteitsprobleem ("waar hebben jullie het over?").
  • De deck-baseline wordt wel herstuurd (snapshot-channel), dus de slide-state is consistent — alleen de chat is weg.

Oplossingsrichting

  1. XEP-0313 MAM (Message Archive Management): vraag bij join de chat-geschiedenis op via MAM (als de MUC-server dit ondersteunt — Prosody met mod_muc_mam doet dat). De berichten worden verzegeld ontvangen en kunnen worden geopend met de epoch-sleutel. De sealed-id-dedup (§4) voorkomt duplicaten bij overlap met live-ontvangst.
  2. Lokale persistentie: bewaar de chat-lijst lokaal (op het device) zodat een reconnect of herstart de geschiedenis herstelt. Dit dekt reconnect en device-wissel (op hetzelfde device), maar niet late join (de nieuwe deelnemer heeft geen lokale geschiedenis).
  3. Snapshot-uitbreiding: overweeg de chat-geschiedenis op te nemen in de snapshot (de baseline die naar newcomers wordt gestuurd). De afruil is dat de snapshot groter wordt en dat chat-geschiedenis de autoriteit's versie-nummer volgt in plaats van een onafhankelijke stroom.
  4. Minimum: documenteer dat chat-geschiedenis niet beschikbaar is voor late joiners en reconnecters, zodat de gebruiker weet wat hij kan verwachten.

Locatie

  • lib/xmpp/xmpp_chat.dart regels 106–114 (_messages in-memory, geen persistentie of MAM)
  • lib/xmpp/xmpp_snapshot.dart (snapshot dekt alleen deck, niet chat)
  • lib/xmpp/xmpp_collab_launch.dart regels 167–205 (syncNow stuurt baseline naar newcomers, maar geen chat-geschiedenis)

Severity

MEDIUM — geen crash of data-corruptie, maar chat-geschiedenisverlies is een merkbare stabiliteitsprobleem in samenwerking.

## Bevinding `lib/xmpp/xmpp_chat.dart` — de chat-lijst (`_messages`, regel 106) is puur in-memory en wordt niet gesynchroniseerd met MAM (XEP-0313 Message Archive Management) of enige andere vorm van server-side geschiedenis. Een deelnemer die laat joint of na een reconnect terugkomt, ziet alleen berichten die ná zijn join/return zijn verzonden — het hele eerdere gesprek is weg. De snapshot-channel (`xmpp_snapshot.dart`) stuurt wel de **deck-baseline** opnieuw naar newcomers (de slide-lijst op een versie), maar de chat-geschiedenis is geen onderdeel van de snapshot. Chat en deck zijn gescheiden kanalen. ### Wat er gebeurt per scenario **Late joiner:** een deelnemer die 10 minuten na sessie-start joinet, ziet geen van de 10 minuten aan chatberichten die al zijn verzonden. Hij ziet alleen berichten vanaf zijn eigen join. **Reconnect:** een deelnemer die na een netwerkdrop terugkomt (als reconnect is aangesloten, zie #1421), mist alle chatberichten die tijdens de drop zijn verzonden. De `_pending`-buffer in chat vangt alleen berichten die ná de reconnect-join zijn ontvangen — niet de berichten die tijdens de drop zijn verzonden. **Nieuwe device van dezelfde gebruiker:** een gebruiker die van device wisselt, ziet geen geschiedenis — elk device start met een lege chat-lijst. ### Trust boundary Interne architectuur — geen externe aanvaller. Een normaal unhappy-flow scenario (late join, reconnect, device-wissel) volstaat. ### Impact - Chat-geschiedenis gaat verloren bij late join, reconnect, en device-wissel. - De deelnemer heeft geen context van het eerdere gesprek — in een samenwerkingssessie is dat een UX-stabiliteitsprobleem ("waar hebben jullie het over?"). - De deck-baseline wordt wel herstuurd (snapshot-channel), dus de slide-state is consistent — alleen de chat is weg. ### Oplossingsrichting 1. **XEP-0313 MAM (Message Archive Management):** vraag bij join de chat-geschiedenis op via MAM (als de MUC-server dit ondersteunt — Prosody met `mod_muc_mam` doet dat). De berichten worden verzegeld ontvangen en kunnen worden geopend met de epoch-sleutel. De sealed-id-dedup (§4) voorkomt duplicaten bij overlap met live-ontvangst. 2. **Lokale persistentie:** bewaar de chat-lijst lokaal (op het device) zodat een reconnect of herstart de geschiedenis herstelt. Dit dekt reconnect en device-wissel (op hetzelfde device), maar niet late join (de nieuwe deelnemer heeft geen lokale geschiedenis). 3. **Snapshot-uitbreiding:** overweeg de chat-geschiedenis op te nemen in de snapshot (de baseline die naar newcomers wordt gestuurd). De afruil is dat de snapshot groter wordt en dat chat-geschiedenis de autoriteit's versie-nummer volgt in plaats van een onafhankelijke stroom. 4. **Minimum:** documenteer dat chat-geschiedenis niet beschikbaar is voor late joiners en reconnecters, zodat de gebruiker weet wat hij kan verwachten. ### Locatie - `lib/xmpp/xmpp_chat.dart` regels 106–114 (`_messages` in-memory, geen persistentie of MAM) - `lib/xmpp/xmpp_snapshot.dart` (snapshot dekt alleen deck, niet chat) - `lib/xmpp/xmpp_collab_launch.dart` regels 167–205 (`syncNow` stuurt baseline naar newcomers, maar geen chat-geschiedenis) ### Severity MEDIUM — geen crash of data-corruptie, maar chat-geschiedenisverlies is een merkbare stabiliteitsprobleem in samenwerking.
brenno 2026-08-09 20:56:34 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1425
No description provided.