@fedify/fedify 2.4.0-dev.2127 → 2.4.0-dev.2129
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.
- package/dist/{builder-B2bgGYbP.mjs → builder-C0bxZDL0.mjs} +3 -3
- package/dist/compat/mod.d.cts +1 -1
- package/dist/compat/mod.d.ts +1 -1
- package/dist/compat/transformers.test.mjs +1 -1
- package/dist/{compound-proof-SVlHSzV7.mjs → compound-proof-D9Kljk_7.mjs} +3 -3
- package/dist/{context-Ci5vuUr_.d.ts → context-Cz1w5Krc.d.ts} +1 -1
- package/dist/{context-Bm6ldGvx.d.cts → context-Dvec_D_h.d.cts} +1 -1
- package/dist/{deno-Be9xoxps.mjs → deno-_o3lkDlG.mjs} +1 -1
- package/dist/{docloader-Dtuyb0ps.mjs → docloader-BbS0rO-Y.mjs} +2 -2
- package/dist/federation/builder.test.mjs +1 -1
- package/dist/federation/compound-fanout.test.mjs +3 -3
- package/dist/federation/handler-compound-proof.test.mjs +3 -3
- package/dist/federation/handler.test.mjs +5 -5
- package/dist/federation/hashlink-media.test.mjs +2 -2
- package/dist/federation/idempotency.test.mjs +2 -2
- package/dist/federation/metrics.test.mjs +1 -1
- package/dist/federation/middleware.test.mjs +7 -7
- package/dist/federation/mod.cjs +1 -1
- package/dist/federation/mod.d.cts +2 -2
- package/dist/federation/mod.d.ts +2 -2
- package/dist/federation/mod.js +1 -1
- package/dist/federation/outgoing-proof.test.mjs +6 -6
- package/dist/federation/portable-actor.test.mjs +3 -3
- package/dist/federation/portable-chain.test.mjs +3 -3
- package/dist/federation/portable-gateway-keys.test.mjs +76 -5
- package/dist/federation/portable-inbox.test.mjs +9 -4
- package/dist/federation/portable.test.mjs +3 -3
- package/dist/federation/send.test.mjs +3 -3
- package/dist/federation/tasks/enqueue.test.mjs +1 -1
- package/dist/federation/tasks/tasks.test.mjs +2 -2
- package/dist/federation/temporal.test.mjs +1 -1
- package/dist/federation/webfinger.test.mjs +1 -1
- package/dist/{federation-B6IHuS6n.cjs → federation-DRY8KrkB.cjs} +12 -12
- package/dist/{http-o8l4QeUY.cjs → http-B1J6E-bT.cjs} +384 -33
- package/dist/{http-BFeK9sBg.mjs → http-BpOiZE09.mjs} +18 -12
- package/dist/{http-D76Py0M4.d.cts → http-C-x_OLSp.d.ts} +57 -14
- package/dist/{http-Rmbiu-5S.js → http-C2M6wcs8.js} +374 -35
- package/dist/{http-BrQgkJay.d.ts → http-CjezPjFX.d.cts} +57 -14
- package/dist/{key-Cc1b6pW9.mjs → key-DolJjJab.mjs} +103 -16
- package/dist/{kv-cache-tLKBfxHc.mjs → kv-cache-Bq2cah0c.mjs} +1 -1
- package/dist/{kv-cache-BweDce2I.js → kv-cache-D7TiyMxv.js} +1 -1
- package/dist/{kv-cache-BUkgZAcX.cjs → kv-cache-D9nRbG2Q.cjs} +1 -1
- package/dist/{ld-DQNTIrAe.mjs → ld-Dwc176V4.mjs} +3 -3
- package/dist/{metrics-DDE9S63Q.mjs → metrics-CDaHfBXY.mjs} +1 -1
- package/dist/{middleware-CsQorLC_.mjs → middleware-CmB1FD8A.mjs} +1 -1
- package/dist/{middleware-K9aLnf57.js → middleware-CylX-pvI.js} +12 -12
- package/dist/{middleware-BdhvduR9.mjs → middleware-DN3MdTDg.mjs} +24 -24
- package/dist/{mod-Co53r-VP.d.ts → mod-Bz9tFXI2.d.ts} +1 -1
- package/dist/{mod-Cwdt_CWU.d.ts → mod-CZetqT5h.d.ts} +1 -1
- package/dist/{mod-Cr79cQlc.d.cts → mod-D4g9ffEn.d.cts} +1 -1
- package/dist/{mod-AVir5nVI.d.cts → mod-DGOIxEfb.d.cts} +1 -1
- package/dist/{mod-Byt5tvAS.d.cts → mod-S--JxYjo.d.cts} +1 -1
- package/dist/{mod-eVOUPbQE.d.ts → mod-owwElvpw.d.ts} +1 -1
- package/dist/mod.cjs +4 -4
- package/dist/mod.d.cts +5 -5
- package/dist/mod.d.ts +5 -5
- package/dist/mod.js +4 -4
- package/dist/nodeinfo/handler.test.mjs +1 -1
- package/dist/{owner-CCfdL83M.mjs → owner-BNHhwjNu.mjs} +37 -4
- package/dist/{portable-collection-WXaHkNqC.mjs → portable-collection-CRpTUHCY.mjs} +2 -2
- package/dist/{portable-collection-DdXsKBg4.js → portable-collection-CgglAI9B.js} +34 -1
- package/dist/{portable-collection-DXogVs__.cjs → portable-collection-PTGD0q70.cjs} +34 -1
- package/dist/portable-key-DqX2emHQ.mjs +395 -0
- package/dist/{portable-key-id-T7lecIbt.mjs → portable-key-id-Bg259c4Z.mjs} +69 -2
- package/dist/{proof-CW8k0R1G.mjs → proof-B4_0E-KU.mjs} +5 -5
- package/dist/{send--FORaIc4.mjs → send-Dpu5qbP5.mjs} +3 -3
- package/dist/sig/compound-proof-discovery.test.mjs +1 -1
- package/dist/sig/compound-proof-producer.test.mjs +1 -1
- package/dist/sig/compound-proof-verification.test.mjs +2 -2
- package/dist/sig/compound-proof.test.mjs +2 -2
- package/dist/sig/http.test.mjs +2 -2
- package/dist/sig/key.test.mjs +1 -1
- package/dist/sig/ld.test.mjs +2 -2
- package/dist/sig/mod.cjs +2 -2
- package/dist/sig/mod.d.cts +2 -2
- package/dist/sig/mod.d.ts +2 -2
- package/dist/sig/mod.js +2 -2
- package/dist/sig/owner.test.mjs +1 -1
- package/dist/sig/portable-collection.test.mjs +1 -1
- package/dist/sig/portable-key.test.mjs +479 -5
- package/dist/sig/proof.test.mjs +3 -3
- package/dist/{temporal-CffY_XOJ.mjs → temporal-78JVR3GK.mjs} +1 -1
- package/dist/testing/kv.test.mjs +1 -1
- package/dist/utils/docloader.test.mjs +2 -2
- package/dist/utils/kv-cache.test.mjs +1 -1
- package/dist/utils/mod.cjs +1 -1
- package/dist/utils/mod.d.cts +1 -1
- package/dist/utils/mod.d.ts +1 -1
- package/dist/utils/mod.js +1 -1
- package/package.json +6 -6
- package/dist/portable-key-C-fPq_Yf.mjs +0 -214
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
2
|
import { Actor, CryptographicKey, Multikey } from "@fedify/vocab";
|
|
3
|
-
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
4
3
|
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
4
|
+
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
5
5
|
|
|
6
6
|
//#region src/sig/portable-key.d.ts
|
|
7
7
|
/**
|
|
@@ -29,6 +29,28 @@ type PortableGatewayKeyResolution = {
|
|
|
29
29
|
*/
|
|
30
30
|
readonly expires?: Temporal.Instant;
|
|
31
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* The result of resolving a key of a portable actor at an `ap:` or
|
|
34
|
+
* `ap+ef61:` key ID.
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
type PortableActorKeyResolution = Exclude<PortableGatewayKeyResolution, {
|
|
38
|
+
readonly type: "legacy";
|
|
39
|
+
}> | {
|
|
40
|
+
/**
|
|
41
|
+
* Whether the actor's document vouches for the key could not be
|
|
42
|
+
* determined, e.g., because no gateway could be reached.
|
|
43
|
+
*/
|
|
44
|
+
readonly type: "unavailable";
|
|
45
|
+
readonly error: unknown;
|
|
46
|
+
/**
|
|
47
|
+
* Whether the failure can be cached as a failure to fetch the key, i.e.,
|
|
48
|
+
* every gateway failed to serve the actor's document at all. A failure
|
|
49
|
+
* that is not cacheable comes with an error that has no HTTP status,
|
|
50
|
+
* since none of the statuses describes the lookup as a whole.
|
|
51
|
+
*/
|
|
52
|
+
readonly cacheable: boolean;
|
|
53
|
+
};
|
|
32
54
|
//#endregion
|
|
33
55
|
//#region src/sig/key.d.ts
|
|
34
56
|
/**
|
|
@@ -119,17 +141,34 @@ interface FetchKeyOptions {
|
|
|
119
141
|
*/
|
|
120
142
|
keyIdBoundByCaller?: boolean;
|
|
121
143
|
/**
|
|
122
|
-
* Resolves
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* which passes it, accepts gateway keys. Object Integrity Proofs and
|
|
127
|
-
* Linked Data Signatures never do.
|
|
144
|
+
* Resolves keys of [FEP-ef61] portable actors, which only HTTP Signature
|
|
145
|
+
* verification passes, so that only it accepts them. Object Integrity
|
|
146
|
+
* Proofs and Linked Data Signatures never do: such a key is rejected if
|
|
147
|
+
* this is omitted.
|
|
128
148
|
*
|
|
129
149
|
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
130
150
|
* @internal
|
|
131
151
|
*/
|
|
132
|
-
|
|
152
|
+
portableKeyResolvers?: PortableKeyResolvers;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Resolves keys of [FEP-ef61] portable actors for HTTP Signature
|
|
156
|
+
* verification. See {@link FetchKeyOptions.portableKeyResolvers}.
|
|
157
|
+
*
|
|
158
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
interface PortableKeyResolvers {
|
|
162
|
+
/**
|
|
163
|
+
* Resolves a gateway key, i.e., a key whose ID is a compatible identifier
|
|
164
|
+
* and dereferences to a portable actor's document.
|
|
165
|
+
*/
|
|
166
|
+
gatewayKey(document: unknown, actor: Actor, keyId: URL): Promise<PortableGatewayKeyResolution>;
|
|
167
|
+
/**
|
|
168
|
+
* Resolves a key of a portable actor itself, i.e., a key whose ID is an
|
|
169
|
+
* `ap:` or `ap+ef61:` URI.
|
|
170
|
+
*/
|
|
171
|
+
actorKey(keyId: URL): Promise<PortableActorKeyResolution>;
|
|
133
172
|
}
|
|
134
173
|
/**
|
|
135
174
|
* The result of {@link fetchKey}.
|
|
@@ -182,9 +221,11 @@ type FetchableKeyClass<T extends CryptographicKey | Multikey> = (new (...args: a
|
|
|
182
221
|
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
183
222
|
* compatible identifiers that dereference to portable actor documents, are
|
|
184
223
|
* not resolved by this function, as they only authenticate HTTP requests;
|
|
185
|
-
* use `verifyRequest()` or `getKeyOwner()` for them instead.
|
|
186
|
-
*
|
|
187
|
-
*
|
|
224
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
|
|
225
|
+
* of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
|
|
226
|
+
* reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
|
|
227
|
+
* URIs are never read from or written to the key cache under their IDs,
|
|
228
|
+
* except for failures to fetch them.
|
|
188
229
|
*
|
|
189
230
|
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
190
231
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
@@ -204,9 +245,11 @@ declare function fetchKey<T extends CryptographicKey | Multikey>(keyId: URL | st
|
|
|
204
245
|
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
205
246
|
* compatible identifiers that dereference to portable actor documents, are
|
|
206
247
|
* not resolved by this function, as they only authenticate HTTP requests;
|
|
207
|
-
* use `verifyRequest()` or `getKeyOwner()` for them instead.
|
|
208
|
-
*
|
|
209
|
-
*
|
|
248
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
|
|
249
|
+
* of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
|
|
250
|
+
* reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
|
|
251
|
+
* URIs are never read from or written to the key cache under their IDs,
|
|
252
|
+
* except for failures to fetch them.
|
|
210
253
|
*
|
|
211
254
|
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
212
255
|
*
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-
|
|
6
|
-
import {
|
|
4
|
+
import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
|
|
5
|
+
import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-CDaHfBXY.mjs";
|
|
6
|
+
import { c as isPortableId, f as parseKeyIdString, o as isCompatibleKeyId, s as isPortableActorDocument, u as isPortableUri } from "./portable-key-id-Bg259c4Z.mjs";
|
|
7
7
|
import { getLogger } from "@logtape/logtape";
|
|
8
8
|
import { CryptographicKey, Multikey, Object as Object$1, isActor } from "@fedify/vocab";
|
|
9
9
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
@@ -236,6 +236,17 @@ function bypassKeyCacheReads(keyCache) {
|
|
|
236
236
|
};
|
|
237
237
|
return bypassed;
|
|
238
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Parses a key ID given as a string. Unlike `new URL()`, it accepts `ap:`
|
|
241
|
+
* and `ap+ef61:` URIs, and refuses a portable or compatible key ID whose
|
|
242
|
+
* identity URL parsing would change, e.g., by resolving dot segments.
|
|
243
|
+
* @throws {TypeError} If the key ID is invalid.
|
|
244
|
+
*/
|
|
245
|
+
function parseKeyIdOrThrow(keyId) {
|
|
246
|
+
const parsed = parseKeyIdString(keyId);
|
|
247
|
+
if (parsed == null) throw new TypeError(`Invalid key ID: ${keyId}`);
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
239
250
|
async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
240
251
|
tracerProvider ??= trace.getTracerProvider();
|
|
241
252
|
return await tracerProvider.getTracer(name, version).startActiveSpan("activitypub.fetch_key", {
|
|
@@ -272,9 +283,11 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
|
272
283
|
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
273
284
|
* compatible identifiers that dereference to portable actor documents, are
|
|
274
285
|
* not resolved by this function, as they only authenticate HTTP requests;
|
|
275
|
-
* use `verifyRequest()` or `getKeyOwner()` for them instead.
|
|
276
|
-
*
|
|
277
|
-
*
|
|
286
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
|
|
287
|
+
* of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
|
|
288
|
+
* reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
|
|
289
|
+
* URIs are never read from or written to the key cache under their IDs,
|
|
290
|
+
* except for failures to fetch them.
|
|
278
291
|
*
|
|
279
292
|
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
280
293
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
@@ -287,7 +300,7 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
|
287
300
|
* @since 1.3.0
|
|
288
301
|
*/
|
|
289
302
|
function fetchKey(keyId, cls, options = {}) {
|
|
290
|
-
keyId = typeof keyId === "string" ?
|
|
303
|
+
keyId = typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId;
|
|
291
304
|
return withFetchKeySpan(keyId, options.tracerProvider, () => fetchKeyInternal(keyId, cls, options));
|
|
292
305
|
}
|
|
293
306
|
/**
|
|
@@ -297,9 +310,11 @@ function fetchKey(keyId, cls, options = {}) {
|
|
|
297
310
|
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
298
311
|
* compatible identifiers that dereference to portable actor documents, are
|
|
299
312
|
* not resolved by this function, as they only authenticate HTTP requests;
|
|
300
|
-
* use `verifyRequest()` or `getKeyOwner()` for them instead.
|
|
301
|
-
*
|
|
302
|
-
*
|
|
313
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
|
|
314
|
+
* of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
|
|
315
|
+
* reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
|
|
316
|
+
* URIs are never read from or written to the key cache under their IDs,
|
|
317
|
+
* except for failures to fetch them.
|
|
303
318
|
*
|
|
304
319
|
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
305
320
|
*
|
|
@@ -313,7 +328,7 @@ function fetchKey(keyId, cls, options = {}) {
|
|
|
313
328
|
* @since 2.1.0
|
|
314
329
|
*/
|
|
315
330
|
async function fetchKeyDetailed(keyId, cls, options = {}) {
|
|
316
|
-
const cacheKey = typeof keyId === "string" ?
|
|
331
|
+
const cacheKey = typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId;
|
|
317
332
|
return await withFetchKeySpan(cacheKey, options.tracerProvider, async () => {
|
|
318
333
|
return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey, keyId, keyCache, logger) => {
|
|
319
334
|
const fetchError = await keyCache?.getFetchError?.(cacheKey);
|
|
@@ -452,7 +467,7 @@ async function resolveDidKey(cacheKey, cls, keyCache, logger) {
|
|
|
452
467
|
cached: false
|
|
453
468
|
};
|
|
454
469
|
}
|
|
455
|
-
async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller,
|
|
470
|
+
async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller, portableKeyResolvers }, logger) {
|
|
456
471
|
let object;
|
|
457
472
|
try {
|
|
458
473
|
object = await Object$1.fromJsonLd(document, {
|
|
@@ -483,7 +498,7 @@ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, {
|
|
|
483
498
|
}
|
|
484
499
|
if (isCompatibleKeyId(cacheKey) && isPortableActorDocument(object)) {
|
|
485
500
|
const scopedCache = keyCache;
|
|
486
|
-
if (
|
|
501
|
+
if (portableKeyResolvers == null || cls !== CryptographicKey) {
|
|
487
502
|
logger.debug("Failed to verify; key {keyId} is a gateway key of the portable actor {actorId}, which is only accepted for HTTP Signatures.", {
|
|
488
503
|
keyId,
|
|
489
504
|
actorId: object.id?.href
|
|
@@ -494,7 +509,7 @@ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, {
|
|
|
494
509
|
cached: false
|
|
495
510
|
};
|
|
496
511
|
}
|
|
497
|
-
const resolution = await
|
|
512
|
+
const resolution = await portableKeyResolvers.gatewayKey(document, object, cacheKey);
|
|
498
513
|
if (resolution.type !== "verified") {
|
|
499
514
|
logger.debug("Failed to verify; the portable actor {actorId} does not vouch for its gateway key {keyId}.", {
|
|
500
515
|
keyId,
|
|
@@ -654,6 +669,11 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
654
669
|
]);
|
|
655
670
|
const keyId = cacheKey.href;
|
|
656
671
|
const keyCache = options.keyCache;
|
|
672
|
+
if (isPortableUri(cacheKey)) {
|
|
673
|
+
const result = await fetchPortableActorKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger);
|
|
674
|
+
outcome = result.outcome;
|
|
675
|
+
return result.result;
|
|
676
|
+
}
|
|
657
677
|
if (isCompatibleKeyId(cacheKey)) {
|
|
658
678
|
const result = await fetchCompatibleKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger);
|
|
659
679
|
outcome = result.outcome;
|
|
@@ -705,7 +725,7 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
705
725
|
*/
|
|
706
726
|
function getCompatibleKeyScope(cls, options) {
|
|
707
727
|
if (cls !== CryptographicKey) return "multikey";
|
|
708
|
-
return options.
|
|
728
|
+
return options.portableKeyResolvers == null ? "cryptographicKey" : "httpSignature";
|
|
709
729
|
}
|
|
710
730
|
/**
|
|
711
731
|
* Looks up a key at an [FEP-ef61] compatible identifier. Such a key may be
|
|
@@ -759,8 +779,75 @@ async function fetchCompatibleKey(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
759
779
|
outcome: { result: resolved.key != null ? "fetched" : "invalid" }
|
|
760
780
|
};
|
|
761
781
|
}
|
|
782
|
+
/**
|
|
783
|
+
* Looks up a key of an [FEP-ef61] portable actor at an `ap:` or `ap+ef61:`
|
|
784
|
+
* key ID. Such a key is accepted only for HTTP Signatures, and is rejected
|
|
785
|
+
* for any other purpose without being fetched. Like keys at compatible
|
|
786
|
+
* identifiers, what it resolves to is cached in the namespace of the lookup's
|
|
787
|
+
* purpose, and a failure to fetch the actor's document from every gateway is
|
|
788
|
+
* cached in the shared namespace. A failure that is neither, e.g., one
|
|
789
|
+
* gateway being unreachable while another served an invalid document, is not
|
|
790
|
+
* cached at all.
|
|
791
|
+
*
|
|
792
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
793
|
+
*/
|
|
794
|
+
async function fetchPortableActorKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger) {
|
|
795
|
+
const keyId = cacheKey.href;
|
|
796
|
+
const resolvers = options.portableKeyResolvers;
|
|
797
|
+
if (resolvers == null || cls !== CryptographicKey) {
|
|
798
|
+
logger.debug("Failed to verify; key {keyId} is a key of a portable actor, which is only accepted for HTTP Signatures.", { keyId });
|
|
799
|
+
return {
|
|
800
|
+
result: {
|
|
801
|
+
key: null,
|
|
802
|
+
cached: false
|
|
803
|
+
},
|
|
804
|
+
outcome: { result: "invalid" }
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
const sharedCache = options.keyCache;
|
|
808
|
+
const scopedCache = sharedCache?.compatibleKeyScope?.("httpSignature");
|
|
809
|
+
const cached = await getCachedFetchKey(cacheKey, keyId, cls, scopedCache, logger);
|
|
810
|
+
if (cached != null) return {
|
|
811
|
+
result: cached,
|
|
812
|
+
outcome: { result: "hit" }
|
|
813
|
+
};
|
|
814
|
+
if (await sharedCache?.get(cacheKey) === null) {
|
|
815
|
+
logger.debug("Entry {keyId} found in cache, but it could not be fetched.", { keyId });
|
|
816
|
+
return {
|
|
817
|
+
result: await onCachedUnavailable(cacheKey, keyId, sharedCache, logger),
|
|
818
|
+
outcome: { result: "hit" }
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
logger.debug("Resolving key {keyId} to verify signature...", { keyId });
|
|
822
|
+
const resolution = await resolvers.actorKey(cacheKey);
|
|
823
|
+
if (resolution.type === "verified") {
|
|
824
|
+
await scopedCache?.set(cacheKey, resolution.key, { expires: resolution.expires });
|
|
825
|
+
return {
|
|
826
|
+
result: {
|
|
827
|
+
key: resolution.key,
|
|
828
|
+
cached: false
|
|
829
|
+
},
|
|
830
|
+
outcome: { result: "fetched" }
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
if (resolution.type === "rejected") {
|
|
834
|
+
await scopedCache?.set(cacheKey, null);
|
|
835
|
+
return {
|
|
836
|
+
result: {
|
|
837
|
+
key: null,
|
|
838
|
+
cached: false
|
|
839
|
+
},
|
|
840
|
+
outcome: { result: "invalid" }
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
await scopedCache?.delete(cacheKey);
|
|
844
|
+
return {
|
|
845
|
+
result: await onFetchError(resolution.error, cacheKey, keyId, resolution.cacheable ? sharedCache : void 0, logger),
|
|
846
|
+
outcome: resolution.cacheable ? classifyFetchError(resolution.error) : { result: "error" }
|
|
847
|
+
};
|
|
848
|
+
}
|
|
762
849
|
async function fetchKeyInternal(keyId, cls, options = {}) {
|
|
763
|
-
return await fetchKeyWithResult(typeof keyId === "string" ?
|
|
850
|
+
return await fetchKeyWithResult(typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
|
|
764
851
|
return {
|
|
765
852
|
key: null,
|
|
766
853
|
cached: true
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "temporal-polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { p as recordDocumentCache } from "./metrics-
|
|
4
|
+
import { p as recordDocumentCache } from "./metrics-CDaHfBXY.mjs";
|
|
5
5
|
import { getLogger } from "@logtape/logtape";
|
|
6
6
|
import { preloadedContexts } from "@fedify/vocab-runtime";
|
|
7
7
|
//#region src/utils/kv-cache.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "temporal-polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import {
|
|
3
|
+
import { U as validateCryptoKey, t as doubleKnock, tt as recordDocumentCache } from "./http-C2M6wcs8.js";
|
|
4
4
|
import { getLogger } from "@logtape/logtape";
|
|
5
5
|
import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
|
|
6
6
|
import { curry } from "es-toolkit";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
2
|
-
const require_http = require("./http-
|
|
2
|
+
const require_http = require("./http-B1J6E-bT.cjs");
|
|
3
3
|
let _logtape_logtape = require("@logtape/logtape");
|
|
4
4
|
let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
|
|
5
5
|
let es_toolkit = require("es-toolkit");
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-
|
|
6
|
-
import { c as validateCryptoKey, i as fetchKey, t as bypassKeyCacheReads } from "./key-
|
|
4
|
+
import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
|
|
5
|
+
import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-CDaHfBXY.mjs";
|
|
6
|
+
import { c as validateCryptoKey, i as fetchKey, t as bypassKeyCacheReads } from "./key-DolJjJab.mjs";
|
|
7
7
|
import { getLogger } from "@logtape/logtape";
|
|
8
8
|
import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
|
|
9
9
|
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
4
|
+
import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
|
|
5
5
|
import { metrics } from "@opentelemetry/api";
|
|
6
6
|
import { FetchError } from "@fedify/vocab-runtime";
|
|
7
7
|
//#region src/federation/metrics.ts
|
|
@@ -2,10 +2,10 @@ import { Temporal } from "temporal-polyfill";
|
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
3
|
import { t as __exportAll } from "./rolldown-runtime-BC-Eo5Mj.js";
|
|
4
4
|
import { r as getDefaultActivityTransformers } from "./transformers-DAtXl_Kc.js";
|
|
5
|
-
import { $ as
|
|
5
|
+
import { $ as recordCollectionRequest, A as isClearlyMalformedContextReference, Ct as version, D as getNormalizationContextLoader, E as detachSignature, G as getDurationMs, H as importJwk, I as wrapContextLoaderForJsonLd, J as instrumentDocumentLoader, K as getFederationMetrics, L as exportJwk, M as signJsonLd, N as verifyCompactJsonLd, O as hasSignature, Q as recordCollectionPageItems, S as assertSafeJsonLd, St as name, U as validateCryptoKey, X as recordCircuitBreakerStateChange, Y as isAbortError, Z as recordCollectionDispatchDuration, _ as verifyPortableObjectProofPolicy, _t as isCompatibleKeyId, at as recordOutboxEnqueue, b as normalizeOutgoingActivityJsonLd, bt as isPortableUri, ct as preloadedOnlyDocumentLoader, et as recordCollectionTotalItems, f as hasProofLike, g as verifyPortableObjectProof, gt as hasPortableActor, h as verifyObject, ht as getPortableDid, i as selectRequestSignature, it as recordOutboxActivity, j as isInvalidUrlTypeError, k as hasSignatureLike, lt as formatAcceptSignature, m as verifyMapLocalProof, mt as getGatewayKeyBase, n as listRequestSignatures, nt as recordFanoutRecipients, o as verifyRequest, ot as recordWebFingerHandle, p as signObject, pt as getCanonicalPortableId, q as getRemoteHost, r as parseRfc9421SignatureInput, rt as recordInboxActivity, s as verifyRequestDetailed, st as registerQueueDepthGauge, t as doubleKnock, u as InvalidPortableObjectIdError, v as verifyPortableObjectProofWithRoot, vt as isPortableId, w as compactJsonLd, x as InvalidContextReferenceError, yt as isPortableKeyId } from "./http-C2M6wcs8.js";
|
|
6
6
|
import { a as MAX_BODY_SIZE, i as BodyTooLargeError, n as getNodeInfo, o as readBoundedText, t as nodeInfoToJson } from "./types-C_cNlNVK.js";
|
|
7
|
-
import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-
|
|
8
|
-
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-
|
|
7
|
+
import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-CgglAI9B.js";
|
|
8
|
+
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-D7TiyMxv.js";
|
|
9
9
|
import { getLogger, withContext } from "@logtape/logtape";
|
|
10
10
|
import { Router, RouterError, assertPath } from "@fedify/uri-template";
|
|
11
11
|
import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, Tombstone, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
|
|
@@ -4665,7 +4665,7 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
4665
4665
|
"http_signatures.verified": httpSigKey != null,
|
|
4666
4666
|
"http_signatures.key_id": httpSigKey?.id?.href ?? ""
|
|
4667
4667
|
});
|
|
4668
|
-
if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) ||
|
|
4668
|
+
if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableActorKey(httpSigKey))) {
|
|
4669
4669
|
if (deferredLdSignatureError != null) throw deferredLdSignatureError;
|
|
4670
4670
|
logger.error("The activity {activityId} of the portable actor {actorId} is not authenticated by a valid Object Integrity Proof.", {
|
|
4671
4671
|
activity: json,
|
|
@@ -5446,13 +5446,13 @@ const MIN_COMPONENTS = [
|
|
|
5446
5446
|
"@authority"
|
|
5447
5447
|
];
|
|
5448
5448
|
/**
|
|
5449
|
-
* Checks whether an HTTP Signature key is a
|
|
5450
|
-
*
|
|
5451
|
-
* a portable actor, which only the portable actor's
|
|
5452
|
-
* establish.
|
|
5449
|
+
* Checks whether an HTTP Signature key is a key of an FEP-ef61 portable
|
|
5450
|
+
* actor, i.e., its ID is a compatible identifier or an `ap:` or `ap+ef61:`
|
|
5451
|
+
* URI, and it is owned by a portable actor, which only the portable actor's
|
|
5452
|
+
* signed document can establish.
|
|
5453
5453
|
*/
|
|
5454
|
-
function
|
|
5455
|
-
return key?.id != null &&
|
|
5454
|
+
function isPortableActorKey(key) {
|
|
5455
|
+
return key?.id != null && isPortableKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
|
|
5456
5456
|
}
|
|
5457
5457
|
/**
|
|
5458
5458
|
* Checks whether an activity needs an Object Integrity Proof by its DID:
|
|
@@ -5801,7 +5801,7 @@ async function signOutgoingActivity(activity, candidates, options) {
|
|
|
5801
5801
|
hasProof = true;
|
|
5802
5802
|
break;
|
|
5803
5803
|
}
|
|
5804
|
-
const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !
|
|
5804
|
+
const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isPortableKeyId(c.verificationMethod));
|
|
5805
5805
|
if (!hasProof && activity.id != null && isPortableId(activity.id)) return await sign(selectPortableActivityKey(activity, activity.id, keys));
|
|
5806
5806
|
if (keys.length < 1 || hasProof && !options.appendToExistingProofs) return {
|
|
5807
5807
|
activity,
|
|
@@ -7766,7 +7766,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
7766
7766
|
const ldSignable = !hasPortableActor(activity);
|
|
7767
7767
|
for (const { keyId, privateKey } of keys) {
|
|
7768
7768
|
validateCryptoKey(privateKey, "private");
|
|
7769
|
-
if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !
|
|
7769
|
+
if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isPortableKeyId(keyId)) rsaKey = {
|
|
7770
7770
|
keyId,
|
|
7771
7771
|
privateKey
|
|
7772
7772
|
};
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { Temporal } from "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-
|
|
4
|
+
import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
|
|
5
|
+
import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-CDaHfBXY.mjs";
|
|
6
6
|
import { t as formatAcceptSignature } from "./accept-CPVqki78.mjs";
|
|
7
|
-
import { a as
|
|
8
|
-
import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-
|
|
7
|
+
import { a as hasPortableActor, c as isPortableId, l as isPortableKeyId, n as getGatewayKeyBase, o as isCompatibleKeyId, r as getPortableDid, t as getCanonicalPortableId, u as isPortableUri } from "./portable-key-id-Bg259c4Z.mjs";
|
|
8
|
+
import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-DolJjJab.mjs";
|
|
9
9
|
import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-4IJqPYos.mjs";
|
|
10
|
-
import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-
|
|
11
|
-
import { i as signObject, l as verifyPortableObjectProofWithRoot, o as verifyObject, r as hasProofLike, s as verifyPortableObjectProof, t as InvalidPortableObjectIdError } from "./proof-
|
|
12
|
-
import { a as listRequestSignatures, c as selectRequestSignature, d as verifyRequest, f as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http-
|
|
13
|
-
import { t as getAuthenticatedDocumentLoader } from "./docloader-
|
|
14
|
-
import { n as kvCache } from "./kv-cache-
|
|
10
|
+
import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-Dwc176V4.mjs";
|
|
11
|
+
import { i as signObject, l as verifyPortableObjectProofWithRoot, o as verifyObject, r as hasProofLike, s as verifyPortableObjectProof, t as InvalidPortableObjectIdError } from "./proof-B4_0E-KU.mjs";
|
|
12
|
+
import { a as listRequestSignatures, c as selectRequestSignature, d as verifyRequest, f as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http-BpOiZE09.mjs";
|
|
13
|
+
import { t as getAuthenticatedDocumentLoader } from "./docloader-BbS0rO-Y.mjs";
|
|
14
|
+
import { n as kvCache } from "./kv-cache-Bq2cah0c.mjs";
|
|
15
15
|
import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-DpnpgjyX.mjs";
|
|
16
16
|
import { t as nodeInfoToJson } from "./types-DE_LV1JB.mjs";
|
|
17
|
-
import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-
|
|
18
|
-
import { t as verifyPortableObject } from "./portable-collection-
|
|
19
|
-
import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send
|
|
20
|
-
import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-
|
|
17
|
+
import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-BNHhwjNu.mjs";
|
|
18
|
+
import { t as verifyPortableObject } from "./portable-collection-CRpTUHCY.mjs";
|
|
19
|
+
import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Dpu5qbP5.mjs";
|
|
20
|
+
import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-C0bxZDL0.mjs";
|
|
21
21
|
import { t as CircuitBreaker } from "./circuit-breaker-C5NqoLBJ.mjs";
|
|
22
22
|
import { t as buildCollectionSynchronizationHeader } from "./collection-CnnP1UAv.mjs";
|
|
23
|
-
import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, t as containsCompoundPortableObject } from "./compound-proof-
|
|
23
|
+
import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, t as containsCompoundPortableObject } from "./compound-proof-D9Kljk_7.mjs";
|
|
24
24
|
import { t as KvKeyCache } from "./keycache-BInaECGj.mjs";
|
|
25
25
|
import { t as acceptsJsonLd } from "./negotiation-CCocWT_N.mjs";
|
|
26
|
-
import { t as hasMalformedKnownTemporalLiteral } from "./temporal-
|
|
26
|
+
import { t as hasMalformedKnownTemporalLiteral } from "./temporal-78JVR3GK.mjs";
|
|
27
27
|
import { t as createExponentialBackoffPolicy } from "./retry-zX5xw5e0.mjs";
|
|
28
28
|
import { t as TaskCodec } from "./codec-C6rTrpIp.mjs";
|
|
29
29
|
import { getLogger, withContext } from "@logtape/logtape";
|
|
@@ -2309,7 +2309,7 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
2309
2309
|
"http_signatures.verified": httpSigKey != null,
|
|
2310
2310
|
"http_signatures.key_id": httpSigKey?.id?.href ?? ""
|
|
2311
2311
|
});
|
|
2312
|
-
if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) ||
|
|
2312
|
+
if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableActorKey(httpSigKey))) {
|
|
2313
2313
|
if (deferredLdSignatureError != null) throw deferredLdSignatureError;
|
|
2314
2314
|
logger.error("The activity {activityId} of the portable actor {actorId} is not authenticated by a valid Object Integrity Proof.", {
|
|
2315
2315
|
activity: json,
|
|
@@ -3090,13 +3090,13 @@ const MIN_COMPONENTS = [
|
|
|
3090
3090
|
"@authority"
|
|
3091
3091
|
];
|
|
3092
3092
|
/**
|
|
3093
|
-
* Checks whether an HTTP Signature key is a
|
|
3094
|
-
*
|
|
3095
|
-
* a portable actor, which only the portable actor's
|
|
3096
|
-
* establish.
|
|
3093
|
+
* Checks whether an HTTP Signature key is a key of an FEP-ef61 portable
|
|
3094
|
+
* actor, i.e., its ID is a compatible identifier or an `ap:` or `ap+ef61:`
|
|
3095
|
+
* URI, and it is owned by a portable actor, which only the portable actor's
|
|
3096
|
+
* signed document can establish.
|
|
3097
3097
|
*/
|
|
3098
|
-
function
|
|
3099
|
-
return key?.id != null &&
|
|
3098
|
+
function isPortableActorKey(key) {
|
|
3099
|
+
return key?.id != null && isPortableKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
|
|
3100
3100
|
}
|
|
3101
3101
|
/**
|
|
3102
3102
|
* Checks whether an activity needs an Object Integrity Proof by its DID:
|
|
@@ -3215,7 +3215,7 @@ async function signOutgoingActivity(activity, candidates, options) {
|
|
|
3215
3215
|
hasProof = true;
|
|
3216
3216
|
break;
|
|
3217
3217
|
}
|
|
3218
|
-
const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !
|
|
3218
|
+
const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isPortableKeyId(c.verificationMethod));
|
|
3219
3219
|
if (!hasProof && activity.id != null && isPortableId(activity.id)) return await sign(selectPortableActivityKey(activity, activity.id, keys));
|
|
3220
3220
|
if (keys.length < 1 || hasProof && !options.appendToExistingProofs) return {
|
|
3221
3221
|
activity,
|
|
@@ -5001,7 +5001,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
5001
5001
|
const ldSignable = !hasPortableActor(activity);
|
|
5002
5002
|
for (const { keyId, privateKey } of keys) {
|
|
5003
5003
|
validateCryptoKey(privateKey, "private");
|
|
5004
|
-
if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !
|
|
5004
|
+
if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isPortableKeyId(keyId)) rsaKey = {
|
|
5005
5005
|
keyId,
|
|
5006
5006
|
privateKey
|
|
5007
5007
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { S as KeyCache } from "./http-
|
|
2
|
+
import { S as KeyCache } from "./http-C-x_OLSp.js";
|
|
3
3
|
import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
|
|
4
4
|
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
5
5
|
import { DocumentLoader, PortableObjectVerifier, PortableObjectVerifierOptions } from "@fedify/vocab-runtime";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { n as HttpMessageSignaturesSpecDeterminer } from "./http-
|
|
2
|
+
import { n as HttpMessageSignaturesSpecDeterminer } from "./http-C-x_OLSp.js";
|
|
3
3
|
import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.js";
|
|
4
4
|
import { t as DocumentFetchKind } from "./metrics-DoRtI0qU.js";
|
|
5
5
|
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { n as HttpMessageSignaturesSpecDeterminer } from "./http-
|
|
2
|
+
import { n as HttpMessageSignaturesSpecDeterminer } from "./http-CjezPjFX.cjs";
|
|
3
3
|
import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.cjs";
|
|
4
4
|
import { t as DocumentFetchKind } from "./metrics-DVKYY6K1.cjs";
|
|
5
5
|
import { DocumentLoader, DocumentLoaderFactoryOptions } from "@fedify/vocab-runtime";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-
|
|
2
|
+
import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Dvec_D_h.cjs";
|
|
3
3
|
import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
|
|
4
4
|
import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { S as KeyCache } from "./http-
|
|
2
|
+
import { S as KeyCache } from "./http-CjezPjFX.cjs";
|
|
3
3
|
import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
|
|
4
4
|
import { DocumentLoader, PortableObjectVerifier, PortableObjectVerifierOptions } from "@fedify/vocab-runtime";
|
|
5
5
|
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
|
-
import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-
|
|
2
|
+
import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Cz1w5Krc.js";
|
|
3
3
|
import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
|
|
4
4
|
import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
|
|
5
5
|
|
package/dist/mod.cjs
CHANGED
|
@@ -3,11 +3,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
require("./rolldown-runtime-Dmm3t92W.cjs");
|
|
4
4
|
const require_transformers = require("./transformers-BalCrSsr.cjs");
|
|
5
5
|
require("./compat/mod.cjs");
|
|
6
|
-
const require_http = require("./http-
|
|
7
|
-
const require_federation = require("./federation-
|
|
6
|
+
const require_http = require("./http-B1J6E-bT.cjs");
|
|
7
|
+
const require_federation = require("./federation-DRY8KrkB.cjs");
|
|
8
8
|
const require_types = require("./types-Be2zbyeG.cjs");
|
|
9
|
-
const require_portable_collection = require("./portable-collection-
|
|
10
|
-
const require_kv_cache = require("./kv-cache-
|
|
9
|
+
const require_portable_collection = require("./portable-collection-PTGD0q70.cjs");
|
|
10
|
+
const require_kv_cache = require("./kv-cache-D9nRbG2Q.cjs");
|
|
11
11
|
require("./nodeinfo/mod.cjs");
|
|
12
12
|
require("./runtime/mod.cjs");
|
|
13
13
|
require("./sig/mod.cjs");
|