@fedify/fedify 2.1.0 → 2.1.2
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/{accept-D7sAxyNa.js → accept-Dd__NiUL.mjs} +10 -8
- package/dist/{assert-MZs1qjMx.js → assert-ddO5KLpe.mjs} +5 -9
- package/dist/{assert_equals-DSbWqCm3.js → assert_equals-Ew3jOFa3.mjs} +55 -69
- package/dist/{assert_instance_of-DHz7EHNU.js → assert_instance_of-C4Ri6VuN.mjs} +5 -9
- package/dist/{assert_not_equals-f3m3epl3.js → assert_not_equals--wG9hV7u.mjs} +6 -13
- package/dist/{assert_rejects-0h7I2Esa.js → assert_rejects-B-qJtC9Z.mjs} +6 -11
- package/dist/{assert_throws-rjdMBf31.js → assert_throws-4NwKEy2q.mjs} +5 -10
- package/dist/{builder-WiHhZvjW.js → builder-DkJDAzes.mjs} +32 -41
- package/dist/{chunk-CGaQZ11T.cjs → chunk-DDcVe30Y.cjs} +23 -24
- package/dist/{chunk-DJNbSFdH.js → chunk-nlSIicah.js} +8 -8
- package/dist/{client-BxMZiQaD.d.ts → client-AtlibPOU.d.ts} +1 -1
- package/dist/{client-CoCIaTNO.js → client-DEpOVgY1.mjs} +9 -13
- package/dist/{client-C97KOq3x.d.cts → client-z-8dc-e1.d.cts} +1 -1
- package/dist/{collection-CSzG2j1P.js → collection-BD6-SZ6O.mjs} +7 -12
- package/dist/compat/mod.cjs +5 -8
- package/dist/compat/mod.d.cts +78 -6
- package/dist/compat/mod.d.ts +78 -6
- package/dist/compat/mod.js +4 -8
- package/dist/compat/transformers.test.mjs +62 -0
- package/dist/{context-DyJjQQ_H.d.ts → context-BOiMZBu5.d.ts} +9 -18
- package/dist/{context-BcqA-0BL.d.cts → context-BhZVy7RB.d.cts} +9 -18
- package/dist/{context-Aqenou7c.js → context-Juj6bdHC.mjs} +7 -11
- package/dist/deno-C5VMwnFV.mjs +8 -0
- package/dist/{docloader-bVO2EvL9.js → docloader-X9mcJ9Tz.mjs} +8 -14
- package/dist/{esm-nLm00z9V.js → esm-DVILvP5e.mjs} +50 -89
- package/dist/federation/builder.test.d.mts +2 -0
- package/dist/federation/{builder.test.js → builder.test.mjs} +21 -44
- package/dist/federation/collection.test.d.mts +2 -0
- package/dist/federation/collection.test.mjs +21 -0
- package/dist/federation/handler.test.d.mts +2 -0
- package/dist/federation/{handler.test.js → handler.test.mjs} +69 -131
- package/dist/federation/idempotency.test.d.mts +2 -0
- package/dist/federation/{idempotency.test.js → idempotency.test.mjs} +31 -63
- package/dist/federation/inbox.test.d.mts +2 -0
- package/dist/federation/{inbox.test.js → inbox.test.mjs} +8 -12
- package/dist/federation/keycache.test.d.mts +2 -0
- package/dist/federation/{keycache.test.js → keycache.test.mjs} +13 -19
- package/dist/federation/kv.test.d.mts +2 -0
- package/dist/federation/{kv.test.js → kv.test.mjs} +11 -22
- package/dist/federation/middleware.test.d.mts +2 -0
- package/dist/federation/{middleware.test.js → middleware.test.mjs} +173 -262
- package/dist/federation/mod.cjs +327 -16
- package/dist/federation/mod.d.cts +3 -6
- package/dist/federation/mod.d.ts +3 -6
- package/dist/federation/mod.js +322 -13
- package/dist/federation/mq.test.d.mts +2 -0
- package/dist/federation/{mq.test.js → mq.test.mjs} +21 -35
- package/dist/federation/negotiation.test.d.mts +2 -0
- package/dist/federation/{negotiation.test.js → negotiation.test.mjs} +9 -16
- package/dist/federation/retry.test.d.mts +2 -0
- package/dist/federation/{retry.test.js → retry.test.mjs} +8 -11
- package/dist/federation/router.test.d.mts +2 -0
- package/dist/federation/{router.test.js → router.test.mjs} +11 -16
- package/dist/federation/send.test.d.mts +2 -0
- package/dist/federation/{send.test.js → send.test.mjs} +22 -30
- package/dist/federation/webfinger.test.d.mts +2 -0
- package/dist/federation/{webfinger.test.js → webfinger.test.mjs} +22 -56
- package/dist/{http-DhH623ma.js → http-BLZWcpzg.js} +67 -187
- package/dist/{http-CKDim8Tw.js → http-BTLPIzFa.mjs} +37 -45
- package/dist/{http-BudnHZE2.d.cts → http-CrGuipxe.d.cts} +1 -6
- package/dist/{http-gvnJbMS1.cjs → http-CxodXLwi.cjs} +186 -300
- package/dist/{http-Dax_FIBo.d.ts → http-aQzN9Ayi.d.ts} +1 -6
- package/dist/{inbox-CA9AUEGa.js → inbox-mcbmhjTW.mjs} +18 -26
- package/dist/{key-BsSCz8Z_.js → key-1MaItIGc.mjs} +29 -37
- package/dist/{keycache-CpGWAUbj.js → keycache-CCSwkQcY.mjs} +5 -10
- package/dist/{keys-BFve7QQv.js → keys-BAK-tUlf.mjs} +5 -9
- package/dist/{kv-BL4nlICN.d.cts → kv-CbLNp3zQ.d.cts} +1 -1
- package/dist/{kv-DXEUEP6z.d.ts → kv-GFYnFoOl.d.ts} +1 -1
- package/dist/{kv-cache-Bw2F2ABq.js → kv-cache-B01V7s3h.mjs} +4 -8
- package/dist/{kv-cache-DK4GFVWx.cjs → kv-cache-DjC82_4n.cjs} +27 -34
- package/dist/{kv-cache-CxoHCR44.js → kv-cache-GIDK1oLs.js} +6 -13
- package/dist/{kv-QzKcOQgP.js → kv-tL2TOE9X.mjs} +6 -10
- package/dist/{ld-Bo_Rx0Fc.js → ld-94uHZ1eO.mjs} +17 -31
- package/dist/{middleware-BkrUA3da.js → middleware-B5Er10wE.js} +336 -383
- package/dist/middleware-CDuHbSVE.mjs +5 -0
- package/dist/middleware-CTyq5KB0.cjs +4 -0
- package/dist/{middleware-CpAnWzjC.cjs → middleware-CqDJSLoG.cjs} +532 -587
- package/dist/{middleware-CZ8jOOa3.js → middleware-DMZGXHm3.mjs} +282 -317
- package/dist/{mod-Bx9jcLB8.d.cts → mod-B505FZBC.d.cts} +3 -3
- package/dist/{mod-em2Il1eD.d.cts → mod-Bp_CzKd4.d.cts} +2 -2
- package/dist/{mod-Cs2dYEwI.d.ts → mod-D7PAuO6k.d.ts} +3 -3
- package/dist/{mod-D6MdymW7.d.ts → mod-DKOAow7a.d.ts} +2 -2
- package/dist/{mod-Coe7KEgX.d.cts → mod-DoJBjjnO.d.cts} +2 -2
- package/dist/{mod-D6dOd--H.d.ts → mod-DvxszxXC.d.ts} +2 -2
- package/dist/mod.cjs +29 -74
- package/dist/mod.d.cts +11 -14
- package/dist/mod.d.ts +11 -15
- package/dist/mod.js +17 -71
- package/dist/{negotiation-BlAuS_nr.js → negotiation-DnsfFF8I.mjs} +7 -11
- package/dist/nodeinfo/client.test.d.mts +2 -0
- package/dist/nodeinfo/{client.test.js → client.test.mjs} +22 -40
- package/dist/nodeinfo/handler.test.d.mts +2 -0
- package/dist/nodeinfo/{handler.test.js → handler.test.mjs} +13 -43
- package/dist/nodeinfo/mod.cjs +5 -8
- package/dist/nodeinfo/mod.d.cts +2 -3
- package/dist/nodeinfo/mod.d.ts +2 -3
- package/dist/nodeinfo/mod.js +4 -8
- package/dist/nodeinfo/types.test.d.mts +2 -0
- package/dist/nodeinfo/{types.test.js → types.test.mjs} +9 -16
- package/dist/otel/exporter.test.d.mts +2 -0
- package/dist/otel/{exporter.test.js → exporter.test.mjs} +124 -178
- package/dist/otel/mod.cjs +15 -20
- package/dist/otel/mod.d.cts +2 -2
- package/dist/otel/mod.d.ts +2 -2
- package/dist/otel/mod.js +8 -14
- package/dist/{owner-gd0Q9FuU.d.ts → owner-74ARJ5TL.d.ts} +1 -1
- package/dist/{owner-Bj_IbwIT.js → owner-B4aIDhg_.mjs} +11 -16
- package/dist/{owner-1AbPBOOZ.d.cts → owner-CptqhsOy.d.cts} +1 -1
- package/dist/{proof-u6Y358J-.js → proof-DYZWMWOC.mjs} +21 -33
- package/dist/{proof-BhFF_JVj.cjs → proof-DqCjiFwb.cjs} +133 -157
- package/dist/{proof-D5BQTIcU.js → proof-j-of9m5W.js} +33 -59
- package/dist/{retry-mqLf4b-R.js → retry-B_E3V_Dx.mjs} +4 -7
- package/dist/{router-D9eI0s4b.js → router-CrMLXoOr.mjs} +4 -8
- package/dist/runtime/mod.cjs +11 -13
- package/dist/runtime/mod.d.cts +6 -2
- package/dist/runtime/mod.d.ts +0 -1
- package/dist/runtime/mod.js +4 -7
- package/dist/{send-CE8h59oe.js → send-uLjD0uAe.mjs} +8 -13
- package/dist/sig/accept.test.d.mts +2 -0
- package/dist/sig/{accept.test.js → accept.test.mjs} +35 -70
- package/dist/sig/http.test.d.mts +2 -0
- package/dist/sig/{http.test.js → http.test.mjs} +209 -280
- package/dist/sig/key.test.d.mts +2 -0
- package/dist/sig/{key.test.js → key.test.mjs} +11 -18
- package/dist/sig/ld.test.d.mts +2 -0
- package/dist/sig/{ld.test.js → ld.test.mjs} +22 -35
- package/dist/sig/mod.cjs +6 -9
- package/dist/sig/mod.d.cts +3 -3
- package/dist/sig/mod.d.ts +3 -3
- package/dist/sig/mod.js +5 -9
- package/dist/sig/owner.test.d.mts +2 -0
- package/dist/sig/{owner.test.js → owner.test.mjs} +19 -34
- package/dist/sig/proof.test.d.mts +2 -0
- package/dist/sig/{proof.test.js → proof.test.mjs} +16 -27
- package/dist/{std__assert-X-_kMxKM.js → std__assert-Duiq_YC9.mjs} +12 -24
- package/dist/testing/{mod.d.ts → mod.d.mts} +26 -90
- package/dist/testing/mod.mjs +6 -0
- package/dist/{transformers-3g8GZwkZ.cjs → transformers-NeAONrAq.cjs} +20 -25
- package/dist/{transformers-C3FLHUd6.js → transformers-ve6e2xcg.js} +3 -7
- package/dist/{types-CPz01LGH.js → types-DCP0WLdt.mjs} +4 -7
- package/dist/{types-Cd_hszr_.cjs → types-KC4QAoxe.cjs} +29 -34
- package/dist/{types-C93Ob9cU.js → types-hvL8ElAs.js} +8 -13
- package/dist/utils/docloader.test.d.mts +2 -0
- package/dist/utils/{docloader.test.js → docloader.test.mjs} +14 -25
- package/dist/utils/kv-cache.test.d.mts +2 -0
- package/dist/utils/{kv-cache.test.js → kv-cache.test.mjs} +25 -40
- package/dist/utils/mod.cjs +5 -9
- package/dist/utils/mod.d.cts +1 -3
- package/dist/utils/mod.d.ts +1 -3
- package/dist/utils/mod.js +4 -9
- package/dist/vocab/cjs.test.d.mts +2 -0
- package/dist/vocab/cjs.test.mjs +14 -0
- package/dist/vocab/mod.cjs +10 -12
- package/dist/vocab/mod.js +3 -5
- package/package.json +7 -7
- package/dist/compat/transformers.test.d.ts +0 -3
- package/dist/compat/transformers.test.js +0 -88
- package/dist/compat-Bb4NuTUO.js +0 -4
- package/dist/compat-DmDDELst.cjs +0 -4
- package/dist/deno-BRMCYThi.js +0 -121
- package/dist/federation/builder.test.d.ts +0 -3
- package/dist/federation/collection.test.d.ts +0 -3
- package/dist/federation/collection.test.js +0 -32
- package/dist/federation/handler.test.d.ts +0 -3
- package/dist/federation/idempotency.test.d.ts +0 -3
- package/dist/federation/inbox.test.d.ts +0 -3
- package/dist/federation/keycache.test.d.ts +0 -3
- package/dist/federation/kv.test.d.ts +0 -3
- package/dist/federation/middleware.test.d.ts +0 -3
- package/dist/federation/mq.test.d.ts +0 -3
- package/dist/federation/negotiation.test.d.ts +0 -3
- package/dist/federation/retry.test.d.ts +0 -3
- package/dist/federation/router.test.d.ts +0 -3
- package/dist/federation/send.test.d.ts +0 -3
- package/dist/federation/webfinger.test.d.ts +0 -3
- package/dist/federation-Bp3HI26G.cjs +0 -350
- package/dist/federation-DaMfqRm4.js +0 -332
- package/dist/middleware-BtT_mKsB.cjs +0 -12
- package/dist/middleware-CUMoHNCA.js +0 -12
- package/dist/middleware-CzeVJTA1.js +0 -27
- package/dist/mod-B7QkWzrL.d.cts +0 -80
- package/dist/mod-Bh8mqlYw.d.cts +0 -9
- package/dist/mod-D6HodEq7.d.ts +0 -7
- package/dist/mod-SMHOMNpZ.d.ts +0 -82
- package/dist/mod-gq_Xfdz8.d.cts +0 -1
- package/dist/nodeinfo/client.test.d.ts +0 -3
- package/dist/nodeinfo/handler.test.d.ts +0 -3
- package/dist/nodeinfo/types.test.d.ts +0 -3
- package/dist/nodeinfo-DoESQxq5.js +0 -4
- package/dist/nodeinfo-DuMYTpbZ.cjs +0 -4
- package/dist/otel/exporter.test.d.ts +0 -3
- package/dist/runtime-c2Njxsry.cjs +0 -17
- package/dist/runtime-poamPCMb.js +0 -13
- package/dist/sig/accept.test.d.ts +0 -3
- package/dist/sig/http.test.d.ts +0 -3
- package/dist/sig/key.test.d.ts +0 -3
- package/dist/sig/ld.test.d.ts +0 -3
- package/dist/sig/owner.test.d.ts +0 -3
- package/dist/sig/proof.test.d.ts +0 -3
- package/dist/sig-BNhspNOf.js +0 -4
- package/dist/sig-vX39WyWI.cjs +0 -4
- package/dist/testing/mod.js +0 -10
- package/dist/utils/docloader.test.d.ts +0 -3
- package/dist/utils/kv-cache.test.d.ts +0 -3
- package/dist/utils-BQ9KqEK9.cjs +0 -4
- package/dist/utils-Dn5OPdSW.js +0 -4
- /package/dist/{mod-AGjRfPjT.d.ts → compat/transformers.test.d.mts} +0 -0
|
@@ -1,20 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import { fulfillAcceptSignature, parseAcceptSignature, validateAcceptSignature } from "./accept-D7sAxyNa.js";
|
|
8
|
-
import { fetchKeyDetailed, validateCryptoKey } from "./key-BsSCz8Z_.js";
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { n as version, t as name } from "./deno-C5VMwnFV.mjs";
|
|
5
|
+
import { i as validateAcceptSignature, n as fulfillAcceptSignature, r as parseAcceptSignature } from "./accept-Dd__NiUL.mjs";
|
|
6
|
+
import { o as validateCryptoKey, r as fetchKeyDetailed } from "./key-1MaItIGc.mjs";
|
|
9
7
|
import { CryptographicKey } from "@fedify/vocab";
|
|
10
|
-
import { getLogger } from "@logtape/logtape";
|
|
11
8
|
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
9
|
+
import { FetchError } from "@fedify/vocab-runtime";
|
|
10
|
+
import { getLogger } from "@logtape/logtape";
|
|
12
11
|
import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
|
|
13
12
|
import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
|
|
14
13
|
import { encodeHex } from "byte-encodings/hex";
|
|
15
14
|
import { Item, decodeDict, encodeItem } from "structured-field-values";
|
|
16
|
-
|
|
17
15
|
//#region src/sig/http.ts
|
|
16
|
+
const DEFAULT_MAX_REDIRECTION = 20;
|
|
18
17
|
/**
|
|
19
18
|
* Signs a request using the given private key.
|
|
20
19
|
* @param request The request to sign.
|
|
@@ -26,9 +25,7 @@ import { Item, decodeDict, encodeItem } from "structured-field-values";
|
|
|
26
25
|
*/
|
|
27
26
|
async function signRequest(request, privateKey, keyId, options = {}) {
|
|
28
27
|
validateCryptoKey(privateKey, "private");
|
|
29
|
-
|
|
30
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
31
|
-
return await tracer.startActiveSpan("http_signatures.sign", async (span) => {
|
|
28
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("http_signatures.sign", async (span) => {
|
|
32
29
|
try {
|
|
33
30
|
const spec = options.spec ?? "draft-cavage-http-signatures-12";
|
|
34
31
|
let signed;
|
|
@@ -136,9 +133,7 @@ const derivedComponents = {
|
|
|
136
133
|
* @returns The formatted signature string.
|
|
137
134
|
*/
|
|
138
135
|
function formatRfc9421Signature(signature, components, parameters, label = "sig1") {
|
|
139
|
-
|
|
140
|
-
const signatureValue = `${label}=:${encodeBase64(signature)}:`;
|
|
141
|
-
return [signatureInputValue, signatureValue];
|
|
136
|
+
return [`${label}=(${components.map((c) => formatComponentId(c)).join(" ")});${parameters}`, `${label}=:${encodeBase64(signature)}:`];
|
|
142
137
|
}
|
|
143
138
|
/**
|
|
144
139
|
* Parse RFC 9421 Signature-Input header.
|
|
@@ -244,12 +239,11 @@ async function signRequestRfc9421(request, privateKey, keyId, span, currentTime,
|
|
|
244
239
|
value: "content-digest",
|
|
245
240
|
params: {}
|
|
246
241
|
}] : []];
|
|
247
|
-
const expires = rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0;
|
|
248
242
|
const signatureParams = formatRfc9421SignatureParameters({
|
|
249
243
|
algorithm: "rsa-v1_5-sha256",
|
|
250
244
|
keyId,
|
|
251
245
|
created,
|
|
252
|
-
expires,
|
|
246
|
+
expires: rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0,
|
|
253
247
|
nonce: rfc9421Options?.nonce,
|
|
254
248
|
tag: rfc9421Options?.tag
|
|
255
249
|
});
|
|
@@ -359,9 +353,7 @@ async function verifyRequest(request, options = {}) {
|
|
|
359
353
|
* @since 2.1.0
|
|
360
354
|
*/
|
|
361
355
|
async function verifyRequestDetailed(request, options = {}) {
|
|
362
|
-
|
|
363
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
364
|
-
return await tracer.startActiveSpan("http_signatures.verify", async (span) => {
|
|
356
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("http_signatures.verify", async (span) => {
|
|
365
357
|
if (span.isRecording()) {
|
|
366
358
|
span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);
|
|
367
359
|
span.setAttribute(ATTR_URL_FULL, request.url);
|
|
@@ -556,8 +548,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
556
548
|
const message = headerNames.map((name) => `${name}: ` + (name === "(request-target)" ? `${request.method.toLowerCase()} ${new URL(request.url).pathname}` : name === "(created)" ? sigValues.created ?? "" : name === "(expires)" ? sigValues.expires ?? "" : name === "host" ? request.headers.get("host") ?? new URL(request.url).host : request.headers.get(name))).join("\n");
|
|
557
549
|
const sig = decodeBase64(signature);
|
|
558
550
|
span?.setAttribute("http_signatures.signature", encodeHex(sig));
|
|
559
|
-
|
|
560
|
-
if (!verified) {
|
|
551
|
+
if (!await crypto.subtle.verify("RSASSA-PKCS1-v1_5", key.publicKey, sig, new TextEncoder().encode(message))) {
|
|
561
552
|
if (cached) {
|
|
562
553
|
logger.debug("Failed to verify with the cached key {keyId}; signature {signature} is invalid. Retrying with the freshly fetched key...", {
|
|
563
554
|
keyId,
|
|
@@ -571,7 +562,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
571
562
|
currentTime,
|
|
572
563
|
keyCache: {
|
|
573
564
|
get: () => Promise.resolve(void 0),
|
|
574
|
-
set: async (keyId
|
|
565
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
575
566
|
}
|
|
576
567
|
});
|
|
577
568
|
}
|
|
@@ -733,9 +724,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
733
724
|
failure = invalidSignatureResult(keyId);
|
|
734
725
|
continue;
|
|
735
726
|
}
|
|
736
|
-
|
|
737
|
-
const digestValid = await verifyRfc9421ContentDigest(contentDigestHeader, body);
|
|
738
|
-
if (!digestValid) {
|
|
727
|
+
if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
|
|
739
728
|
logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
|
|
740
729
|
failure = invalidSignatureResult(keyId);
|
|
741
730
|
continue;
|
|
@@ -793,8 +782,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
793
782
|
const signatureBaseBytes = new TextEncoder().encode(signatureBase);
|
|
794
783
|
span?.setAttribute("http_signatures.signature", encodeHex(sigBytes));
|
|
795
784
|
try {
|
|
796
|
-
|
|
797
|
-
if (verified) return {
|
|
785
|
+
if (await crypto.subtle.verify(algorithm, key.publicKey, sigBytes.slice(), signatureBaseBytes)) return {
|
|
798
786
|
verified: true,
|
|
799
787
|
key,
|
|
800
788
|
signatureLabel: sigName
|
|
@@ -808,7 +796,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
808
796
|
currentTime,
|
|
809
797
|
keyCache: {
|
|
810
798
|
get: () => Promise.resolve(void 0),
|
|
811
|
-
set: async (keyId
|
|
799
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
812
800
|
},
|
|
813
801
|
spec: "rfc9421"
|
|
814
802
|
});
|
|
@@ -865,7 +853,11 @@ function createRedirectRequest(request, location, body) {
|
|
|
865
853
|
* @since 1.6.0
|
|
866
854
|
*/
|
|
867
855
|
async function doubleKnock(request, identity, options = {}) {
|
|
856
|
+
return await doubleKnockInternal(request, identity, options);
|
|
857
|
+
}
|
|
858
|
+
async function doubleKnockInternal(request, identity, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
868
859
|
const { specDeterminer, log, tracerProvider, signal } = options;
|
|
860
|
+
visited.add(request.url);
|
|
869
861
|
const origin = new URL(request.url).origin;
|
|
870
862
|
const firstTrySpec = specDeterminer == null ? "rfc9421" : await specDeterminer.determineSpec(origin);
|
|
871
863
|
const body = options.body !== void 0 ? options.body : request.method !== "GET" && request.method !== "HEAD" ? await request.clone().arrayBuffer() : null;
|
|
@@ -880,11 +872,13 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
880
872
|
signal
|
|
881
873
|
});
|
|
882
874
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
883
|
-
|
|
884
|
-
|
|
875
|
+
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
|
|
876
|
+
const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
|
|
877
|
+
if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
878
|
+
return doubleKnockInternal(redirectRequest, identity, {
|
|
885
879
|
...options,
|
|
886
880
|
body
|
|
887
|
-
});
|
|
881
|
+
}, redirected + 1, visited);
|
|
888
882
|
} else if (response.status === 400 || response.status === 401 || response.status > 401) {
|
|
889
883
|
const logger = getLogger([
|
|
890
884
|
"fedify",
|
|
@@ -927,13 +921,10 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
927
921
|
redirect: "manual",
|
|
928
922
|
signal
|
|
929
923
|
});
|
|
930
|
-
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
body
|
|
935
|
-
});
|
|
936
|
-
}
|
|
924
|
+
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
|
|
925
|
+
...options,
|
|
926
|
+
body
|
|
927
|
+
});
|
|
937
928
|
}
|
|
938
929
|
if (fulfilled && response.status < 300) {
|
|
939
930
|
await specDeterminer?.rememberSpec(origin, "rfc9421");
|
|
@@ -959,11 +950,13 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
959
950
|
signal
|
|
960
951
|
});
|
|
961
952
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
962
|
-
|
|
963
|
-
|
|
953
|
+
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
|
|
954
|
+
const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
|
|
955
|
+
if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
956
|
+
return doubleKnockInternal(redirectRequest, identity, {
|
|
964
957
|
...options,
|
|
965
958
|
body
|
|
966
|
-
});
|
|
959
|
+
}, redirected + 1, visited);
|
|
967
960
|
} else if (response.status !== 400 && response.status !== 401) await specDeterminer?.rememberSpec(origin, spec);
|
|
968
961
|
} else await specDeterminer?.rememberSpec(origin, firstTrySpec);
|
|
969
962
|
return response;
|
|
@@ -995,6 +988,5 @@ function timingSafeEqual(a, b) {
|
|
|
995
988
|
result |= lenA ^ lenB;
|
|
996
989
|
return result === 0;
|
|
997
990
|
}
|
|
998
|
-
|
|
999
991
|
//#endregion
|
|
1000
|
-
export {
|
|
992
|
+
export { parseRfc9421Signature as a, timingSafeEqual as c, formatRfc9421SignatureParameters as i, verifyRequest as l, doubleKnock as n, parseRfc9421SignatureInput as o, formatRfc9421Signature as r, signRequest as s, createRfc9421SignatureBase as t, verifyRequestDetailed as u };
|
|
@@ -3,7 +3,6 @@ import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
|
3
3
|
import { TracerProvider } from "@opentelemetry/api";
|
|
4
4
|
|
|
5
5
|
//#region src/sig/key.d.ts
|
|
6
|
-
|
|
7
6
|
/**
|
|
8
7
|
* Generates a key pair which is appropriate for Fedify.
|
|
9
8
|
* @param algorithm The algorithm to use. Currently only RSASSA-PKCS1-v1_5 and
|
|
@@ -536,9 +535,5 @@ interface HttpMessageSignaturesSpecDeterminer {
|
|
|
536
535
|
*/
|
|
537
536
|
rememberSpec(origin: string, spec: HttpMessageSignaturesSpec): void | Promise<void>;
|
|
538
537
|
}
|
|
539
|
-
/**
|
|
540
|
-
* The options for double-knock requests.
|
|
541
|
-
* @since 1.6.0
|
|
542
|
-
*/
|
|
543
538
|
//#endregion
|
|
544
|
-
export {
|
|
539
|
+
export { exportJwk as C, importJwk as D, generateCryptoKeyPair as E, KeyCache as S, fetchKeyDetailed as T, validateAcceptSignature as _, VerifyRequestDetailedResult as a, FetchKeyOptions as b, signRequest as c, AcceptSignatureMember as d, AcceptSignatureParameters as f, parseAcceptSignature as g, fulfillAcceptSignature as h, SignRequestOptions as i, verifyRequest as l, formatAcceptSignature as m, HttpMessageSignaturesSpecDeterminer as n, VerifyRequestFailureReason as o, FulfillAcceptSignatureResult as p, Rfc9421SignRequestOptions as r, VerifyRequestOptions as s, HttpMessageSignaturesSpec as t, verifyRequestDetailed as u, FetchKeyDetailedResult as v, fetchKey as w, FetchKeyResult as x, FetchKeyErrorResult as y };
|