XMPP: geen ping/keepalive — NAT-idle timeout killt de sessie stil (geen reconnect tot TCP ook drop is) #1418
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#1418
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— de sessie stuurt geen XMPP ping (XEP-0199) of whitespace keepalive. De enige detectie van een dode verbinding is de TCP-close (_FrameReader._onDone), die pas komt als het besturingssysteem de verbinding als dood beschouwt.Wat er gebeurt
Een NAT-router of firewall die idle verbindingen na 30–120 seconden dropt (een veelvoorkomende standaard), killt de TCP-verbinding stil — de client merkt dit pas als hij iets probeert te verzenden (dan komt een RST) of als de OS-keepalive (typisch 2 uur) de verbinding als dood markeert. In de tussentijd denkt de sessie dat hij live is (
_live = true), maar er komt niets binnen en niets gaat weg.De reconnect-mechanisme (
_onStreamDropped) triggert pas als_FrameReader._onDoneof_onErrorvuurt — wat bij een stille NAT-drop pas na de OS-TCP-keepalive-timeout (vaak uren) of helemaal niet gebeurt.Trust boundary
Netwerk (NAT/firewall) → Applicatie (sessie-levendigheid).
Impact
De samenwerking bevriest stil na een NAT-idle-timeout. De gebruiker ziet geen foutmelding — de UI toont nog steeds "verbonden", maar geen presence/ops/chat komen binnen en niets gaat weg. De reconnect start pas (als al geconfigureerd) nadat de TCP-verbinding ook daadwerkelijk drop is, wat uren kan duren.
Dit is het meest waarschijnlijke unhappy-flow scenario voor een samenwerkingssessie in de praktijk — netwerkonderbrekingen door NAT/firewall zijn alledaags.
Oplossingsrichting
<iq type=get><ping xmlns=urn:xmpp:ping/></iq>(bijv. elke 60 seconden). Als de server niet antwoordt binnen de timeout, beschouw de verbinding als dood en trigger_onStreamDropped.Locatie
lib/xmpp/xmpp_session.dart— geen ping-logica aanwezig;_startDispatch(regels 498–509) alleen inbound, geen periodieke outbound.lib/xmpp/xmpp_frame_transport_io.dart— geen WebSocket-level ping geconfigureerd.Severity
HIGH — dit is het meest waarschijnlijke unhappy-flow scenario in de praktijk.