feat(intake): protocol v1 — uitnodigingslink, info, foutcodes en ondertekende verzoeken (fase 4, stap 1) #2254
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!2254
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/intake-protocol"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat
Fase 4, stap 1: het contract van de inzendserver (FORM_INTAKE.md §6) vastgelegd en de zuivere helft ervan gebouwd — zonder server, zonder netwerk. De server wacht nog op een genoemde beheerder (D3); dit is wat daar niet van afhangt.
docs/design/INTAKE_PROTOCOL.md(CC-BY-4.0, vectoren CC0 — D5): de normatieve tekst. De uitnodigingslink, de handelingen van de invuller (info, het formulier, uploaden, intrekken) en van de redactie (publiceren, token, lijst, ophalen,ack, verwijderen), ondertekende verzoeken, de foutcodes, CORS, wat de server bewaart, bekende grenzen.parseInviteLink):https://<shell>/f/<fid>#api=…&fp=…&t=…, in vaste volgorde gelezen. Een link zonder vingerafdruk is niet compleet en gaat niet verder (§6.4) — geen prompt met een naam uit de bundel zelf.GET /v1/info(parseIntakeInfo): te oud of te nieuw wordt geweigerd, nooit geraden; een pakketplafond boven dat van de client wordt tot dat van de client verlaagd.IntakeErrorCode: een gesloten set met wire-naam en status; een lichaam dat niet van ons is (de pagina van een proxy) geeft toch een fout, via de status.intake_request.dart):Authorization: OciIntake key=…, ts=…, nonce=…, sig=…, Ed25519 over de canonieke JSON van["ocideck-intake-req-v1", host, methode, target, body_sha256, ts, nonce]. De verifier neemt host, methode, target en body-hash die de server kent, nooit wat de header beweert; de query zit intarget, dus een pagineringscursor is onderweg niet te veranderen. Venster ±5 minuten, vóór de handtekening gecontroleerd.IntakeNonceCacheonthoudt een nonce pas nadat het verzoek is geautoriseerd (een vreemde met een eigen sleutel kan hem niet vullen), precies zo lang als detsnog kan slagen, en zegtfullin plaats van er een te vergeten.generic-api-keylastoken/secretplus een waarde met entropie in het vectorbestand en in een testconstante als lek (zes keer). De constante is hernoemd; het vectorbestand — dat per definitie voorbeeldwaarden onder die namen draagt — staat nu als enig bestand in de allowlist van.gitleaks.toml, met de prijs erbij (zoals bijage_testkit):intake_protocol_vector_testrekent elke waarde na en een Dart-bestand blijft gewoon gescand.intake_request.dartis het derde bestand dat primitieven mag importeren (check_packagesregel 10; de poort en zijn test zijn bijgewerkt).Aangepast ten opzichte van het ontwerp (FORM_INTAKE §6.3, nu met een aanvulling)
GET /v1/forms/{fid}geeftvariants(een{bundle, template}per taal) in plaats van{bundle, template, assets}: een bundel bindt één tekst (§7.1, door de eigenaar bevestigd).assetsvervalt — een formulier verwijst in v1 niet naar bestanden.PUT /v1/forms/{fid}publiceert de hele set varianten in één keer; de server verifieert elke bundel zelf tegen de ondertekenaar van het verzoek.token_sha256); de client van de organisator maakt het.statein het formulierantwoord is adviserend; de server dwingt af.Getoetst
ts, nonce, sleutel, handtekening), de noncecache op haar randen.test/fixtures/intake_protocol_vectors.json, CC0): twee ondertekende verzoeken met preimage, body-hash en header, de hashes van een token en een geheim, en links die lezen of geweigerd worden. De handtekeningen en de vingerafdruk zijn onafhankelijk geverifieerd met Node's OpenSSL Ed25519; de test maakt ze byte voor byte opnieuw.make check(ongepiped, exit 0) liep over de boom vóór een laatste kleine wijziging (de hernoeming van één constante in een pakkettest en de gitleaks-allowlist); daarna draaidencheck-static,check-packages,test-packages,check-registrations,check-secrets(gitleaks + trufflehog, ook de historie) ensastopnieuw: groen. De tak loopt niet achter op main.Wat er nog niet is
De bodies van de organisatorhandelingen als types, de referentieserver,
IntakeHttpTransporten de handelingen in de app (Uitnodiging openen…, acceptatie, outbox, binnenhalen van de server), en de webinvuller (die moet nog kunnen verzegelen onder dart2js).