Security nudge never shows while a dismissed Kuma announcement is still posted #307

Closed
opened 2026-10-04 23:53:35 -04:00 by jared · 0 comments
Owner

SecurityBanner stays hidden whenever a status strip would be showing (src/app/features/security-nudge/SecurityBanner.tsx):

const otherStrip = syncLost || !!pickBanner(serverStatus, { syncLost, where: 'client' });

It calls pickBanner without the dismissed set that ServerStatusBanner passes. An announcement the user has already dismissed therefore still counts as "another strip". Nothing is on screen, and the nudge is suppressed anyway.

Repro (Playwright; aud_bob has no key backup; the nudge record was aged past the 24 h grace period; Kuma routed to a fixture):

  1. With no Kuma announcement, the "Your encryption keys aren't backed up… Set up" strip appears about 23 s after load, as designed.
  2. Post an announcement ("Community call on Friday") on the status page, reload, and dismiss it.
  3. Reload. No strip shows within 75 s, and none will for as long as the announcement stays posted.

Kuma announcements are pinned and often stay up for days or weeks. While one is up, every device that dismissed it never gets the verify-device / connect-backup / setup-backup nudge, which is the one that protects against losing encrypted history. A dismissed "Voice calls are down" strip does the same for the length of an outage.

Fix: pass the same dismissed set (readDismissed() from ServerStatusBanner.tsx, ideally held in shared state so a dismiss updates both), or have ServerStatusBanner publish the banner it actually shows. Unit test: dismissed announcement + setup-backup state → the nudge shows.


Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny 30e2dbcd, cinny-desktop 8f67ec7, element-call 3b0050e8.

`SecurityBanner` stays hidden whenever a status strip would be showing (`src/app/features/security-nudge/SecurityBanner.tsx`): ```ts const otherStrip = syncLost || !!pickBanner(serverStatus, { syncLost, where: 'client' }); ``` It calls `pickBanner` **without** the `dismissed` set that `ServerStatusBanner` passes. An announcement the user has already dismissed therefore still counts as "another strip". Nothing is on screen, and the nudge is suppressed anyway. **Repro** (Playwright; aud_bob has no key backup; the nudge record was aged past the 24 h grace period; Kuma routed to a fixture): 1. With no Kuma announcement, the "Your encryption keys aren't backed up… Set up" strip appears about 23 s after load, as designed. 2. Post an announcement ("Community call on Friday") on the status page, reload, and dismiss it. 3. Reload. No strip shows within 75 s, and none will for as long as the announcement stays posted. Kuma announcements are pinned and often stay up for days or weeks. While one is up, every device that dismissed it never gets the verify-device / connect-backup / setup-backup nudge, which is the one that protects against losing encrypted history. A dismissed "Voice calls are down" strip does the same for the length of an outage. **Fix:** pass the same dismissed set (`readDismissed()` from `ServerStatusBanner.tsx`, ideally held in shared state so a dismiss updates both), or have `ServerStatusBanner` publish the banner it actually shows. Unit test: dismissed announcement + `setup-backup` state → the nudge shows. --- _Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny `30e2dbcd`, cinny-desktop `8f67ec7`, element-call `3b0050e8`._
jared added the bugpriority: lowarea: settings labels 2026-10-04 23:53:35 -04:00
jared closed this issue 2026-10-18 01:49:48 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#307