XMPP: _perAddressCount wordt nooit verlaagd — na 8 device-wissels kan een gebruiker permanent niet meer meedoen #1422

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

Bevinding

lib/collab/collab_device_directory.dart — de _perAddressCount-map (regel 74) telt hoeveel distinct device-ids per peer-address zijn opgeslagen. De teller wordt alleen verhoogd (regel 124) bij een nieuw deviceId, en nooit verlaagd — er is geen code die een device verwijdert of de teller decrement.

De cap is perAddressDeviceCap = 8 (regel 64). Een gebruiker die 8 keer van device wisselt (bijv. app herinstalleren, nieuwe laptop, browser-tab met nieuwe identiteit) bereikt permanent de cap. Het 9e device wordt geweigerd (regel 118–120):

if (count >= perAddressDeviceCap) {
  logWarning('collab.device.perAddressCap', keys.deviceId);
  return false;
}

De gebruiker kan niet meer meedoen aan de samenwerking vanaf dat address, ook al zijn de eerste 8 devices allang vertrokken.

Trust boundary

Interne logica — geen externe aanvaller. Een gebruiker die normaal van device wisselt raakt de limiet.

Impact

Na 8 device-rotaties per peer-address is de gebruiker permanent uitgesloten van samenwerking. De teller reset niet bij sessie-einde (de directory is per-sessie geconstrueerd, maar binnen een lange sessie met veel rotaties is het reëel). Voor een productie-samenwerking waar gebruikers meerdere devices hebben (telefoon, laptop, tablet) is 8 een krappe limiet die zonder opruiming permanent kan worden bereikt.

Oplossingsrichting

  1. Verlaag de teller als een device vertrekt. Voeg een remove(deviceId)-methode toe die _peers[deviceId] verwijdert en _perAddressCount[peerAddress] decrement (en verwijder de entry als de teller 0 bereikt). De MUC-rooster kan dit aanroepen bij een unavailable-presence van een device.
  2. Aanvullend: overweeg de teller te baseren op het actuele aantal levende devices per address in plaats van een monotone teller — directory.devicesForAddress(address).length is altijd accuraat, maar O(N) per check. De monotone teller is O(1) maar lekt.
  3. Aanvullend: overweeg de cap te verhogen of een TTL-gebaseerde verdrijving toe te voegen — een device dat langer dan X minuten geen presence heeft gestuurd, wordt uit de directory verwijderd.

Locatie

  • lib/collab/collab_device_directory.dart regel 74 (_perAddressCount-declaratie), regel 117–124 (increment, geen decrement), regel 64 (perAddressDeviceCap = 8)

Severity

MEDIUM — permanent uitsluiting na 8 device-wissels is een stabiliteitsprobleem voor productie-gebruik.

## Bevinding `lib/collab/collab_device_directory.dart` — de `_perAddressCount`-map (regel 74) telt hoeveel distinct device-ids per peer-address zijn opgeslagen. De teller wordt alleen verhoogd (regel 124) bij een nieuw deviceId, en **nooit verlaagd** — er is geen code die een device verwijdert of de teller decrement. De cap is `perAddressDeviceCap = 8` (regel 64). Een gebruiker die 8 keer van device wisselt (bijv. app herinstalleren, nieuwe laptop, browser-tab met nieuwe identiteit) bereikt permanent de cap. Het 9e device wordt geweigerd (regel 118–120): ```dart if (count >= perAddressDeviceCap) { logWarning('collab.device.perAddressCap', keys.deviceId); return false; } ``` De gebruiker kan niet meer meedoen aan de samenwerking vanaf dat address, ook al zijn de eerste 8 devices allang vertrokken. ### Trust boundary Interne logica — geen externe aanvaller. Een gebruiker die normaal van device wisselt raakt de limiet. ### Impact Na 8 device-rotaties per peer-address is de gebruiker permanent uitgesloten van samenwerking. De teller reset niet bij sessie-einde (de directory is per-sessie geconstrueerd, maar binnen een lange sessie met veel rotaties is het reëel). Voor een productie-samenwerking waar gebruikers meerdere devices hebben (telefoon, laptop, tablet) is 8 een krappe limiet die zonder opruiming permanent kan worden bereikt. ### Oplossingsrichting 1. **Verlaag de teller als een device vertrekt.** Voeg een `remove(deviceId)`-methode toe die `_peers[deviceId]` verwijdert en `_perAddressCount[peerAddress]` decrement (en verwijder de entry als de teller 0 bereikt). De MUC-rooster kan dit aanroepen bij een `unavailable`-presence van een device. 2. **Aanvullend:** overweeg de teller te baseren op het actuele aantal levende devices per address in plaats van een monotone teller — `directory.devicesForAddress(address).length` is altijd accuraat, maar O(N) per check. De monotone teller is O(1) maar lekt. 3. **Aanvullend:** overweeg de cap te verhogen of een TTL-gebaseerde verdrijving toe te voegen — een device dat langer dan X minuten geen presence heeft gestuurd, wordt uit de directory verwijderd. ### Locatie - `lib/collab/collab_device_directory.dart` regel 74 (`_perAddressCount`-declaratie), regel 117–124 (increment, geen decrement), regel 64 (`perAddressDeviceCap = 8`) ### Severity MEDIUM — permanent uitsluiting na 8 device-wissels is een stabiliteitsprobleem voor productie-gebruik.
brenno 2026-08-09 20:56:31 +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#1422
No description provided.