XMPP: stanzas verzonden tijdens reconnect gaan stil verloren — chat lokaal geëchood maar nooit afgeleverd #1417
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1417
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bevinding
lib/xmpp/xmpp_session.dart—sendStanza(regels 590–593) is een no-op als de sessie niet live is:Tijdens een reconnect is
_live = false(regel 516 in_onStreamDropped). Alle stanzas die in die periode worden verzonden, worden stil gedropt — geen fout, geen buffering, geen retry.Wat er gebeurt per kanaal
XmppChat.send): het bericht wordt lokaal geëchood (regel 134–141, vóór_channel.sendStanza) en de gebruiker ziet het direct in de UI. MaarsendStanzadropt het stil. De gebruiker denkt dat zijn bericht is verzonden; andere deelnemers zien het nooit. Er is geen indicator dat het bericht niet is afgeleverd.XmppKeyExchange._sendKeyshare): een keyshare voor een newcomer die net is goedgekeurd, gaat verloren. De newcomer wordt nooit gesleuteld en kan niet meedoen. De autoriteit heeft geen doorzicht dat de keyshare niet aankwam.XmppTransport.sendOp/setLock): een op die tijdens de reconnect wordt verzonden, gaat verloren. De gap→resync-mechanisme vangt dit op de follower-kant (een gemiste op triggert een resync), maar op de autoriteit-kant is er geen follower die een gap detecteert — de autoriteit's eigen op is gewoon weg.XmppPresenceBeacon.announce): de laatste presence wordt bij de volgendeannounceopnieuw verzonden (als de slide veranderd is), dus dit is grotendeels zelfherstellend.Trust boundary
Interne logica — geen externe aanvaller. Een gewone netwerkdrop volstaat.
Impact
Oplossingsrichting
XmppSessioneen korte outbound-queue bijhouden (begrensd, bijv. 64 stanzas).sendStanzavoegt toe aan de queue als!_live; na een geslaagde reconnect spoelt_reconnectde queue naar de nieuwe transport. Bij een fail-closed (max pogingen) wordt de queue gewist.sendStanzabevestigt dat de stanza op de wire is gezet. Een bericht dat in de buffer staat, toont een "verzenden…"-indicator. Dit vereist datsendStanzaeen boolean retourneert of een callback krijgt.ensureKeyedis idempotent en wordt elkesyncNow-ronde aangeroepen — een verloren keyshare wordt op de volgende ronde opnieuw verzonden (als de newcomer nog in de approval-set staat). Dit is grotendeels zelfherstellend, maar de ronde-duur (1 seconde) betekent maximaal 1 seconde vertraging.Locatie
lib/xmpp/xmpp_session.dartregels 590–593 (sendStanza), 515–526 (_onStreamDropped— zet_live = false)lib/xmpp/xmpp_chat.dartregels 124–157 (send— lokale echo vóórsendStanza)lib/xmpp/xmpp_key_exchange.dartregels 170–185 (_sendKeyshare)lib/xmpp/xmpp_transport.dartregels 195–209 (sendOp)Severity
HIGH — chatberichten met valse bevestiging en verloren keyshares zijn het ernstigst.