Remove inbound request signature verification: the entrypoint UUID is the authentication secret #279
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Owner's decision, 2026-08-24, verbatim: "remove all the inbound request signing crap. the uuid url is the authentication secret."
This reverses #67, which landed in
fcead5donnext. The entrypoint URL is a capability: possession of the UUID authorises submission. Signature verification is removed, not made optional.Pre-1.0, no installed base, no stored data anywhere. This is a straight deletion — no migration, no compatibility path, no data cleanup.
Definition of done
internal/signaturepackage.signature_schemeandsignature_secretfrom theEntrypointmodel, the create and edit forms, and every template.410for a disabled entrypoint.Closes #67 and #241 (#241 is entirely about the forwarding consequences of a signature this removes).
Do NOT add masking or redaction of entrypoint UUIDs anywhere — live UUIDs in
/metricsand Sentry are acceptable per the owner. #254 and #179 stay exactly as landed.Verification
make checkgreen.Owner ruling, 2026-08-24, on the "what this makes load-bearing" section above: live entrypoint UUIDs appearing in
/metricsand in Sentry payloads are acceptable. That section overstated the concern — disregard it.Concretely, for anyone implementing this or reading it later:
What the README should say is unchanged and simple: the entrypoint URL is the authentication secret, anyone holding it can submit events, and rotation means recreating the entrypoint. State it plainly as the design, without alarm and without a threat-model discussion.
Plan. Branch
issue-279-remove-inbound-signing, basenext, one commit.Straight deletion of everything
fcead5dadded, keeping the receiver's other guards untouched:internal/signature/(package + tests).internal/database/model_entrypoint.go: dropSignatureSchemetype and constants, theSignatureScheme/SignatureSecretfields, and theSignatureConfigured/SignatureHalfConfiguredmethods. Vestigial columns in an installed base that does not exist are not a problem, so no migration.internal/handlers/webhook.go: dropverifyInboundSignatureand theSanitizeHeaderscall. The header map is marshalled as received.readWebhookBody(1 MB cap), the410for inactive, and the rate-limit middleware are not touched.internal/handlers/source_management.go: deleteHandleEntrypointSecret,applyEntrypointSecret,storeEntrypointSecretand theSignatureSchemestemplate datum.internal/handlers/entrypoint_view.go: dropConfigured/Scheme/SchemeLabel/SchemeHeaderand the label constants.EntrypointViewstays — it is still the display projection.internal/server/routes.go: drop thePOST /source/{id}/entrypoints/{entrypointID}/secretroute.templates/source_detail.html: remove the Signature line, the Configure/Rotate button, the secret form and itsshowSecretstate.webhook_signature_test.go,entrypoint_secret_test.go,target_http_secret_test.go,migration_entrypoint_test.go; drop the entrypoint cases frommodel_secrets_test.goand theSignatureSchemesdatum fromui_copy_test.go.Inbound Signature Verificationsection, the twoentrypointscolumns and their migration note, the/secretroute row, the tree entries, the feature-list bullet, the resubmit paragraph and the pipeline step. Add a short statement that the entrypoint URL is the authentication secret and that rotation means recreating the entrypoint.There are no config keys to remove — the feature never added any.
Not touched: the delivery-side comments in
redirect.go,target_redact.goandsentry.gothat nameX-Hub-Signature/X-Gitlab-Token. Senders still send those headers; those files are about forwarding and redaction, not about verification.No UUID masking added anywhere.
Verification:
make checkwithGOFLAGS=-count=1, plus a live instance proving an unsigned POST is accepted and delivered, the 1 MB cap, the per-IP rate limit and the disabled-entrypoint410.Done in #281 (branch
issue-279-remove-inbound-signing, basenext). Details are in the PR body; the verification evidence is below.make checkgreen withGOFLAGS=-count=1on the rebased branch: 575 tests, 0 cached, lint in Docker0 issues.On a running instance with an HTTP sink target:
200, and the payload arrived at the sink.X-Hub-Signature-256and a wrongX-Gitlab-Token:200, also delivered. Nothing about the request is checked.200; 1048577-byte body413 Request body too large— the 1 MB cap holds.429— the per-IP receiver limit is exactly as before.410 Gone. Reactivated, the same POST is200again.404.Grep over the tree finds no surviving
signature_scheme,signature_secret,SignatureScheme,SignatureSecret,SanitizeHeaders,HandleEntrypointSecret,verifyInboundSignatureorinternal/signaturein code, templates, config or docs, and noshowSecretstate or secret form field in any template.No masking or redaction of entrypoint UUIDs was added anywhere; #254 and #179 are untouched.
Not merged — that is the caller's.