fix(hub): device-handtekening onafhankelijk van wire-codering (IDEA-183, schema v2) #167
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/Scrum4Me!167
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/hub-signature-canonicalisatie"
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?
Het deelnemer-filter in de hub-inbox gaf altijd 401. Oorzaak: de canonieke string werd aan de twee kanten uit verschillende bronnen opgebouwd — de client tekende de letterlijke querystring die hij verstuurde, de server
url.pathname + url.searchvan een heropgebouwde URL, en Next codeert daarbij:naar%3A. Elke query-waarde met zo'n teken faalde.Gevonden tijdens de M33-e2e-gate (item 3), gediagnosticeerd met een tijdelijk testapparaat tegen de draaiende server:
%3Atekenen en:versturen gaf 200, andersom 401 — dus de server rekent altijd met%3A. Direct en via Caddy identiek, dus de proxy was niet de oorzaak.De fix
Schema v2: beide kanten percent-decoderen het request-target naar bytes en bouwen het opnieuw op volgens één opgeschreven regel. Daarmee is niet dit ene geval opgelost maar de hele klasse — hoe een laag onderweg normaliseert doet niet meer ter zake.
canonicalTarget(pathname, search)in TypeScript én Swift, gehouden door één gedeeld vectorbestand (tests/fixtures/hub-canonical-target.json, 21 vectoren) dat beide kanten lezen.X-Hub-Sig-Version: 2kiest het schema per verzoek; het versienummer staat óók ín de ondertekende tekst, dus sleutelen aan die header kan een verzoek alleen laten falen. v1 en v2 zijn per constructie disjunct (v1 begint metmethod.toUpperCase(), v2 met de kleine lettersv2).+in een v2-querystring geeft 400:url.searchParamsleest+als spatie en%2Bals plus terwijl beide dezelfde canonieke string opleveren — één handtekening zou anders twee betekenissen dekken.+nu als%2Bop de lijn (handtekening-neutraal), zodat hij niet tegen die eigen 400 aanloopt.Uitrolvolgorde — dwingend
Server eerst, iOS-build daarna. De server accepteert tijdelijk beide schema's; een ontbrekende header betekent v1, dus de nu geïnstalleerde app blijft ongestoord werken. De nieuwe build tekent uitsluitend v2 en heeft géén terugval — andersom uitrollen legt de hub stil.
Voorwaarde vóór TestFlight: aantonen dat
X-Hub-Sig-Versiondoor Caddy heen komt. Strippt een tussenlaag die header, dan valt de server terug op v1 en krijgt de nieuwe app op álles 401 — niet te onderscheiden van de bug die we repareren. De zevenrijige verificatiematrix (direct én via Caddy) staat indocs/runbooks/hub-device-signature.md.Schema 1 verdwijnt in een aparte PR, pas ná bevestiging dat de nieuwe build draait.
Verificatie
d0a823a:npm ci && npm run verify && npm run build && git diff --exit-code.npm run verify: 2047 tests.npm run ios:test: 58/58.De unittests kunnen het productiedefect níét reproduceren — een kale
new Requestlaat de dubbele punt ongemoeid. Dat staat expliciet in de spec en het runbook; het bewijs komt van de eigenschapstest en van de live verificatie ná deploy.🤖 Generated with Claude Code
De bestaande raw-+ test dekte alleen ?p=a+b (een waarde). De guard zelf (url.search.includes('+')) dekt sleutels al door constructie, maar de regel in route-helpers-server.ts spreekt expliciet over sleutels én waarden ("?a+b=1 is hetzelfde defect op de naam") — dus hoort er ook een test voor te zijn: ?p+q=a. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>Verdict: APPROVED
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
Review-notities
lib/hub/route-helpers-server.ts:60behoudt backwards compatibility door schema 1 als default te laten werken wanneerX-Hub-Sig-Versionontbreekt, en schakelt schema 2 alleen expliciet in.lib/hub/signature-server.ts:44enios/Hub/Sources/Hub/Core/CanonicalTarget.swift:1implementeren dezelfde byte-gebaseerde canonicalisatie met gedeelde fixture-dekking.__tests__/lib/hub/route-helpers.test.ts:120,__tests__/lib/hub/canonical-target.test.ts:1enios/Hub/Tests/HubTests/CanonicalTargetTests.swift:1dekken regressies rond v1/v2-keuze, gecodeerde versus ongecodeerde:, rauwe+, en Swift/TypeScript-vectorpariteit.docs/runbooks/hub-device-signature.md:1legt de signing-invariant en route-handler-waarschuwingen vast, passend bij de product-doc standaarden voor Hub-werk.