feat(forms): Versturen… — een inzending naar de server sturen (fase 4, stap 4) #2257

Merged
brenno merged 6 commits from feat/intake-send into main 2026-10-03 22:08:24 +00:00
Owner

Wat

Fase 4, stap 4: Versturen… — een formulier dat via een uitnodiging werd geopend kan zijn inzending nu naar de server sturen.

  • Eerst verzegelen, lokaal. Pas als de bundel uit de uitnodiging klopt tegen de vingerafdruk uit de link én voor precies het adres van de server is ondertekend (nieuw: expectedApiHost in sealFormSubmission) gaat er iets verder; wat de bundel zelf zegt (gesloten, te groot) komt als zin, nooit als "doorgaan". De pins worden bewaard zodra de bundel is geloofd, ook als het versturen mislukt.
  • De laatste keer dat de invuller kan oordelen, vóór de eerste byte: Naar de redactie van {naam} versturen? Je inzending gaat versleuteld naar {host}; alleen {namen} kunnen hem openen. — met de vingerafdruk onder Details. Het pakket is al verzegeld als het venster opent: wat er staat is waar de inzending aan is dichtgemaakt.
  • IntakeClient.submit: PUT /v1/submissions/{sid} met de uitnodigingstoken, het formulier en alleen de hash van het intrekgeheim. Het aankomstbericht wordt alleen geloofd als het over dit nummer en de hash van deze bytes gaat (noteMismatch anders); 200 (de server had het al) en 201 worden onderscheiden. Een herhaling met hetzelfde nummer, hetzelfde geheim en dezelfde bytes is veilig: de server heeft er één, niet twee.
  • Daarna: de aankomsttijd, de contactregel van de redactie, het begin van een controlegetal om te noemen, en Bewijs bewaren… — <naam>.receipt.json (IntakeReceipt, nieuw in de kern, streng gelezen) met het geheim waarmee de inzending is in te trekken. Het venster zegt dat het aankomstbericht geen bewijs tegen de server is.
  • Als het mislukt blijven de antwoorden in het formulier: Opnieuw proberen (hetzelfde nummer, dezelfde bytes) of Verzegeld opslaan… om te mailen — met een zin per oorzaak: geen verbinding, een adres dat OciDeck niet benadert, een ingetrokken uitnodiging, gesloten, te groot, een drukke server, een bericht over iets anders dan wat is verstuurd.
  • FormSubmissionBuilt draagt het inzendnummer (de naam waaronder de server de inzending kent). De zin bij een verzegeling die niet doorging staat op één plek (form_seal_outcome_text.dart) voor Verzegeld opslaan… en Versturen….
  • 15 nieuwe teksten in 30 talen.

Getoetst

  • IntakeClient.submit tegen de nep-server, die nu de upload doet in de volgorde van het protocol: de kopen die het protocol noemt en niets anders, dat het geheim zelf nergens heen gaat (niet in de URL, de kopen of de body), herhaling, een ander pakket onder hetzelfde nummer, een andere/ingetrokken token, gesloten, onbekend formulier, de grens van max_package_bytes tot op de byte, een drukke server met Retry-After, elke IntakeHttpFailure, vijf soorten antwoord dat geen aankomstbericht is, een 2xx die geen 200/201 is, de tien minuten voor een upload, een poort in het adres.
  • De hele weg vanaf de invulpagina met echte versleuteling: de bevestiging (en dat er vóór het "ja" niets is gevraagd), dat de organisator wat de server bewaart opent, dat het geheim in het bewijs hoort bij de hash die de server kreeg, annuleren, het begin van het controlegetal, het venster dat niet door ernaast tikken sluit (ook niet tijdens het versturen), opslaan dat vastzit, elke foutzin, een herhaling die één inzending oplevert, de verzegelde bytes die zijn geprobeerd, een bundel voor een ander adres / verlopen / voorbij de sluitingsdag (er wordt dan niets verstuurd), en in het Engels.
  • Mutatietoets over de kern (intake_receipt), de client, het venster, de stroom en de zinnen; de eerste ronde liet in het venster een teruggegeven waarde zien die niemand gebruikte (geschrapt) en ontbrekende tests (geschreven).
  • make check (ongepiped, exit 0), check-registrations, check-secrets (gitleaks + trufflehog, alle refs; de testconstante heet kTestInvite en het slechte token wordt gegenereerd — gitleaks las token: '…' als lek), sast, check-packages, test-packages: groen. De tak loopt niet achter op main.

Wat er nog niet is

Intrekken (met het bewijs) en de outbox, de kant van de organisator (publiceren, binnenhalen, token), de server zelf en de webinvuller.

## Wat Fase 4, stap 4: **Versturen…** — een formulier dat via een uitnodiging werd geopend kan zijn inzending nu **naar de server** sturen. - **Eerst verzegelen, lokaal.** Pas als de bundel uit de uitnodiging klopt tegen de vingerafdruk uit de link **én voor precies het adres van de server is ondertekend** (nieuw: `expectedApiHost` in `sealFormSubmission`) gaat er iets verder; wat de bundel zelf zegt (gesloten, te groot) komt als zin, nooit als "doorgaan". De pins worden bewaard zodra de bundel is geloofd, ook als het versturen mislukt. - **De laatste keer dat de invuller kan oordelen**, vóór de eerste byte: *Naar de redactie van {naam} versturen? Je inzending gaat versleuteld naar {host}; alleen {namen} kunnen hem openen.* — met de vingerafdruk onder *Details*. Het pakket is al verzegeld als het venster opent: wat er staat is waar de inzending aan is dichtgemaakt. - **`IntakeClient.submit`**: `PUT /v1/submissions/{sid}` met de uitnodigingstoken, het formulier en **alleen de hash** van het intrekgeheim. Het aankomstbericht wordt alleen geloofd als het over dit nummer en de hash van deze bytes gaat (`noteMismatch` anders); `200` (de server had het al) en `201` worden onderscheiden. Een herhaling met hetzelfde nummer, hetzelfde geheim en dezelfde bytes is veilig: de server heeft er één, niet twee. - **Daarna:** de aankomsttijd, de contactregel van de redactie, het begin van een controlegetal om te noemen, en **Bewijs bewaren…** — `<naam>.receipt.json` (`IntakeReceipt`, nieuw in de kern, streng gelezen) met het geheim waarmee de inzending is in te trekken. Het venster zegt dat het aankomstbericht **geen bewijs tegen de server** is. - **Als het mislukt** blijven de antwoorden in het formulier: *Opnieuw proberen* (hetzelfde nummer, dezelfde bytes) of *Verzegeld opslaan…* om te mailen — met een zin per oorzaak: geen verbinding, een adres dat OciDeck niet benadert, een ingetrokken uitnodiging, gesloten, te groot, een drukke server, een bericht over iets anders dan wat is verstuurd. - `FormSubmissionBuilt` draagt het inzendnummer (de naam waaronder de server de inzending kent). De zin bij een verzegeling die niet doorging staat op één plek (`form_seal_outcome_text.dart`) voor *Verzegeld opslaan…* en *Versturen…*. - 15 nieuwe teksten in 30 talen. ## Getoetst - `IntakeClient.submit` tegen de nep-server, die nu de upload doet **in de volgorde van het protocol**: de kopen die het protocol noemt en niets anders, dat het geheim zelf nergens heen gaat (niet in de URL, de kopen of de body), herhaling, een ander pakket onder hetzelfde nummer, een andere/ingetrokken token, gesloten, onbekend formulier, de grens van `max_package_bytes` tot op de byte, een drukke server met `Retry-After`, elke `IntakeHttpFailure`, vijf soorten antwoord dat geen aankomstbericht is, een 2xx die geen 200/201 is, de tien minuten voor een upload, een poort in het adres. - De hele weg vanaf de invulpagina met echte versleuteling: de bevestiging (en dat er vóór het "ja" niets is gevraagd), **dat de organisator wat de server bewaart opent**, dat het geheim in het bewijs hoort bij de hash die de server kreeg, annuleren, het begin van het controlegetal, het venster dat niet door ernaast tikken sluit (ook niet tijdens het versturen), opslaan dat vastzit, elke foutzin, een herhaling die één inzending oplevert, de verzegelde bytes die zijn geprobeerd, een bundel voor een ander adres / verlopen / voorbij de sluitingsdag (er wordt dan niets verstuurd), en in het Engels. - Mutatietoets over de kern (`intake_receipt`), de client, het venster, de stroom en de zinnen; de eerste ronde liet in het venster een teruggegeven waarde zien die niemand gebruikte (geschrapt) en ontbrekende tests (geschreven). - `make check` (ongepiped, exit 0), `check-registrations`, `check-secrets` (gitleaks + trufflehog, alle refs; de testconstante heet `kTestInvite` en het slechte token wordt gegenereerd — gitleaks las `token: '…'` als lek), `sast`, `check-packages`, `test-packages`: groen. De tak loopt niet achter op main. ## Wat er nog niet is Intrekken (met het bewijs) en de outbox, de kant van de organisator (publiceren, binnenhalen, token), de server zelf en de webinvuller.
<naam>.receipt.json: de server, het formulier, het aankomstbericht en het intrekgeheim, streng gelezen.
PUT /v1/submissions/{sid} met de uitnodigingstoken, het formulier en alleen de hash van het intrekgeheim;
het aankomstbericht wordt alleen geloofd als het over dit nummer en deze bytes gaat. De nep-server
doet de controles in de volgorde van het protocol. FormSubmissionBuilt draagt het inzendnummer;
sealFormSubmission kan toetsen of de bundel voor het adres van de server is ondertekend.
Eerst verzegelen, lokaal, voor het adres van de uitnodiging; dan één vraag met de vingerafdruk onder Details; dan
versturen, het aankomstbericht en het bewijs. Mislukt het, dan blijven de antwoorden staan en is er een
herhaling met hetzelfde nummer en dezelfde bytes, of het verzegelde bestand om te mailen.
Het venster geeft niets meer terug (niemand deed er iets mee); wat er gebeurde zegt het venster zelf.
brenno merged commit b4a6116e7d into main 2026-10-03 22:08:24 +00:00
brenno deleted branch feat/intake-send 2026-10-03 22:08:26 +00:00
Sign in to join this conversation.
No description provided.