feat(collab): apparaatverificatie die bewaard blijft (#978 Blok A) #1074

Merged
brenno merged 6 commits from feat/provenance-signature-978 into main 2026-08-01 13:14:50 +00:00
Owner

#978 Fase 2, Blok A — apparaatverificatie die bewaard blijft

Sluitstuk van de kernwaarde-fase, eerste van drie blokken. Verificatie van een mede-auteur (out-of-band vingerafdruk) wordt nu gepind en onthouden, zodat een apparaat dat je ooit vergeleek geverifieerd blijft — ook na herstart en in een volgende sessie.

Wat erin zit

  • TOFU trust-store (collab_trust_store.dart): per account in de keychain; TrustState = unverified / verified / mismatch. Een apparaat dat je pinde en dat later met een andere identiteit opduikt, is de luide mismatch — het teken van een impersonerende relay.
  • Verificatiedialoog: markeren, intrekken, mismatch-waarschuwing; ontkoppeld van Riverpod (participants-getter + pin/unpin-callbacks) zodat hij als los widget te toetsen is.
  • Live-sessiebanner (collab_verify_banner.dart): self-hiding; verdwijnt zodra elk apparaat gepind is. Geen cryptische "unable to decrypt".
  • Bug meegenomen: een apparaat las zijn eigen nl.ocideck.device-publicatie terug en verscheen óók als ongeverifieerde peer — gefixt.
  • 31 talen (make add-l10n), docs (SOURCE_MAP/USER_GUIDE/CHANGELOG).

Poort & scans

make check groen; make check-secrets + make sast schoon. Geen dependency-wijziging (geen SBOM). Rebased op verse main (#1073 collab-module); chatMessages/trustRevision als unie samengevoegd.

Bewaker

Bewaker-blik: akkoord — raakt het .md/formaat niet, geen nieuwe partij en geen netwerkuitgang (verlaagt juist het vertrouwen in de relay), opslag lokaal in de keychain (publieke sleutels), belofte eerlijk begrensd tot wat TOFU biedt.

Bewuste afweging

De mismatch-tak biedt een "Toch opnieuw vertrouwen"-knop (voor een echt heringericht apparaat). Veiligheid-tegen-gemak: de handeling is expliciet en luid (rode iconen/tekst blijven staan), geen stille dismiss.

Bekende follow-up (naar Blok B)

Bij het verwijderen van een Matrix-account worden collab-secrets nog niet geveegd — dit geldt al voor de device-seeds (deleteCollabDeviceSeeds was óók nergens aangeroepen) en nu ook voor de trust-pins. Wordt gewired in Blok B (seed-/identiteitslevenscyclus).

Context

Ontwerp Blok C (herkomstbewijs) staat al vast in docs/design/PROVENANCE_SIGNATURE.md (getoetst: bewaker + security-architect + jurist). Blok B (herstelsleutel) en Blok C volgen.

## #978 Fase 2, Blok A — apparaatverificatie die bewaard blijft Sluitstuk van de kernwaarde-fase, eerste van drie blokken. Verificatie van een mede-auteur (out-of-band vingerafdruk) wordt nu **gepind en onthouden**, zodat een apparaat dat je ooit vergeleek geverifieerd blijft — ook na herstart en in een volgende sessie. ### Wat erin zit - **TOFU trust-store** (`collab_trust_store.dart`): per account in de keychain; `TrustState` = unverified / verified / mismatch. Een apparaat dat je pinde en dat later met een *andere* identiteit opduikt, is de luide **mismatch** — het teken van een impersonerende relay. - **Verificatiedialoog**: markeren, intrekken, mismatch-waarschuwing; ontkoppeld van Riverpod (participants-getter + pin/unpin-callbacks) zodat hij als los widget te toetsen is. - **Live-sessiebanner** (`collab_verify_banner.dart`): self-hiding; verdwijnt zodra elk apparaat gepind is. Geen cryptische "unable to decrypt". - **Bug meegenomen**: een apparaat las zijn eigen `nl.ocideck.device`-publicatie terug en verscheen óók als ongeverifieerde peer — gefixt. - 31 talen (make add-l10n), docs (SOURCE_MAP/USER_GUIDE/CHANGELOG). ### Poort & scans `make check` groen; `make check-secrets` + `make sast` schoon. Geen dependency-wijziging (geen SBOM). Rebased op verse main (#1073 collab-module); `chatMessages`/`trustRevision` als unie samengevoegd. ### Bewaker Bewaker-blik: **akkoord** — raakt het `.md`/formaat niet, geen nieuwe partij en geen netwerkuitgang (verlaagt juist het vertrouwen in de relay), opslag lokaal in de keychain (publieke sleutels), belofte eerlijk begrensd tot wat TOFU biedt. ### Bewuste afweging De **mismatch**-tak biedt een "Toch opnieuw vertrouwen"-knop (voor een echt heringericht apparaat). Veiligheid-tegen-gemak: de handeling is expliciet en luid (rode iconen/tekst blijven staan), geen stille dismiss. ### Bekende follow-up (naar Blok B) Bij het verwijderen van een Matrix-account worden collab-secrets nog niet geveegd — dit geldt al voor de device-seeds (`deleteCollabDeviceSeeds` was óók nergens aangeroepen) en nu ook voor de trust-pins. Wordt gewired in Blok B (seed-/identiteitslevenscyclus). ### Context Ontwerp Blok C (herkomstbewijs) staat al vast in `docs/design/PROVENANCE_SIGNATURE.md` (getoetst: bewaker + security-architect + jurist). Blok B (herstelsleutel) en Blok C volgen.
Vastgelegd design voor de cryptografische eigenaar-ondertekening (Fase 2,
Blok C): een provenance-blok in de bestaande .seal.json-sidecar, getekend
met de collab-Ed25519-identiteit over de zegelhash. Getoetst door bewaker,
security-architect en jurist (akkoord-mits); hun voorwaarden zijn verwerkt.

FILE_FORMAT §6.6 krijgt een vooruitwijzende noot (geen tabelrij tot de code
er is); COLLABORATION §10 Fase 2 verwijst naar het ontwerp.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Een geverifieerd apparaat blijft geverifieerd, ook na herstart en in een
volgende sessie. Nieuwe CollabTrustStore (keychain, per account) pint de
identiteitssleutel van een peer; de verificatiedialoog toont per apparaat
geverifieerd / niet geverifieerd / wijkt-af en biedt markeren, intrekken en —
bij een echte heronboarding — bewust opnieuw vertrouwen. Een afwijkende
identiteit van een eerder gepind apparaat is de luide mismatch-toestand.

CollabParticipant draagt nu de ruwe identiteitssleutel + TrustState; de dialoog
is ontkoppeld van Riverpod (participants-getter + pin/unpin-callbacks) zodat hij
zich als los widget laat toetsen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Een actieve Matrix-sessie met een nog niet geverifieerd of afwijkend apparaat
toont een slanke amberkleurige banner boven de werkruimte; één tik opent de
vingerafdrukvergelijking. Geen cryptische 'unable to decrypt' — een heldere,
door-verifiëren-verdwijnende melding (SELF_ENCRYPTED_RELAY §5.3). Verdwijnt
zodra elk apparaat gepind is (via trustRevision).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Een apparaat leest zijn eigen nl.ocideck.device-publicatie terug, waardoor het
in de deelnemerslijst óók als (ongeverifieerde) peer verscheen — de host kon
zichzelf niet verifiëren en de banner bleef staan. Peer met het eigen device-id
wordt nu overgeslagen. Provider-test dekt de trust-verrijking, pinnen en het
overleven van de pin na opnieuw hosten/joinen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De ongeverifieerd-apparaat-banner verhuist naar een eigen, self-hiding widget
(CollabVerifyBanner + testbare CollabVerifyBannerView), zodat
app_shell_main_layout.dart onder de grootte-basislijn blijft en beide takken
widget-getest zijn. Docs bijgewerkt (SOURCE_MAP: trust-store + TrustState;
USER_GUIDE: verificatie blijft bewaard; CHANGELOG). Provider-test dekt nu ook
unpin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chore(l10n): vertaal apparaatverificatie-teksten (#978, Blok A)
All checks were successful
scans / scans (pull_request) Successful in 3m32s
6669ff01a2
Tien nieuwe interfaceteksten voor apparaatverificatie in alle 31 talen
(make add-l10n). Toon: apparaatverificatie/vertrouwen, geen 'handtekeningen'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit cc82d38022 into main 2026-08-01 13:14:50 +00:00
Sign in to join this conversation.
No description provided.