UNPKG

@fedify/fedify

Version:

An ActivityPub server framework

417 lines (416 loc) • 9.05 kB
import "@js-temporal/polyfill"; import "urlpattern-polyfill"; globalThis.addEventListener = () => {}; import { i as validateAcceptSignature, n as fulfillAcceptSignature, r as parseAcceptSignature, t as formatAcceptSignature } from "../accept-CPkZzmGN.mjs"; import { test } from "@fedify/fixture"; import { deepStrictEqual, strictEqual } from "node:assert/strict"; //#region src/sig/accept.test.ts test("parseAcceptSignature(): single entry", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"@method\" \"@target-uri\")"), [{ label: "sig1", components: [{ value: "@method", params: {} }, { value: "@target-uri", params: {} }], parameters: {} }]); }); test("parseAcceptSignature(): multiple entries", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"@method\"), sig2=(\"@authority\")"), [{ label: "sig1", components: [{ value: "@method", params: {} }], parameters: {} }, { label: "sig2", components: [{ value: "@authority", params: {} }], parameters: {} }]); }); test("parseAcceptSignature(): all six parameters", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"@method\");keyid=\"k1\";alg=\"rsa-v1_5-sha256\";created;expires;nonce=\"abc\";tag=\"t1\""), [{ label: "sig1", components: [{ value: "@method", params: {} }], parameters: { keyid: "k1", alg: "rsa-v1_5-sha256", created: true, expires: true, nonce: "abc", tag: "t1" } }]); }); test("parseAcceptSignature(): preserves string component parameters", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"@query-param\";name=\"foo\" \"@method\")"), [{ label: "sig1", components: [{ value: "@query-param", params: { name: "foo" } }, { value: "@method", params: {} }], parameters: {} }]); }); test("parseAcceptSignature(): preserves boolean component parameters", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"content-type\";sf \"content-digest\";bs)"), [{ label: "sig1", components: [{ value: "content-type", params: { sf: true } }, { value: "content-digest", params: { bs: true } }], parameters: {} }]); }); test("parseAcceptSignature(): preserves multiple parameters on one component", () => { deepStrictEqual(parseAcceptSignature("sig1=(\"@request-response\";key=\"sig1\";req)"), [{ label: "sig1", components: [{ value: "@request-response", params: { key: "sig1", req: true } }], parameters: {} }]); }); test("parseAcceptSignature(): malformed header", () => { deepStrictEqual(parseAcceptSignature("not a valid structured field"), []); deepStrictEqual(parseAcceptSignature(""), []); }); test("formatAcceptSignature(): single entry with created", () => { const members = [{ label: "sig1", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} } ], parameters: { created: true } }]; deepStrictEqual(parseAcceptSignature(formatAcceptSignature(members)), members); }); test("formatAcceptSignature(): created + nonce", () => { const members = [{ label: "sig1", components: [{ value: "@method", params: {} }], parameters: { created: true, nonce: "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk" } }]; deepStrictEqual(parseAcceptSignature(formatAcceptSignature(members)), members); }); test("formatAcceptSignature(): multiple entries", () => { const members = [{ label: "sig1", components: [{ value: "@method", params: {} }], parameters: {} }, { label: "sig2", components: [{ value: "@authority", params: {} }, { value: "content-digest", params: {} }], parameters: { tag: "app-123" } }]; deepStrictEqual(parseAcceptSignature(formatAcceptSignature(members)), members); }); test("formatAcceptSignature(): round-trip with all parameters", () => { const input = [{ label: "sig1", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} }, { value: "content-digest", params: {} } ], parameters: { keyid: "test-key-rsa-pss", alg: "rsa-pss-sha512", created: true, expires: true, nonce: "abc123", tag: "app-123" } }]; deepStrictEqual(parseAcceptSignature(formatAcceptSignature(input)), input); }); test("formatAcceptSignature(): round-trip with parameterized components", () => { const input = [{ label: "sig1", components: [ { value: "@query-param", params: { name: "foo" } }, { value: "content-type", params: { sf: true } }, { value: "@method", params: {} } ], parameters: { created: true } }]; deepStrictEqual(parseAcceptSignature(formatAcceptSignature(input)), input); }); test("validateAcceptSignature(): filters out @status", () => { const valid = { label: "sig1", components: [{ value: "@method", params: {} }, { value: "@target-uri", params: {} }], parameters: {} }; const invalid = { label: "sig2", components: [{ value: "@method", params: {} }, { value: "@status", params: {} }], parameters: {} }; deepStrictEqual(validateAcceptSignature([valid]), [valid]); deepStrictEqual(validateAcceptSignature([invalid]), []); deepStrictEqual(validateAcceptSignature([valid, invalid]), [valid]); }); test("validateAcceptSignature(): passes entries with parameterized components", () => { const members = [{ label: "sig1", components: [{ value: "@query-param", params: { name: "foo" } }, { value: "@method", params: {} }], parameters: {} }]; deepStrictEqual(validateAcceptSignature(members), members); }); test("fulfillAcceptSignature(): compatible alg and keyid", () => { deepStrictEqual(fulfillAcceptSignature({ label: "sig1", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "content-digest", params: {} } ], parameters: { alg: "rsa-v1_5-sha256", keyid: "https://example.com/key", nonce: "abc", tag: "t1" } }, "https://example.com/key", "rsa-v1_5-sha256"), { label: "sig1", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "content-digest", params: {} } ], nonce: "abc", tag: "t1", expires: void 0 }); }); test("fulfillAcceptSignature(): incompatible alg", () => { strictEqual(fulfillAcceptSignature({ label: "sig1", components: [{ value: "@method", params: {} }], parameters: { alg: "ecdsa-p256-sha256" } }, "https://example.com/key", "rsa-v1_5-sha256"), null); }); test("fulfillAcceptSignature(): incompatible keyid", () => { strictEqual(fulfillAcceptSignature({ label: "sig1", components: [{ value: "@method", params: {} }], parameters: { keyid: "https://other.example/key" } }, "https://example.com/key", "rsa-v1_5-sha256"), null); }); test("fulfillAcceptSignature(): components returned exactly as requested", () => { deepStrictEqual(fulfillAcceptSignature({ label: "sig1", components: [{ value: "content-digest", params: {} }], parameters: {} }, "https://example.com/key", "rsa-v1_5-sha256").components, [{ value: "content-digest", params: {} }]); }); test("fulfillAcceptSignature(): no alg/keyid constraints", () => { deepStrictEqual(fulfillAcceptSignature({ label: "custom", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} } ], parameters: {} }, "https://example.com/key", "rsa-v1_5-sha256"), { label: "custom", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} } ], nonce: void 0, tag: void 0, expires: void 0 }); }); test("fulfillAcceptSignature(): passes through expires when requested", () => { const result = fulfillAcceptSignature({ label: "sig1", components: [ { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} } ], parameters: { expires: true } }, "https://example.com/key", "rsa-v1_5-sha256"); strictEqual(result != null, true); strictEqual(result.expires, true); }); test("fulfillAcceptSignature(): preserves component parameters in result", () => { const result = fulfillAcceptSignature({ label: "sig1", components: [ { value: "@query-param", params: { name: "foo" } }, { value: "@method", params: {} }, { value: "@target-uri", params: {} }, { value: "@authority", params: {} } ], parameters: {} }, "https://example.com/key", "rsa-v1_5-sha256"); strictEqual(result != null, true); deepStrictEqual(result.components.find((c) => c.value === "@query-param"), { value: "@query-param", params: { name: "foo" } }); }); //#endregion export {};