From 34a705390cb29b1088794ebf1ac6bf5bc8c60fa7 Mon Sep 17 00:00:00 2001 From: sysops Date: Fri, 28 Aug 2026 09:06:05 +0200 Subject: [PATCH] =?UTF-8?q?API-07:=20test-fix=20=E2=80=94=20signaturvergle?= =?UTF-8?q?ich=20gegen=20tatsaechlich=20empfangene=20bytes=20(jsonb-kanoni?= =?UTF-8?q?sierung)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/webhook/webhook_test.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/internal/webhook/webhook_test.go b/internal/webhook/webhook_test.go index 5273127..2f78674 100644 --- a/internal/webhook/webhook_test.go +++ b/internal/webhook/webhook_test.go @@ -27,7 +27,6 @@ func setupTest(t *testing.T) (*Store, *pgxpool.Pool, func()) { t.Fatalf("pool: %v", err) } if _, err := pool.Exec(ctx, ` - CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE TABLE IF NOT EXISTS webhook_subscriptions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), event_type TEXT NOT NULL, target_url TEXT NOT NULL, secret TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() @@ -99,13 +98,21 @@ func TestEnqueueAndProcessDue_DeliversSuccessfully(t *testing.T) { t.Fatalf("status = %q, want %q", status, StatusDelivered) } - expectedPayload, _ := json.Marshal(map[string]string{"file_id": "42"}) - expectedSig := Sign("geheimes-secret", expectedPayload) - if receivedSignature != expectedSig { - t.Fatalf("empfangene signatur = %q, want %q", receivedSignature, expectedSig) + // Postgres' JSONB-Spalte kann die Byte-Repraesentation des Payloads + // gegenueber dem urspruenglichen json.Marshal kanonisieren (z.B. + // Leerzeichen) — das ist unschaedlich, denn der Dispatcher signiert + // IMMER exakt die Bytes, die er auch sendet. Die Pruefung vergleicht + // deshalb Signatur gegen tatsaechlich empfangene Bytes (Selbstkonsistenz), + // nicht gegen eine unabhaengig neu marshalte Referenz. + if !VerifySignature("geheimes-secret", receivedBody, receivedSignature) { + t.Fatalf("empfangene signatur %q passt nicht zum empfangenen payload %q", receivedSignature, receivedBody) } - if string(receivedBody) != string(expectedPayload) { - t.Fatalf("empfangener payload = %q, want %q", receivedBody, expectedPayload) + var decoded map[string]string + if err := json.Unmarshal(receivedBody, &decoded); err != nil { + t.Fatalf("empfangener payload nicht als json lesbar: %v", err) + } + if decoded["file_id"] != "42" { + t.Fatalf("empfangener payload = %v, want file_id=42", decoded) } }