@fedify/fedify 2.0.29-dev.2107 → 2.0.29-dev.2121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{builder-CsI6ZXC9.mjs → builder-CcdhtqZA.mjs} +3 -3
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{deno-CjMqmOHc.mjs → deno-t1Hq3o4g.mjs} +1 -1
  4. package/dist/{docloader-Czq6jsdF.mjs → docloader-DmksBzVa.mjs} +2 -2
  5. package/dist/federation/builder.test.mjs +1 -1
  6. package/dist/federation/handler.test.mjs +6 -6
  7. package/dist/federation/idempotency.test.mjs +2 -2
  8. package/dist/federation/inbox.test.mjs +1 -1
  9. package/dist/federation/middleware.test.mjs +31 -6
  10. package/dist/federation/mod.cjs +1 -1
  11. package/dist/federation/mod.js +1 -1
  12. package/dist/federation/send.test.mjs +3 -3
  13. package/dist/federation/temporal.test.mjs +1 -1
  14. package/dist/federation/webfinger.test.mjs +1 -1
  15. package/dist/{http-VNuWokJg.cjs → http-6cUjmZau.cjs} +6 -2
  16. package/dist/{http-D5vmrVLV.js → http-CBZxo485.js} +6 -2
  17. package/dist/{http-Ba7807Bo.mjs → http-DscVc8UW.mjs} +7 -3
  18. package/dist/{inbox-C18xUe71.mjs → inbox-CKKOBg0X.mjs} +1 -1
  19. package/dist/{key-1YdrFVdl.mjs → key-BMxcDQ7Z.mjs} +1 -1
  20. package/dist/{kv-cache-DRelxPCd.cjs → kv-cache-BV20L2x4.cjs} +1 -1
  21. package/dist/{kv-cache-BIIdI_Cr.js → kv-cache-OZi_bDmv.js} +1 -1
  22. package/dist/{ld-lZDwbdE9.mjs → ld-uaq9Uc9i.mjs} +3 -3
  23. package/dist/{middleware-DAH4XiqU.cjs → middleware-Bhbzx0XA.cjs} +4 -4
  24. package/dist/{middleware-Dqe-7tvB.mjs → middleware-Cf7qPU7x.mjs} +1 -1
  25. package/dist/{middleware-By-XnBx8.mjs → middleware-D5XEd8l9.mjs} +11 -11
  26. package/dist/{middleware-BN9TRImG.cjs → middleware-DUALf6gS.cjs} +1 -1
  27. package/dist/{middleware-D2iI7G04.js → middleware-w_QMTb52.js} +3 -3
  28. package/dist/mod.cjs +4 -4
  29. package/dist/mod.js +4 -4
  30. package/dist/nodeinfo/handler.test.mjs +1 -1
  31. package/dist/{owner-D1HCbj2y.mjs → owner-Ds5LSYBk.mjs} +2 -2
  32. package/dist/{proof-oOsaCl4z.mjs → proof-2v-RNn_n.mjs} +2 -2
  33. package/dist/{proof-Ce-JBAuj.cjs → proof-C5gSPzjd.cjs} +2 -2
  34. package/dist/{proof-DZCZie--.js → proof-zSRThRNk.js} +2 -2
  35. package/dist/{send-D2F0cCVr.mjs → send-Dvu09tKp.mjs} +2 -2
  36. package/dist/sig/http.test.mjs +42 -2
  37. package/dist/sig/key.test.mjs +1 -1
  38. package/dist/sig/ld.test.mjs +5 -2
  39. package/dist/sig/mod.cjs +2 -2
  40. package/dist/sig/mod.js +2 -2
  41. package/dist/sig/owner.test.mjs +1 -1
  42. package/dist/sig/proof.test.mjs +1 -1
  43. package/dist/{temporal-BTCyquNi.mjs → temporal-BAJ8SH-_.mjs} +1 -1
  44. package/dist/utils/docloader.test.mjs +2 -2
  45. package/dist/utils/mod.cjs +1 -1
  46. package/dist/utils/mod.js +1 -1
  47. package/dist/vocab/cjs.test.mjs +1 -1
  48. package/package.json +7 -7
@@ -2,8 +2,8 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError, t as Router } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
6
- import { t as InboxListenerSet } from "./inbox-C18xUe71.mjs";
5
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
6
+ import { t as InboxListenerSet } from "./inbox-CKKOBg0X.mjs";
7
7
  import { getTypeId } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  import { getLogger } from "@logtape/logtape";
@@ -42,7 +42,7 @@ var FederationBuilderImpl = class {
42
42
  this.collectionTypeIds = {};
43
43
  }
44
44
  async build(options) {
45
- const { FederationImpl } = await import("./middleware-Dqe-7tvB.mjs");
45
+ const { FederationImpl } = await import("./middleware-Cf7qPU7x.mjs");
46
46
  const f = new FederationImpl(options);
47
47
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
48
48
  f.router = this.router.clone();
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
6
6
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
7
- import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-By-XnBx8.mjs";
7
+ import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-D5XEd8l9.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  import { Follow, Person } from "@fedify/vocab";
10
10
  //#region src/compat/transformers.test.ts
@@ -3,6 +3,6 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  //#region deno.json
5
5
  var name = "@fedify/fedify";
6
- var version = "2.0.29-dev.2107+5ab4c99b";
6
+ var version = "2.0.29-dev.2121+c46fb9dd";
7
7
  //#endregion
8
8
  export { version as n, name as t };
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { o as validateCryptoKey } from "./key-1YdrFVdl.mjs";
5
- import { n as doubleKnock } from "./http-Ba7807Bo.mjs";
4
+ import { o as validateCryptoKey } from "./key-BMxcDQ7Z.mjs";
5
+ import { n as doubleKnock } from "./http-DscVc8UW.mjs";
6
6
  import { curry } from "es-toolkit";
7
7
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -5,7 +5,7 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { i as assertExists } from "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { n as createFederationBuilder } from "../builder-CsI6ZXC9.mjs";
8
+ import { n as createFederationBuilder } from "../builder-CcdhtqZA.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Activity, Note, Person } from "@fedify/vocab";
11
11
  //#region src/federation/builder.test.ts
@@ -6,14 +6,14 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
- import { i as generateCryptoKeyPair } from "../key-1YdrFVdl.mjs";
10
- import { s as signRequest } from "../http-Ba7807Bo.mjs";
9
+ import { i as generateCryptoKeyPair } from "../key-BMxcDQ7Z.mjs";
10
+ import { s as signRequest } from "../http-DscVc8UW.mjs";
11
11
  import { a as rsaPrivateKey3, c as rsaPublicKey3, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
12
- import { a as compactJsonLd, f as signJsonLd } from "../ld-lZDwbdE9.mjs";
13
- import { n as signObject } from "../proof-oOsaCl4z.mjs";
12
+ import { a as compactJsonLd, f as signJsonLd } from "../ld-uaq9Uc9i.mjs";
13
+ import { n as signObject } from "../proof-2v-RNn_n.mjs";
14
14
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
15
- import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-By-XnBx8.mjs";
16
- import { t as InboxListenerSet } from "../inbox-C18xUe71.mjs";
15
+ import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-D5XEd8l9.mjs";
16
+ import { t as InboxListenerSet } from "../inbox-CKKOBg0X.mjs";
17
17
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
18
18
  import { Create, CryptographicKey, Multikey, Note, Person } from "@fedify/vocab";
19
19
  //#region src/federation/handler.test.ts
@@ -4,9 +4,9 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as ed25519PrivateKey, r as ed25519PublicKey, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
7
- import { n as signObject } from "../proof-oOsaCl4z.mjs";
7
+ import { n as signObject } from "../proof-2v-RNn_n.mjs";
8
8
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
9
- import { a as createFederation } from "../middleware-By-XnBx8.mjs";
9
+ import { a as createFederation } from "../middleware-D5XEd8l9.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, Follow, Person } from "@fedify/vocab";
12
12
  //#region src/federation/idempotency.test.ts
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
6
- import { t as InboxListenerSet } from "../inbox-C18xUe71.mjs";
6
+ import { t as InboxListenerSet } from "../inbox-CKKOBg0X.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { Activity, Create, Invite, Offer, Update } from "@fedify/vocab";
9
9
  //#region src/federation/inbox.test.ts
@@ -9,14 +9,14 @@ import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z
9
9
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
10
10
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
11
11
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
12
- import { l as verifyRequest, s as signRequest } from "../http-Ba7807Bo.mjs";
12
+ import { l as verifyRequest, s as signRequest } from "../http-DscVc8UW.mjs";
13
13
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
14
- import { t as getAuthenticatedDocumentLoader } from "../docloader-Czq6jsdF.mjs";
15
- import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-lZDwbdE9.mjs";
16
- import { t as doesActorOwnKey } from "../owner-D1HCbj2y.mjs";
17
- import { n as signObject, r as verifyObject } from "../proof-oOsaCl4z.mjs";
14
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DmksBzVa.mjs";
15
+ import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-uaq9Uc9i.mjs";
16
+ import { t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
17
+ import { n as signObject, r as verifyObject } from "../proof-2v-RNn_n.mjs";
18
18
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
19
- import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-By-XnBx8.mjs";
19
+ import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-D5XEd8l9.mjs";
20
20
  import { mockDocumentLoader, test } from "@fedify/fixture";
21
21
  import * as vocab from "@fedify/vocab";
22
22
  import { Create, Offer, Person, getTypeId, lookupObject } from "@fedify/vocab";
@@ -705,6 +705,31 @@ test({
705
705
  esm_default.hardReset();
706
706
  }
707
707
  });
708
+ test("Federation.fetch() [rfc9421] multiple POST signatures", async (t) => {
709
+ for (const validSecond of [true, false]) await t.step(validSecond ? "valid second signature" : "both signatures invalid", async () => {
710
+ const inbox = [];
711
+ const federation = createFederation({
712
+ kv: new MemoryKvStore(),
713
+ documentLoaderFactory: () => mockDocumentLoader,
714
+ contextLoaderFactory: () => mockDocumentLoader
715
+ });
716
+ federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => new vocab.Person({ id: ctx.getActorUri(identifier) }));
717
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(vocab.Create, (_ctx, activity) => {
718
+ inbox.push(activity.id.href);
719
+ });
720
+ const signed = await signRequest(new Request("https://example.com/inbox", {
721
+ method: "POST",
722
+ headers: { "Content-Type": "application/activity+json" },
723
+ body: JSON.stringify(create_default)
724
+ }), rsaPrivateKey2, rsaPublicKey2.id, { spec: "rfc9421" });
725
+ const input = signed.headers.get("Signature-Input");
726
+ const signature = signed.headers.get("Signature");
727
+ signed.headers.set("Signature-Input", `${input}, ${input.replace(/^sig1=/, "sig2=")}`);
728
+ signed.headers.set("Signature", `sig1=:AAAAAA==:, ${validSecond ? signature.replace(/^sig1=/, "sig2=") : "sig2=:AAAAAA==:"}`);
729
+ assertEquals((await federation.fetch(signed, { contextData: void 0 })).status, validSecond ? 202 : 401);
730
+ assertEquals(inbox, validSecond ? [id$2] : []);
731
+ });
732
+ });
708
733
  test("Federation.fetch()", async (t) => {
709
734
  esm_default.spyGlobal();
710
735
  esm_default.get("https://example.com/key2", {
@@ -2,7 +2,7 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("../chunk-DDcVe30Y.cjs");
5
- const require_middleware = require("../middleware-DAH4XiqU.cjs");
5
+ const require_middleware = require("../middleware-Bhbzx0XA.cjs");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  //#region src/federation/kv.ts
8
8
  /**
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "../middleware-D2iI7G04.js";
3
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "../middleware-w_QMTb52.js";
4
4
  import { isEqual } from "es-toolkit";
5
5
  //#region src/federation/kv.ts
6
6
  /**
@@ -7,10 +7,10 @@ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
10
- import { l as verifyRequest } from "../http-Ba7807Bo.mjs";
10
+ import { l as verifyRequest } from "../http-DscVc8UW.mjs";
11
11
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
12
- import { t as doesActorOwnKey } from "../owner-D1HCbj2y.mjs";
13
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-D2F0cCVr.mjs";
12
+ import { t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
13
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-Dvu09tKp.mjs";
14
14
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
15
15
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
16
16
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import "../std__assert-BUOJXi-Z.mjs";
5
5
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { t as assert } from "../assert-BhQd8QHP.mjs";
7
- import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BTCyquNi.mjs";
7
+ import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BAJ8SH-_.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  //#region src/federation/temporal.test.ts
10
10
  test("hasMalformedKnownTemporalLiteral() detects expanded proof timestamps", async () => {
@@ -5,7 +5,7 @@ import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, o as handleWebFinger } from "../middleware-By-XnBx8.mjs";
8
+ import { a as createFederation, o as handleWebFinger } from "../middleware-D5XEd8l9.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Image, Link, Person } from "@fedify/vocab";
11
11
  //#region src/federation/webfinger.test.ts
@@ -11,7 +11,7 @@ let byte_encodings_base64 = require("byte-encodings/base64");
11
11
  let structured_field_values = require("structured-field-values");
12
12
  //#region deno.json
13
13
  var name = "@fedify/fedify";
14
- var version = "2.0.29-dev.2107+5ab4c99b";
14
+ var version = "2.0.29-dev.2121+c46fb9dd";
15
15
  //#endregion
16
16
  //#region src/sig/key.ts
17
17
  /**
@@ -968,6 +968,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
968
968
  return null;
969
969
  }
970
970
  let validKey = null;
971
+ let body = null;
972
+ let digestValid = null;
971
973
  for (const sigName of signatureNames) {
972
974
  if (!signatures[sigName]) continue;
973
975
  const sigInput = signatureInputs[sigName];
@@ -1010,7 +1012,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
1010
1012
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
1011
1013
  continue;
1012
1014
  }
1013
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
1015
+ body ??= await request.arrayBuffer();
1016
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
1017
+ if (!digestValid) {
1014
1018
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
1015
1019
  continue;
1016
1020
  }
@@ -10,7 +10,7 @@ import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
10
10
  import { Item, decodeDict, encodeItem } from "structured-field-values";
11
11
  //#region deno.json
12
12
  var name = "@fedify/fedify";
13
- var version = "2.0.29-dev.2107+5ab4c99b";
13
+ var version = "2.0.29-dev.2121+c46fb9dd";
14
14
  //#endregion
15
15
  //#region src/sig/key.ts
16
16
  /**
@@ -967,6 +967,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
967
967
  return null;
968
968
  }
969
969
  let validKey = null;
970
+ let body = null;
971
+ let digestValid = null;
970
972
  for (const sigName of signatureNames) {
971
973
  if (!signatures[sigName]) continue;
972
974
  const sigInput = signatureInputs[sigName];
@@ -1009,7 +1011,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
1009
1011
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
1010
1012
  continue;
1011
1013
  }
1012
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
1014
+ body ??= await request.arrayBuffer();
1015
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
1016
+ if (!digestValid) {
1013
1017
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
1014
1018
  continue;
1015
1019
  }
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-1YdrFVdl.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { CryptographicKey } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { FetchError } from "@fedify/vocab-runtime";
@@ -562,6 +562,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
562
562
  return null;
563
563
  }
564
564
  let validKey = null;
565
+ let body = null;
566
+ let digestValid = null;
565
567
  for (const sigName of signatureNames) {
566
568
  if (!signatures[sigName]) continue;
567
569
  const sigInput = signatureInputs[sigName];
@@ -604,7 +606,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
604
606
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
605
607
  continue;
606
608
  }
607
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
609
+ body ??= await request.arrayBuffer();
610
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
611
+ if (!digestValid) {
608
612
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
609
613
  continue;
610
614
  }
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
5
  import { Activity, getTypeId } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
7
7
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
5
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
7
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-VNuWokJg.cjs");
4
+ const require_http = require("./http-6cUjmZau.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { l as validateCryptoKey, t as doubleKnock } from "./http-D5vmrVLV.js";
3
+ import { l as validateCryptoKey, t as doubleKnock } from "./http-CBZxo485.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { curry } from "es-toolkit";
6
6
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-1YdrFVdl.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -203,7 +203,7 @@ function normalizeContextReference(reference, baseUrl) {
203
203
  /** @internal */
204
204
  function isInvalidUrlTypeError(error) {
205
205
  const code = error.code;
206
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
206
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
207
207
  }
208
208
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
209
209
  if (context === null) return createGraphAliasContextState();
@@ -2,10 +2,10 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
4
  const require_transformers = require("./transformers-NeAONrAq.cjs");
5
- const require_http = require("./http-VNuWokJg.cjs");
5
+ const require_http = require("./http-6cUjmZau.cjs");
6
6
  const require_types = require("./types-DRPjmHVV.cjs");
7
- const require_proof = require("./proof-Ce-JBAuj.cjs");
8
- const require_kv_cache = require("./kv-cache-DRelxPCd.cjs");
7
+ const require_proof = require("./proof-C5gSPzjd.cjs");
8
+ const require_kv_cache = require("./kv-cache-BV20L2x4.cjs");
9
9
  let _logtape_logtape = require("@logtape/logtape");
10
10
  let _fedify_vocab = require("@fedify/vocab");
11
11
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -335,7 +335,7 @@ var FederationBuilderImpl = class {
335
335
  this.collectionTypeIds = {};
336
336
  }
337
337
  async build(options) {
338
- const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-BN9TRImG.cjs"));
338
+ const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-DUALf6gS.cjs"));
339
339
  const f = new FederationImpl(options);
340
340
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
341
341
  f.router = this.router.clone();
@@ -1,5 +1,5 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as FederationImpl } from "./middleware-By-XnBx8.mjs";
4
+ import { n as FederationImpl } from "./middleware-D5XEd8l9.mjs";
5
5
  export { FederationImpl };
@@ -2,24 +2,24 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
6
- import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-1YdrFVdl.mjs";
7
- import { l as verifyRequest } from "./http-Ba7807Bo.mjs";
8
- import { t as getAuthenticatedDocumentLoader } from "./docloader-Czq6jsdF.mjs";
5
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
6
+ import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-BMxcDQ7Z.mjs";
7
+ import { l as verifyRequest } from "./http-DscVc8UW.mjs";
8
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-DmksBzVa.mjs";
9
9
  import { n as kvCache } from "./kv-cache-BrjuJue8.mjs";
10
- import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-lZDwbdE9.mjs";
11
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-D1HCbj2y.mjs";
12
- import { n as signObject, r as verifyObject } from "./proof-oOsaCl4z.mjs";
10
+ import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-uaq9Uc9i.mjs";
11
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-Ds5LSYBk.mjs";
12
+ import { n as signObject, r as verifyObject } from "./proof-2v-RNn_n.mjs";
13
13
  import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-BUqbea1d.mjs";
14
14
  import { t as nodeInfoToJson } from "./types-MNlFfxjv.mjs";
15
- import { n as routeActivity } from "./inbox-C18xUe71.mjs";
16
- import { t as FederationBuilderImpl } from "./builder-CsI6ZXC9.mjs";
15
+ import { n as routeActivity } from "./inbox-CKKOBg0X.mjs";
16
+ import { t as FederationBuilderImpl } from "./builder-CcdhtqZA.mjs";
17
17
  import { t as buildCollectionSynchronizationHeader } from "./collection-DI6YzYpd.mjs";
18
18
  import { t as KvKeyCache } from "./keycache-D239uGT9.mjs";
19
19
  import { t as acceptsJsonLd } from "./negotiation-TWEs6Cl8.mjs";
20
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-BTCyquNi.mjs";
20
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-BAJ8SH-_.mjs";
21
21
  import { t as createExponentialBackoffPolicy } from "./retry-Ddbq3AcK.mjs";
22
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-D2F0cCVr.mjs";
22
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Dvu09tKp.mjs";
23
23
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
24
24
  import { lookupWebFinger } from "@fedify/webfinger";
25
25
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
@@ -1,4 +1,4 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
- const require_middleware = require("./middleware-DAH4XiqU.cjs");
3
+ const require_middleware = require("./middleware-Bhbzx0XA.cjs");
4
4
  exports.FederationImpl = require_middleware.FederationImpl;
@@ -2,10 +2,10 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import { t as __exportAll } from "./chunk-CRNNMoPX.js";
4
4
  import { r as getDefaultActivityTransformers } from "./transformers-BGMIq1cs.js";
5
- import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-D5vmrVLV.js";
5
+ import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-CBZxo485.js";
6
6
  import { a as MAX_BODY_SIZE, i as BodyTooLargeError, n as getNodeInfo, o as readBoundedText, t as nodeInfoToJson } from "./types-miAYfiGO.js";
7
- import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-DZCZie--.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-BIIdI_Cr.js";
7
+ import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-zSRThRNk.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-OZi_bDmv.js";
9
9
  import { getLogger, withContext } from "@logtape/logtape";
10
10
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
11
11
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
package/dist/mod.cjs CHANGED
@@ -4,11 +4,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("./chunk-DDcVe30Y.cjs");
5
5
  const require_transformers = require("./transformers-NeAONrAq.cjs");
6
6
  require("./compat/mod.cjs");
7
- const require_http = require("./http-VNuWokJg.cjs");
8
- const require_middleware = require("./middleware-DAH4XiqU.cjs");
7
+ const require_http = require("./http-6cUjmZau.cjs");
8
+ const require_middleware = require("./middleware-Bhbzx0XA.cjs");
9
9
  const require_types = require("./types-DRPjmHVV.cjs");
10
- const require_proof = require("./proof-Ce-JBAuj.cjs");
11
- const require_kv_cache = require("./kv-cache-DRelxPCd.cjs");
10
+ const require_proof = require("./proof-C5gSPzjd.cjs");
11
+ const require_kv_cache = require("./kv-cache-BV20L2x4.cjs");
12
12
  const require_federation_mod = require("./federation/mod.cjs");
13
13
  require("./nodeinfo/mod.cjs");
14
14
  require("./runtime/mod.cjs");
package/dist/mod.js CHANGED
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "./chunk-CRNNMoPX.js";
4
4
  import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-BGMIq1cs.js";
5
5
  import "./compat/mod.js";
6
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-D5vmrVLV.js";
7
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-D2iI7G04.js";
6
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-CBZxo485.js";
7
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-w_QMTb52.js";
8
8
  import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-miAYfiGO.js";
9
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-DZCZie--.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-BIIdI_Cr.js";
9
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-zSRThRNk.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-OZi_bDmv.js";
11
11
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "./federation/mod.js";
12
12
  import "./nodeinfo/mod.js";
13
13
  import "./runtime/mod.js";
@@ -5,7 +5,7 @@ import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-By-XnBx8.mjs";
8
+ import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-D5XEd8l9.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  //#region src/nodeinfo/handler.test.ts
11
11
  test("handleNodeInfo()", async () => {
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
5
- import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-1YdrFVdl.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-BMxcDQ7Z.mjs";
6
6
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
7
7
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-1YdrFVdl.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { Activity, DataIntegrityProof, Multikey, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-VNuWokJg.cjs");
4
+ const require_http = require("./http-6cUjmZau.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let _fedify_vocab = require("@fedify/vocab");
7
7
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -205,7 +205,7 @@ function normalizeContextReference(reference, baseUrl) {
205
205
  /** @internal */
206
206
  function isInvalidUrlTypeError(error) {
207
207
  const code = error.code;
208
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
208
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
209
209
  }
210
210
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
211
211
  if (context === null) return createGraphAliasContextState();
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-D5vmrVLV.js";
3
+ import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-CBZxo485.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, getTypeId, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -202,7 +202,7 @@ function normalizeContextReference(reference, baseUrl) {
202
202
  /** @internal */
203
203
  function isInvalidUrlTypeError(error) {
204
204
  const code = error.code;
205
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
205
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
206
206
  }
207
207
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
208
208
  if (context === null) return createGraphAliasContextState();
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CjMqmOHc.mjs";
5
- import { n as doubleKnock } from "./http-Ba7807Bo.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { n as doubleKnock } from "./http-DscVc8UW.mjs";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
7
  import { FetchError, UrlError, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -7,8 +7,8 @@ import { i as assertExists, t as assertStringIncludes } from "../std__assert-BUO
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
10
- import { t as exportJwk } from "../key-1YdrFVdl.mjs";
11
- import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-Ba7807Bo.mjs";
10
+ import { t as exportJwk } from "../key-BMxcDQ7Z.mjs";
11
+ import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-DscVc8UW.mjs";
12
12
  import { i as rsaPrivateKey2, l as rsaPublicKey5, o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
13
13
  import { mockDocumentLoader, test } from "@fedify/fixture";
14
14
  import { FetchError, exportSpki } from "@fedify/vocab-runtime";
@@ -307,6 +307,46 @@ test("verifyRequest() [rfc9421] successful GET verification", async () => {
307
307
  currentTime: Temporal.Instant.from(`${(/* @__PURE__ */ new Date(currentTimestamp * 1e3)).toISOString()}`)
308
308
  }), rsaPublicKey2, "Valid signature should verify to the correct public key");
309
309
  });
310
+ for (const failure of [
311
+ "missing key",
312
+ "invalid signature",
313
+ "digest mismatch",
314
+ "empty body",
315
+ "cached key"
316
+ ]) test(`verifyRequest() [rfc9421] multiple POST signatures: ${failure}`, async () => {
317
+ const body = failure === "empty body" ? "" : "Hello, world!";
318
+ const currentTime = Temporal.Instant.from("2024-03-05T08:09:44Z");
319
+ const signed = await signRequest(new Request("https://example.com/inbox", {
320
+ method: "POST",
321
+ body
322
+ }), rsaPrivateKey2, new URL("https://example.com/key2"), {
323
+ spec: "rfc9421",
324
+ currentTime
325
+ });
326
+ const input = signed.headers.get("Signature-Input");
327
+ const signature = signed.headers.get("Signature");
328
+ const firstInput = failure === "missing key" ? input.replace("https://example.com/key2", "https://example.com/missing-key") : input;
329
+ signed.headers.set("Signature-Input", `${firstInput}, ${input.replace(/^sig1=/, "sig2=")}`);
330
+ signed.headers.set("Signature", `sig1=:AAAAAA==:, ${signature.replace(/^sig1=/, "sig2=")}`);
331
+ const request = failure === "digest mismatch" ? new Request(signed, { body: "Tampered body" }) : signed;
332
+ const loaded = [];
333
+ assertEquals(await verifyRequest(request, {
334
+ keyCache: failure === "cached key" ? {
335
+ get: () => Promise.resolve(rsaPublicKey1),
336
+ set: async () => {}
337
+ } : void 0,
338
+ spec: "rfc9421",
339
+ currentTime,
340
+ contextLoader: mockDocumentLoader,
341
+ documentLoader: (url, options) => {
342
+ loaded.push(url);
343
+ return mockDocumentLoader(url, options);
344
+ }
345
+ }), failure === "digest mismatch" ? null : rsaPublicKey2);
346
+ assertEquals(loaded, failure === "digest mismatch" ? [] : failure === "missing key" ? ["https://example.com/missing-key", "https://example.com/key2"] : ["https://example.com/key2", "https://example.com/key2"]);
347
+ assertFalse(request.bodyUsed);
348
+ assertEquals(await request.text(), failure === "digest mismatch" ? "Tampered body" : body);
349
+ });
310
350
  test("verifyRequest() [rfc9421] manual POST verification", async () => {
311
351
  const currentTimestamp = 1709626184;
312
352
  const currentTime = Temporal.Instant.from("2024-03-05T08:09:44Z");
@@ -6,7 +6,7 @@ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
9
- import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-1YdrFVdl.mjs";
9
+ import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-BMxcDQ7Z.mjs";
10
10
  import { c as rsaPublicKey3, i as rsaPrivateKey2, o as rsaPublicKey1, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey, Multikey } from "@fedify/vocab";
@@ -5,14 +5,17 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
7
7
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
8
- import { i as generateCryptoKeyPair } from "../key-1YdrFVdl.mjs";
8
+ import { i as generateCryptoKeyPair } from "../key-BMxcDQ7Z.mjs";
9
9
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
10
- import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-lZDwbdE9.mjs";
10
+ import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-uaq9Uc9i.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey } from "@fedify/vocab";
13
13
  import { encodeBase64 } from "byte-encodings/base64";
14
14
  //#region src/sig/ld.test.ts
15
15
  test("isInvalidUrlTypeError()", () => {
16
+ assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL string.")));
17
+ assertFalse(isInvalidUrlTypeError(/* @__PURE__ */ new Error("Invalid URL string.")));
18
+ assertFalse(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL string. Other error")));
16
19
  assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL: http://[")));
17
20
  assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("\"http://[\" cannot be parsed as a URL.")));
18
21
  const error = /* @__PURE__ */ new TypeError("Failed to parse URL");
package/dist/sig/mod.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_http = require("../http-VNuWokJg.cjs");
5
- const require_proof = require("../proof-Ce-JBAuj.cjs");
4
+ const require_http = require("../http-6cUjmZau.cjs");
5
+ const require_proof = require("../proof-C5gSPzjd.cjs");
6
6
  exports.attachSignature = require_proof.attachSignature;
7
7
  exports.createProof = require_proof.createProof;
8
8
  exports.createSignature = require_proof.createSignature;
package/dist/sig/mod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-D5vmrVLV.js";
4
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-DZCZie--.js";
3
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-CBZxo485.js";
4
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-zSRThRNk.js";
5
5
  export { attachSignature, createProof, createSignature, detachSignature, doesActorOwnKey, exportJwk, fetchKey, generateCryptoKeyPair, getKeyOwner, importJwk, signJsonLd, signObject, signRequest, verifyJsonLd, verifyObject, verifyProof, verifyRequest, verifySignature };
@@ -6,7 +6,7 @@ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
9
- import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-D1HCbj2y.mjs";
9
+ import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
10
10
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, CryptographicKey, lookupObject } from "@fedify/vocab";
12
12
  //#region src/sig/owner.test.ts
@@ -6,7 +6,7 @@ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
8
8
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
9
- import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-oOsaCl4z.mjs";
9
+ import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-2v-RNn_n.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, DataIntegrityProof, Multikey, Note, Place } from "@fedify/vocab";
12
12
  import { decodeMultibase, importMultibaseKey } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { c as getNormalizationContextLoader } from "./ld-lZDwbdE9.mjs";
4
+ import { c as getNormalizationContextLoader } from "./ld-uaq9Uc9i.mjs";
5
5
  import jsonld from "@fedify/vocab-runtime/jsonld";
6
6
  //#region src/federation/temporal.ts
7
7
  function isPlainObject(value) {
@@ -5,9 +5,9 @@ import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
- import { l as verifyRequest } from "../http-Ba7807Bo.mjs";
8
+ import { l as verifyRequest } from "../http-DscVc8UW.mjs";
9
9
  import { i as rsaPrivateKey2 } from "../keys-CCxRJhWa.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "../docloader-Czq6jsdF.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DmksBzVa.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
13
13
  import { configure, reset } from "@logtape/logtape";
@@ -1,6 +1,6 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_kv_cache = require("../kv-cache-DRelxPCd.cjs");
4
+ const require_kv_cache = require("../kv-cache-BV20L2x4.cjs");
5
5
  exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
6
6
  exports.kvCache = require_kv_cache.kvCache;
package/dist/utils/mod.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-BIIdI_Cr.js";
3
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-OZi_bDmv.js";
4
4
  export { getAuthenticatedDocumentLoader, kvCache };
@@ -5,7 +5,7 @@ import { createRequire } from "node:module";
5
5
  import { test } from "@fedify/fixture";
6
6
  import { strictEqual } from "node:assert";
7
7
  //#region src/vocab/cjs.test.ts
8
- test("CommonJS vocab entry exports Object", { ignore: "Deno" in globalThis }, () => {
8
+ test("CommonJS vocab entry exports Object", { ignore: "Deno" in globalThis || "navigator" in globalThis && navigator.userAgent === "Cloudflare-Workers" }, () => {
9
9
  const vocab = createRequire(import.meta.url)("./mod.cjs");
10
10
  strictEqual(typeof vocab.Object, "function");
11
11
  strictEqual(typeof vocab.Update, "function");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "2.0.29-dev.2107+5ab4c99b",
3
+ "version": "2.0.29-dev.2121+c46fb9dd",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -144,9 +144,9 @@
144
144
  "uri-template-router": "^1.0.0",
145
145
  "url-template": "^3.1.1",
146
146
  "urlpattern-polyfill": "^10.1.0",
147
- "@fedify/vocab-runtime": "2.0.29-dev.2107+5ab4c99b",
148
- "@fedify/vocab": "2.0.29-dev.2107+5ab4c99b",
149
- "@fedify/webfinger": "2.0.29-dev.2107+5ab4c99b"
147
+ "@fedify/vocab-runtime": "2.0.29-dev.2121+c46fb9dd",
148
+ "@fedify/vocab": "2.0.29-dev.2121+c46fb9dd",
149
+ "@fedify/webfinger": "2.0.29-dev.2121+c46fb9dd"
150
150
  },
151
151
  "devDependencies": {
152
152
  "@std/assert": "npm:@jsr/std__assert@^0.226.0",
@@ -158,8 +158,8 @@
158
158
  "tsx": "^4.19.4",
159
159
  "typescript": "^6.0.0",
160
160
  "wrangler": "^4.17.0",
161
- "@fedify/vocab-tools": "^2.0.29-dev.2107+5ab4c99b",
162
- "@fedify/fixture": "2.0.0"
161
+ "@fedify/fixture": "2.0.0",
162
+ "@fedify/vocab-tools": "^2.0.29-dev.2121+c46fb9dd"
163
163
  },
164
164
  "scripts": {
165
165
  "build:self": "tsdown",
@@ -169,6 +169,6 @@
169
169
  "test": "cd dist/ && node --test",
170
170
  "pretest:bun": "pnpm build",
171
171
  "test:bun": "cd dist/ && bun test --timeout 60000",
172
- "test:cfworkers": "deno task codegen && wrangler deploy --dry-run --outdir src/cfworkers && node --import=tsx src/cfworkers/client.ts"
172
+ "test:cfworkers": "deno task codegen && wrangler deploy --dry-run --outdir src/cfworkers && node --import=tsx scripts/check_cfworkers.ts && node --import=tsx src/cfworkers/client.ts"
173
173
  }
174
174
  }