feat(collab): herstelsleutel voor de apparaatsidentiteit (#978 Blok B) #1079

Merged
brenno merged 6 commits from feat/collab-recovery-key-978 into main 2026-08-01 14:10:18 +00:00
Owner

#978 Fase 2, Blok B — herstelsleutel voor de apparaatsidentiteit

Tweede van drie blokken. De samenwerkingsidentiteit van een apparaat (twee 32-byte seeds in de keychain) wordt draagbaar: exporteer hem als leesbare herstelsleutel en zet dezelfde identiteit op een ander apparaat terug — zodat je vingerafdruk (verificatie) en straks je herkomst-ondertekensleutel (Blok C) meegaan.

Wat erin zit

  • Codec (collab_recovery_key.dart, pure Dart, géén dependency): Crockford-Base32 + CRC-16 tegen typefouten, versiebyte, getypeerde fouten (format/checksum/version). encode/decode + een test vector-achtige round-trip-suite.
  • Store (collab_device_store.dart): recoveryKey() exporteert, importRecoveryKey() herstelt de identiteit op een nieuw apparaat (zelfde identiteitssleutels, gebonden aan het nieuwe device-id), readDeviceSeeds() leest zonder een nieuwe identiteit te munten.
  • UI (Instellingen → Realtime samenwerken → Identiteit & herstelsleutel): tonen (met bewaar-waarschuwing + kopiëren) en herstellen (met heldere fout bij typefout/format/versie). Verschijnt zodra het account is ingevuld.
  • Accountverwijder-sweep: bij het wissen van het Matrix-account worden de collab-secrets (device-seeds én trust-pins) mee geveegd — het door de bewaker bij Blok A gesignaleerde gaatje, nu voor beide gesloten.
  • 31 talen, docs (SOURCE_MAP/USER_GUIDE/CHANGELOG).

Poort & scans

make check groen (in een geïsoleerde worktree, gerebaset op verse origin/main); make check-secrets + make sast schoon. Geen dependency-wijziging (geen SBOM).

Bewaker

Bewaker-blik: akkoord — pure Dart, geen partij/afhankelijkheid, alles lokaal, .md/uitwisselbaarheid onaangeroerd, belofte eerlijk begrensd en versiebestendig, sweep juist.

Bekende bevinding (kleine follow-up)

Bewaker (klein): herstellen overschrijft een bestaande identiteit zonder bevestiging — stil verlies als die niet geback-upt was. Volgt als aparte kleine PR (een overschrijf-bevestiging).

Vervolg

Blok C (herkomstbewijs) heeft een afgetoetst ontwerp (docs/design/PROVENANCE_SIGNATURE.md).

## #978 Fase 2, Blok B — herstelsleutel voor de apparaatsidentiteit Tweede van drie blokken. De samenwerkingsidentiteit van een apparaat (twee 32-byte seeds in de keychain) wordt **draagbaar**: exporteer hem als leesbare herstelsleutel en zet dezelfde identiteit op een ander apparaat terug — zodat je vingerafdruk (verificatie) en straks je herkomst-ondertekensleutel (Blok C) meegaan. ### Wat erin zit - **Codec** (`collab_recovery_key.dart`, pure Dart, géén dependency): Crockford-Base32 + CRC-16 tegen typefouten, versiebyte, getypeerde fouten (format/checksum/version). `encode/decode` + een test vector-achtige round-trip-suite. - **Store** (`collab_device_store.dart`): `recoveryKey()` exporteert, `importRecoveryKey()` herstelt de identiteit op een nieuw apparaat (zelfde identiteitssleutels, gebonden aan het nieuwe device-id), `readDeviceSeeds()` leest zonder een nieuwe identiteit te munten. - **UI** (Instellingen → Realtime samenwerken → *Identiteit & herstelsleutel*): tonen (met bewaar-waarschuwing + kopiëren) en herstellen (met heldere fout bij typefout/format/versie). Verschijnt zodra het account is ingevuld. - **Accountverwijder-sweep**: bij het wissen van het Matrix-account worden de collab-secrets (device-seeds én trust-pins) mee geveegd — het door de bewaker bij Blok A gesignaleerde gaatje, nu voor beide gesloten. - 31 talen, docs (SOURCE_MAP/USER_GUIDE/CHANGELOG). ### Poort & scans `make check` groen (in een geïsoleerde worktree, gerebaset op verse `origin/main`); `make check-secrets` + `make sast` schoon. Geen dependency-wijziging (geen SBOM). ### Bewaker Bewaker-blik: **akkoord** — pure Dart, geen partij/afhankelijkheid, alles lokaal, `.md`/uitwisselbaarheid onaangeroerd, belofte eerlijk begrensd en versiebestendig, sweep juist. ### Bekende bevinding (kleine follow-up) Bewaker (klein): *herstellen overschrijft een bestaande identiteit zonder bevestiging* — stil verlies als die niet geback-upt was. Volgt als aparte kleine PR (een overschrijf-bevestiging). ### Vervolg Blok C (herkomstbewijs) heeft een afgetoetst ontwerp (`docs/design/PROVENANCE_SIGNATURE.md`).
De apparaatsidentiteit (twee 32-byte seeds in de keychain) wordt draagbaar: een
leesbare herstelsleutel (Crockford-Base32 + CRC-16 tegen typefouten, geen
dependency). encodeRecoveryKey/decodeRecoveryKey met getypeerde fouten
(format/checksum/version); CollabDeviceSeeds.recoveryKey() exporteert,
importRecoveryKey() herstelt dezelfde identiteit op een nieuw apparaat (zelfde
vingerafdruk + herkomst-ondertekensleutel, gebonden aan het nieuwe device-id).
readDeviceSeeds() leest zonder een nieuwe identiteit te munten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Instellingen → Samenwerken krijgt 'Identiteit & herstelsleutel': toon de
herstelsleutel (met bewaar-waarschuwing + kopiëren) of herstel een identiteit
uit een geplakte sleutel, met heldere fout bij een typefout/format/versie. De
sectie verschijnt zodra het account is ingevuld (paneel luistert nu op de
account-velden). Bij het verwijderen van het Matrix-account worden de
collab-secrets (device-seeds én trust-pins) mee geveegd — het door de bewaker
gesignaleerde gaatje, nu voor beide gesloten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
dart format splitste de guard over twee regels; curly_braces_in_flow_control
maakt dat fataal onder make check (--fatal-infos). Losse commit i.p.v. squash:
de werkkopie bevat ongerelateerde wijzigingen van een andere sessie, dus een
interactieve rebase kan hier nu niet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
refactor(collab): sweep-helper top-level tegen klasseplafond (#978 Blok B)
Some checks failed
scans / scans (pull_request) Has been cancelled
60dc0f9491
De accountverwijder-sweep als top-level sweepMatrixCollabSecrets i.p.v. inline in
de SettingsNotifier-extensie, zodat de klasseomvang onder de ratchet blijft.
Gedrag ongewijzigd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno force-pushed feat/collab-recovery-key-978 from 60dc0f9491
Some checks failed
scans / scans (pull_request) Has been cancelled
to f5b62ccac3
All checks were successful
scans / scans (pull_request) Successful in 3m29s
2026-08-01 14:10:06 +00:00
Compare
brenno merged commit e9e4f89e77 into main 2026-08-01 14:10:18 +00:00
Sign in to join this conversation.
No description provided.