@fedify/fedify
Version:
An ActivityPub server framework
417 lines (416 loc) • 9.05 kB
JavaScript
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 {};