@fedify/fedify 2.4.0-dev.2065 → 2.4.0-dev.2073
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-CMkrnYbY.mjs → builder-CVHpPAjK.mjs} +6 -2
- 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-Dj3DCsoj.mjs → compound-proof-B5Skp-vE.mjs} +1 -1
- package/dist/{context-D_gg4M0n.d.ts → context-BSywYspi.d.ts} +153 -2
- package/dist/{context-b36TpPoG.d.cts → context-CZjZYXFC.d.cts} +153 -2
- package/dist/{context-DG5QeQ8W.mjs → context-DlZhxdFT.mjs} +2 -1
- package/dist/{deno-BuRFI7wk.mjs → deno-LYTbBhYV.mjs} +1 -1
- package/dist/{docloader-_aSNLA90.mjs → docloader-C0SWQylk.mjs} +2 -2
- package/dist/federation/builder.test.mjs +1 -1
- package/dist/federation/compound-fanout.test.mjs +4 -4
- package/dist/federation/handler-compound-proof.test.mjs +4 -4
- package/dist/federation/handler.test.mjs +6 -6
- 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 +9 -9
- package/dist/federation/mod.cjs +1 -1
- package/dist/federation/mod.d.cts +3 -3
- package/dist/federation/mod.d.ts +3 -3
- package/dist/federation/mod.js +1 -1
- package/dist/federation/outgoing-proof.test.mjs +6 -6
- package/dist/federation/portable-gateway-keys.test.d.mts +2 -0
- package/dist/federation/portable-gateway-keys.test.mjs +363 -0
- package/dist/federation/portable-inbox.test.d.mts +2 -0
- package/dist/federation/portable-inbox.test.mjs +546 -0
- package/dist/federation/portable.test.mjs +3 -3
- package/dist/federation/send.test.mjs +3 -3
- package/dist/federation/tasks/enqueue.test.mjs +2 -2
- package/dist/federation/tasks/tasks.test.mjs +3 -3
- package/dist/federation/temporal.test.mjs +1 -1
- package/dist/federation/webfinger.test.mjs +2 -2
- package/dist/{federation-Coi_bg12.cjs → federation-B1aeTKKN.cjs} +631 -145
- package/dist/{http-f1qaBtOh.mjs → http-C7qHlv-b.mjs} +20 -5
- package/dist/{http-BGShIsd6.cjs → http-DGk8XI38.cjs} +2684 -48
- package/dist/{http-65PYi9jY.d.ts → http-n2v6DPxu.d.ts} +52 -2
- package/dist/http-vfTpzGEq.js +5087 -0
- package/dist/{http-CP-7OdSq.d.cts → http-xlG-jRdB.d.cts} +52 -2
- package/dist/{key-BxHsA1s9.mjs → key-BYXnTGro.mjs} +147 -7
- package/dist/{kv-cache-Cgj-kpQS.js → kv-cache-DCJuwdnB.js} +1 -1
- package/dist/{kv-cache-C9IY-FMN.mjs → kv-cache-DEH5jyND.mjs} +1 -1
- package/dist/{kv-cache-CY6pDNoS.cjs → kv-cache-DvqkKNIj.cjs} +1 -1
- package/dist/{ld-CqJq5erX.mjs → ld-DT3e2hOv.mjs} +3 -3
- package/dist/{metrics-DOqknlZd.mjs → metrics-DvlvYpq_.mjs} +1 -1
- package/dist/{middleware-VOCZN3SO.mjs → middleware-BJcez_E3.mjs} +1 -1
- package/dist/{middleware-1h_LgwXC.js → middleware-CCbyUF4c.js} +547 -62
- package/dist/{middleware-s-AZzx4r.mjs → middleware-CpyCNOW_.mjs} +549 -72
- package/dist/{mod-BhMvsgdF.d.ts → mod-B2h2KY0q.d.ts} +1 -1
- package/dist/{mod-Dhm7SqyE.d.ts → mod-C9WSpZWm.d.ts} +1 -1
- package/dist/{mod-C0BYc0OU.d.ts → mod-CVZrXSdm.d.ts} +1 -1
- package/dist/{mod-pLbeNwcC.d.cts → mod-HDSvS-ww.d.cts} +1 -1
- package/dist/{mod-Bfenkg_c.d.cts → mod-JzkaEXsi.d.cts} +1 -1
- package/dist/{mod-CyiSjRkk.d.cts → mod-xGFCHqq_.d.cts} +1 -1
- package/dist/mod.cjs +18 -18
- package/dist/mod.d.cts +7 -7
- package/dist/mod.d.ts +7 -7
- package/dist/mod.js +5 -5
- package/dist/nodeinfo/handler.test.mjs +2 -2
- package/dist/{owner-D_F22lfM.mjs → owner-CDsVeZI7.mjs} +45 -2
- package/dist/owner-DCIH7Iq0.cjs +225 -0
- package/dist/owner-DfGz0cXm.js +215 -0
- package/dist/portable-key-DCyKGCQd.mjs +194 -0
- package/dist/{proof-B03JXhrk.mjs → proof-CxsVG6vM.mjs} +5 -5
- package/dist/{send-NNkfKtVN.mjs → send-BZJ7NsVV.mjs} +8 -4
- 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 +3 -3
- 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 +16 -16
- package/dist/sig/mod.d.cts +2 -2
- package/dist/sig/mod.d.ts +2 -2
- package/dist/sig/mod.js +3 -3
- package/dist/sig/owner.test.mjs +1 -1
- package/dist/sig/portable-collection.test.mjs +3 -3
- package/dist/sig/portable-key.test.d.mts +2 -0
- package/dist/sig/portable-key.test.mjs +275 -0
- package/dist/sig/proof.test.mjs +4 -4
- package/dist/{sig-B1E2uyhQ.cjs → sig-C6TnADze.cjs} +4 -4
- package/dist/{sig-Bb20Pyrd.js → sig-Cs9_ecdh.js} +2 -2
- package/dist/{temporal-VVVSuruq.mjs → temporal-CLzSfIOV.mjs} +1 -1
- package/dist/testing/kv.test.mjs +1 -1
- package/dist/testing/mod.d.mts +151 -0
- package/dist/testing/mod.mjs +2 -2
- package/dist/{testing-By1YYsIK.mjs → testing-CO_cEvQc.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/http-z5n7chWw.js +0 -2647
- package/dist/owner-BLBWXCNt.js +0 -2276
- package/dist/owner-D8ZpRusc.cjs +0 -2446
|
@@ -3,6 +3,28 @@ import { Actor, CryptographicKey, Multikey } from "@fedify/vocab";
|
|
|
3
3
|
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
4
4
|
import { MeterProvider, TracerProvider } from "@opentelemetry/api";
|
|
5
5
|
|
|
6
|
+
//#region src/sig/portable-key.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* The result of resolving a gateway key of a portable actor.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
type PortableGatewayKeyResolution = {
|
|
12
|
+
/**
|
|
13
|
+
* The document at the key ID is not a portable actor, so the key is
|
|
14
|
+
* resolved as usual.
|
|
15
|
+
*/
|
|
16
|
+
readonly type: "legacy";
|
|
17
|
+
} | {
|
|
18
|
+
/** The document is a portable actor, but it does not vouch for the key. */readonly type: "rejected";
|
|
19
|
+
readonly reason: string;
|
|
20
|
+
} | {
|
|
21
|
+
/** The portable actor's signed document vouches for the key. */readonly type: "verified";
|
|
22
|
+
readonly actor: Actor;
|
|
23
|
+
readonly key: CryptographicKey & {
|
|
24
|
+
publicKey: CryptoKey;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
6
28
|
//#region src/sig/key.d.ts
|
|
7
29
|
/**
|
|
8
30
|
* Generates a key pair which is appropriate for Fedify.
|
|
@@ -91,6 +113,18 @@ interface FetchKeyOptions {
|
|
|
91
113
|
* @internal
|
|
92
114
|
*/
|
|
93
115
|
keyIdBoundByCaller?: boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Resolves a gateway key of an [FEP-ef61] portable actor, i.e., a key whose
|
|
118
|
+
* ID is a compatible identifier and dereferences to a portable actor's
|
|
119
|
+
* document. Such a key is resolved only through this function, and is
|
|
120
|
+
* rejected if it is omitted, so that only HTTP Signature verification,
|
|
121
|
+
* which passes it, accepts gateway keys. Object Integrity Proofs and
|
|
122
|
+
* Linked Data Signatures never do.
|
|
123
|
+
*
|
|
124
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
125
|
+
* @internal
|
|
126
|
+
*/
|
|
127
|
+
portableGatewayKeyResolver?: (document: unknown, actor: Actor, keyId: URL) => Promise<PortableGatewayKeyResolution>;
|
|
94
128
|
}
|
|
95
129
|
/**
|
|
96
130
|
* The result of {@link fetchKey}.
|
|
@@ -139,7 +173,15 @@ type FetchableKeyClass<T extends CryptographicKey | Multikey> = (new (...args: a
|
|
|
139
173
|
/**
|
|
140
174
|
* Fetches a {@link CryptographicKey} or {@link Multikey} from the given URL.
|
|
141
175
|
* If the given URL contains an {@link Actor} object, it tries to find
|
|
142
|
-
* the corresponding key in the `publicKey` or `assertionMethod` property.
|
|
176
|
+
* the corresponding key in the `publicKey` or `assertionMethod` property. *
|
|
177
|
+
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
178
|
+
* compatible identifiers that dereference to portable actor documents, are
|
|
179
|
+
* not resolved by this function, as they only authenticate HTTP requests;
|
|
180
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Keys
|
|
181
|
+
* whose IDs are compatible identifiers are never read from or written to
|
|
182
|
+
* the key cache.
|
|
183
|
+
*
|
|
184
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
143
185
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
144
186
|
* or {@link Multikey}.
|
|
145
187
|
* @param keyId The URL of the key.
|
|
@@ -153,7 +195,15 @@ declare function fetchKey<T extends CryptographicKey | Multikey>(keyId: URL | st
|
|
|
153
195
|
/**
|
|
154
196
|
* Fetches a {@link CryptographicKey} or {@link Multikey} from the given URL,
|
|
155
197
|
* preserving transport-level fetch failures for callers that need to inspect
|
|
156
|
-
* why the key could not be loaded.
|
|
198
|
+
* why the key could not be loaded. *
|
|
199
|
+
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
200
|
+
* compatible identifiers that dereference to portable actor documents, are
|
|
201
|
+
* not resolved by this function, as they only authenticate HTTP requests;
|
|
202
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Keys
|
|
203
|
+
* whose IDs are compatible identifiers are never read from or written to
|
|
204
|
+
* the key cache.
|
|
205
|
+
*
|
|
206
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
157
207
|
*
|
|
158
208
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
159
209
|
* or {@link Multikey}.
|
|
@@ -1,12 +1,105 @@
|
|
|
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-
|
|
4
|
+
import { n as version, t as name } from "./deno-LYTbBhYV.mjs";
|
|
5
|
+
import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-DvlvYpq_.mjs";
|
|
6
6
|
import { getLogger } from "@logtape/logtape";
|
|
7
7
|
import { CryptographicKey, Multikey, Object as Object$1, isActor } from "@fedify/vocab";
|
|
8
8
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
9
|
-
import { FetchError, getDocumentLoader, parseDidKeyVerificationMethod } from "@fedify/vocab-runtime";
|
|
9
|
+
import { FetchError, canonicalizePortableUri, formatIri, fromCompatibleEf61Id, getDocumentLoader, parseDidKeyVerificationMethod, toCompatibleEf61Id } from "@fedify/vocab-runtime";
|
|
10
|
+
//#region src/sig/portable-key-id.ts
|
|
11
|
+
const COMPATIBLE_KEY_ID_PATH_PATTERN = /^\/\.well-known\/apgateway\/did(?::|%3A)/i;
|
|
12
|
+
/**
|
|
13
|
+
* Checks whether the URL is an `ap:` or `ap+ef61:` URI.
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
function isPortableUri(url) {
|
|
17
|
+
return url.protocol === "ap:" || url.protocol === "ap+ef61:";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Checks whether an activity is performed by an FEP-ef61 portable actor,
|
|
21
|
+
* i.e., any of its actors has an `ap:` or `ap+ef61:` ID.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
function hasPortableActor(activity) {
|
|
25
|
+
return activity.actorIds.some(isPortableUri);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks whether a key ID looks like an [FEP-ef61] compatible identifier,
|
|
29
|
+
* i.e., an HTTP(S) URL under a gateway's `/.well-known/apgateway/did:` path.
|
|
30
|
+
* Such a key ID names a key that a gateway holds for a portable actor, so it
|
|
31
|
+
* is resolved only as a gateway key, and never cached in a key cache.
|
|
32
|
+
*
|
|
33
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
function isCompatibleKeyId(keyId) {
|
|
37
|
+
return (keyId.protocol === "http:" || keyId.protocol === "https:") && COMPATIBLE_KEY_ID_PATH_PATTERN.test(keyId.pathname);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets the canonical portable ID of an actor ID that is either an `ap:` or
|
|
41
|
+
* `ap+ef61:` URI or a compatible identifier.
|
|
42
|
+
* @returns The canonical portable ID, or `null` if the ID is neither, or is
|
|
43
|
+
* malformed.
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
function getCanonicalPortableId(id) {
|
|
47
|
+
try {
|
|
48
|
+
if (isPortableUri(id)) return canonicalizePortableUri(formatIri(id));
|
|
49
|
+
const portable = fromCompatibleEf61Id(id);
|
|
50
|
+
if (portable == null) return null;
|
|
51
|
+
return canonicalizePortableUri(formatIri(portable));
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error instanceof TypeError) return null;
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Builds the base of the key IDs of a gateway's keys for a portable actor:
|
|
59
|
+
* the actor's compatible identifier on the gateway.
|
|
60
|
+
* @param actorId The portable actor's ID, either an `ap:` or `ap+ef61:` URI
|
|
61
|
+
* or a compatible identifier. It must not have a fragment.
|
|
62
|
+
* @param gateway The gateway's origin, e.g., `https://example.com`.
|
|
63
|
+
* @returns The compatible identifier without query and fragment.
|
|
64
|
+
* @throws {TypeError} If the actor ID is not a portable ID, or has
|
|
65
|
+
* a fragment.
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
function getGatewayKeyBase(actorId, gateway) {
|
|
69
|
+
let portable;
|
|
70
|
+
if (isPortableUri(actorId)) portable = actorId;
|
|
71
|
+
else try {
|
|
72
|
+
portable = fromCompatibleEf61Id(actorId);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (!(error instanceof TypeError)) throw error;
|
|
75
|
+
portable = null;
|
|
76
|
+
}
|
|
77
|
+
if (portable == null) throw new TypeError(`The portable actor ID ${actorId.href} must be an ap: or ap+ef61: URI, or an FEP-ef61 compatible identifier.`);
|
|
78
|
+
if (portable.hash !== "") throw new TypeError(`The portable actor ID ${actorId.href} must not have a fragment.`);
|
|
79
|
+
const base = toCompatibleEf61Id(portable, gateway);
|
|
80
|
+
base.search = "";
|
|
81
|
+
base.hash = "";
|
|
82
|
+
return base;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Tells whether a parsed document at a compatible key ID is a portable actor,
|
|
86
|
+
* which makes the key a gateway key that only
|
|
87
|
+
* {@link verifyPortableGatewayKeyDocument} can vouch for.
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
function isPortableActorDocument(object) {
|
|
91
|
+
return isActor(object) && object.id != null && isPortableUri(object.id);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compares two public keys by their key material.
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
async function isSamePublicKey(a, b) {
|
|
98
|
+
if (a.algorithm.name !== b.algorithm.name) return false;
|
|
99
|
+
const [x, y] = await Promise.all([crypto.subtle.exportKey("jwk", a), crypto.subtle.exportKey("jwk", b)]);
|
|
100
|
+
return x.kty === y.kty && x.crv === y.crv && x.n === y.n && x.e === y.e && x.x === y.x && x.y === y.y;
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
10
103
|
//#region src/sig/key.ts
|
|
11
104
|
/**
|
|
12
105
|
* Checks if the given key is valid and supported. No-op if the key is valid,
|
|
@@ -230,7 +323,15 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
|
230
323
|
/**
|
|
231
324
|
* Fetches a {@link CryptographicKey} or {@link Multikey} from the given URL.
|
|
232
325
|
* If the given URL contains an {@link Actor} object, it tries to find
|
|
233
|
-
* the corresponding key in the `publicKey` or `assertionMethod` property.
|
|
326
|
+
* the corresponding key in the `publicKey` or `assertionMethod` property. *
|
|
327
|
+
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
328
|
+
* compatible identifiers that dereference to portable actor documents, are
|
|
329
|
+
* not resolved by this function, as they only authenticate HTTP requests;
|
|
330
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Keys
|
|
331
|
+
* whose IDs are compatible identifiers are never read from or written to
|
|
332
|
+
* the key cache.
|
|
333
|
+
*
|
|
334
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
234
335
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
235
336
|
* or {@link Multikey}.
|
|
236
337
|
* @param keyId The URL of the key.
|
|
@@ -247,7 +348,15 @@ function fetchKey(keyId, cls, options = {}) {
|
|
|
247
348
|
/**
|
|
248
349
|
* Fetches a {@link CryptographicKey} or {@link Multikey} from the given URL,
|
|
249
350
|
* preserving transport-level fetch failures for callers that need to inspect
|
|
250
|
-
* why the key could not be loaded.
|
|
351
|
+
* why the key could not be loaded. *
|
|
352
|
+
* Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
|
|
353
|
+
* compatible identifiers that dereference to portable actor documents, are
|
|
354
|
+
* not resolved by this function, as they only authenticate HTTP requests;
|
|
355
|
+
* use `verifyRequest()` or `getKeyOwner()` for them instead. Keys
|
|
356
|
+
* whose IDs are compatible identifiers are never read from or written to
|
|
357
|
+
* the key cache.
|
|
358
|
+
*
|
|
359
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
251
360
|
*
|
|
252
361
|
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
253
362
|
* or {@link Multikey}.
|
|
@@ -398,7 +507,7 @@ async function resolveDidKey(cacheKey, cls, keyCache, logger) {
|
|
|
398
507
|
cached: false
|
|
399
508
|
};
|
|
400
509
|
}
|
|
401
|
-
async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller }, logger) {
|
|
510
|
+
async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller, portableGatewayKeyResolver }, logger) {
|
|
402
511
|
let object;
|
|
403
512
|
try {
|
|
404
513
|
object = await Object$1.fromJsonLd(document, {
|
|
@@ -427,6 +536,33 @@ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, {
|
|
|
427
536
|
throw e;
|
|
428
537
|
}
|
|
429
538
|
}
|
|
539
|
+
if (isCompatibleKeyId(cacheKey) && isPortableActorDocument(object)) {
|
|
540
|
+
if (portableGatewayKeyResolver == null || cls !== CryptographicKey) {
|
|
541
|
+
logger.debug("Failed to verify; key {keyId} is a gateway key of the portable actor {actorId}, which is only accepted for HTTP Signatures.", {
|
|
542
|
+
keyId,
|
|
543
|
+
actorId: object.id?.href
|
|
544
|
+
});
|
|
545
|
+
return {
|
|
546
|
+
key: null,
|
|
547
|
+
cached: false
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
const resolution = await portableGatewayKeyResolver(document, object, cacheKey);
|
|
551
|
+
if (resolution.type !== "verified") {
|
|
552
|
+
logger.debug("Failed to verify; the portable actor {actorId} does not vouch for its gateway key {keyId}.", {
|
|
553
|
+
keyId,
|
|
554
|
+
actorId: object.id?.href
|
|
555
|
+
});
|
|
556
|
+
return {
|
|
557
|
+
key: null,
|
|
558
|
+
cached: false
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
key: resolution.key,
|
|
563
|
+
cached: false
|
|
564
|
+
};
|
|
565
|
+
}
|
|
430
566
|
let key = null;
|
|
431
567
|
let ownerDocument = null;
|
|
432
568
|
if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object.id == null ? object.clone({ id: cacheKey }) : object;
|
|
@@ -546,6 +682,10 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
546
682
|
"key"
|
|
547
683
|
]);
|
|
548
684
|
const keyId = cacheKey.href;
|
|
685
|
+
if (isCompatibleKeyId(cacheKey)) options = {
|
|
686
|
+
...options,
|
|
687
|
+
keyCache: void 0
|
|
688
|
+
};
|
|
549
689
|
const keyCache = options.keyCache;
|
|
550
690
|
const didKey = await resolveDidKey(cacheKey, cls, keyCache, logger);
|
|
551
691
|
if (didKey != null) {
|
|
@@ -612,4 +752,4 @@ async function fetchKeyInternal(keyId, cls, options = {}) {
|
|
|
612
752
|
});
|
|
613
753
|
}
|
|
614
754
|
//#endregion
|
|
615
|
-
export { generateCryptoKeyPair as a, verifyKeyOwnership as c, fetchKeyDetailed as i, fetchActorDocument as n, importJwk as o, fetchKey as r, validateCryptoKey as s, exportJwk as t };
|
|
755
|
+
export { generateCryptoKeyPair as a, verifyKeyOwnership as c, hasPortableActor as d, isCompatibleKeyId as f, isSamePublicKey as h, fetchKeyDetailed as i, getCanonicalPortableId as l, isPortableUri as m, fetchActorDocument as n, importJwk as o, isPortableActorDocument as p, fetchKey as r, validateCryptoKey as s, exportJwk as t, getGatewayKeyBase as u };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "temporal-polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import {
|
|
3
|
+
import { R as validateCryptoKey, nt as recordDocumentCache, t as doubleKnock } from "./http-vfTpzGEq.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,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-DvlvYpq_.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,5 +1,5 @@
|
|
|
1
1
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
2
|
-
const require_http = require("./http-
|
|
2
|
+
const require_http = require("./http-DGk8XI38.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 { r as fetchKey, s as validateCryptoKey } from "./key-
|
|
4
|
+
import { n as version, t as name } from "./deno-LYTbBhYV.mjs";
|
|
5
|
+
import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DvlvYpq_.mjs";
|
|
6
|
+
import { r as fetchKey, s as validateCryptoKey } from "./key-BYXnTGro.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-LYTbBhYV.mjs";
|
|
5
5
|
import { metrics } from "@opentelemetry/api";
|
|
6
6
|
import { FetchError } from "@fedify/vocab-runtime";
|
|
7
7
|
//#region src/federation/metrics.ts
|