@fedify/fedify 2.1.1 → 2.1.3
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-DbKYZdSy.js → builder-BKo51w-F.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-D5r_9RvZ.mjs +8 -0
- package/dist/{docloader-Ck0SCLXX.js → docloader-B9CXCw8i.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-DFzT4YFG.js → http-B53alCGi.mjs} +23 -43
- package/dist/{http-ca2xny58.cjs → http-BngkmEhl.cjs} +177 -302
- package/dist/{http-BudnHZE2.d.cts → http-CrGuipxe.d.cts} +1 -6
- package/dist/{http-EUQ6crVa.js → http-PS3wuU8D.js} +53 -184
- package/dist/{http-Dax_FIBo.d.ts → http-aQzN9Ayi.d.ts} +1 -6
- package/dist/{inbox-BMLz_-pL.js → inbox-CHsLu5ai.mjs} +18 -26
- package/dist/{key-CypuWa94.js → key-D9Np_ZXl.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-SKgbvvu4.js → kv-cache-B2Qi5MGv.js} +6 -13
- package/dist/{kv-cache-BBJFLMW5.cjs → kv-cache-YCtINZK4.cjs} +27 -34
- package/dist/{kv-QzKcOQgP.js → kv-tL2TOE9X.mjs} +6 -10
- package/dist/{ld-CXLtTc0G.js → ld-BaxRFhDd.mjs} +17 -31
- package/dist/{middleware-CL6XaAFy.cjs → middleware-Bsv-7iX7.cjs} +532 -587
- package/dist/middleware-C37OmOz_.mjs +5 -0
- package/dist/middleware-CelV2xrI.cjs +4 -0
- package/dist/{middleware-CvS6hWm3.js → middleware-Dn1kk96N.js} +335 -382
- package/dist/{middleware-BHJ0xm0L.js → middleware-dFn6ozt5.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-1AbPBOOZ.d.cts → owner-CptqhsOy.d.cts} +1 -1
- package/dist/{owner-CwMai3jn.js → owner-dxM51u36.mjs} +11 -16
- package/dist/{proof-ZuJBOUoi.js → proof-CH5U0k7G.mjs} +21 -33
- package/dist/{proof-sCID81Ua.cjs → proof-D39qiki3.cjs} +133 -157
- package/dist/{proof-6Zw1FW7t.js → proof-Dpgqx9RS.js} +32 -58
- 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-BW73dy6Q.js → send-D1-4ZnQq.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} +166 -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 +8 -8
- 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-DH972JvX.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-B8FJuMM0.js +0 -27
- package/dist/middleware-BVp930fR.js +0 -12
- package/dist/middleware-BvGP-uXy.cjs +0 -12
- 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,134 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const __opentelemetry_semantic_conventions = require_chunk.__toESM(require("@opentelemetry/semantic-conventions"));
|
|
13
|
-
const byte_encodings_base64 = require_chunk.__toESM(require("byte-encodings/base64"));
|
|
14
|
-
|
|
1
|
+
const { Temporal } = require("@js-temporal/polyfill");
|
|
2
|
+
const { URLPattern } = require("urlpattern-polyfill");
|
|
3
|
+
require("./chunk-DDcVe30Y.cjs");
|
|
4
|
+
let _logtape_logtape = require("@logtape/logtape");
|
|
5
|
+
let _fedify_vocab = require("@fedify/vocab");
|
|
6
|
+
let _opentelemetry_api = require("@opentelemetry/api");
|
|
7
|
+
let byte_encodings_hex = require("byte-encodings/hex");
|
|
8
|
+
let structured_field_values = require("structured-field-values");
|
|
9
|
+
let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
|
|
10
|
+
let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
|
|
11
|
+
let byte_encodings_base64 = require("byte-encodings/base64");
|
|
15
12
|
//#region deno.json
|
|
16
13
|
var name = "@fedify/fedify";
|
|
17
|
-
var version = "2.1.
|
|
18
|
-
var license = "MIT";
|
|
19
|
-
var exports$1 = {
|
|
20
|
-
".": "./src/mod.ts",
|
|
21
|
-
"./compat": "./src/compat/mod.ts",
|
|
22
|
-
"./federation": "./src/federation/mod.ts",
|
|
23
|
-
"./nodeinfo": "./src/nodeinfo/mod.ts",
|
|
24
|
-
"./otel": "./src/otel/mod.ts",
|
|
25
|
-
"./runtime": "./src/runtime/mod.ts",
|
|
26
|
-
"./sig": "./src/sig/mod.ts",
|
|
27
|
-
"./utils": "./src/utils/mod.ts",
|
|
28
|
-
"./vocab": "./src/vocab/mod.ts"
|
|
29
|
-
};
|
|
30
|
-
var imports = {
|
|
31
|
-
"@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
|
|
32
|
-
"@std/assert": "jsr:@std/assert@^0.226.0",
|
|
33
|
-
"@std/url": "jsr:@std/url@^0.225.1",
|
|
34
|
-
"asn1js": "npm:asn1js@^3.0.7",
|
|
35
|
-
"fast-check": "npm:fast-check@^3.22.0",
|
|
36
|
-
"fetch-mock": "npm:fetch-mock@^12.5.2",
|
|
37
|
-
"json-canon": "npm:json-canon@^1.0.1",
|
|
38
|
-
"jsonld": "npm:jsonld@^9.0.0",
|
|
39
|
-
"pkijs": "npm:pkijs@^3.3.3",
|
|
40
|
-
"structured-field-values": "npm:structured-field-values@^2.0.4",
|
|
41
|
-
"uri-template-router": "npm:uri-template-router@^1.0.0",
|
|
42
|
-
"url-template": "npm:url-template@^3.1.1"
|
|
43
|
-
};
|
|
44
|
-
var exclude = [
|
|
45
|
-
".test-report.xml",
|
|
46
|
-
"apidoc/",
|
|
47
|
-
"dist/",
|
|
48
|
-
"node_modules/",
|
|
49
|
-
"npm/",
|
|
50
|
-
"pnpm-lock.yaml",
|
|
51
|
-
"src/cfworkers/dist/",
|
|
52
|
-
"src/cfworkers/fixtures/",
|
|
53
|
-
"src/cfworkers/imports.ts",
|
|
54
|
-
"src/cfworkers/README.md",
|
|
55
|
-
"src/cfworkers/server.ts",
|
|
56
|
-
"src/cfworkers/server.js",
|
|
57
|
-
"src/cfworkers/server.js.map"
|
|
58
|
-
];
|
|
59
|
-
var publish = { "exclude": [
|
|
60
|
-
"**/*.test.ts",
|
|
61
|
-
"src/testing/",
|
|
62
|
-
"tsdown.config.ts",
|
|
63
|
-
"scripts/",
|
|
64
|
-
"wrangler.toml"
|
|
65
|
-
] };
|
|
66
|
-
var tasks = {
|
|
67
|
-
"codegen": "deno task -f @fedify/vocab compile",
|
|
68
|
-
"cache": {
|
|
69
|
-
"command": "deno cache src/mod.ts",
|
|
70
|
-
"dependencies": ["codegen"]
|
|
71
|
-
},
|
|
72
|
-
"check": {
|
|
73
|
-
"command": "deno fmt --check && deno lint && deno check src/**/*.ts",
|
|
74
|
-
"dependencies": ["codegen"]
|
|
75
|
-
},
|
|
76
|
-
"test": {
|
|
77
|
-
"command": "deno test --check --doc --allow-read --allow-write --allow-env --unstable-kv --trace-leaks --parallel",
|
|
78
|
-
"dependencies": ["codegen"]
|
|
79
|
-
},
|
|
80
|
-
"coverage": "deno task test --clean --coverage && deno coverage --html coverage",
|
|
81
|
-
"bench": {
|
|
82
|
-
"command": "deno bench --allow-read --allow-write --allow-net --allow-env --allow-run --unstable-kv",
|
|
83
|
-
"dependencies": ["codegen"]
|
|
84
|
-
},
|
|
85
|
-
"apidoc": {
|
|
86
|
-
"command": "deno doc --html --name=Fedify --output=apidoc/ src/mod.ts",
|
|
87
|
-
"dependencies": ["codegen"]
|
|
88
|
-
},
|
|
89
|
-
"publish": {
|
|
90
|
-
"command": "deno publish",
|
|
91
|
-
"dependencies": ["codegen"]
|
|
92
|
-
},
|
|
93
|
-
"pnpm:install": "pnpm install --silent",
|
|
94
|
-
"pnpm:build": {
|
|
95
|
-
"command": "pnpm exec tsdown",
|
|
96
|
-
"dependencies": ["pnpm:build-vocab"]
|
|
97
|
-
},
|
|
98
|
-
"test:node": {
|
|
99
|
-
"command": "cd dist/ && node --test",
|
|
100
|
-
"dependencies": ["pnpm:build"]
|
|
101
|
-
},
|
|
102
|
-
"test:bun": {
|
|
103
|
-
"command": "cd dist/ && bun test --timeout 60000",
|
|
104
|
-
"dependencies": ["pnpm:build"]
|
|
105
|
-
},
|
|
106
|
-
"test:cfworkers": {
|
|
107
|
-
"command": "pnpm exec wrangler deploy --dry-run --outdir src/cfworkers && node --import=tsx src/cfworkers/client.ts",
|
|
108
|
-
"dependencies": ["pnpm:build"]
|
|
109
|
-
},
|
|
110
|
-
"test-all": { "dependencies": [
|
|
111
|
-
"check",
|
|
112
|
-
"test",
|
|
113
|
-
"test:node",
|
|
114
|
-
"test:bun",
|
|
115
|
-
"test:cfworkers"
|
|
116
|
-
] }
|
|
117
|
-
};
|
|
118
|
-
var deno_default = {
|
|
119
|
-
name,
|
|
120
|
-
version,
|
|
121
|
-
license,
|
|
122
|
-
exports: exports$1,
|
|
123
|
-
imports,
|
|
124
|
-
exclude,
|
|
125
|
-
publish,
|
|
126
|
-
tasks
|
|
127
|
-
};
|
|
128
|
-
|
|
14
|
+
var version = "2.1.3";
|
|
129
15
|
//#endregion
|
|
130
16
|
//#region src/sig/accept.ts
|
|
131
17
|
/**
|
|
18
|
+
* `Accept-Signature` header parsing, serialization, and validation utilities
|
|
19
|
+
* for RFC 9421 §5 challenge-response negotiation.
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
132
24
|
* Parses an `Accept-Signature` header value (RFC 9421 §5.1) into an
|
|
133
25
|
* array of {@link AcceptSignatureMember} objects.
|
|
134
26
|
*
|
|
@@ -147,7 +39,7 @@ function parseAcceptSignature(header) {
|
|
|
147
39
|
try {
|
|
148
40
|
return parseEachSignature((0, structured_field_values.decodeDict)(header));
|
|
149
41
|
} catch {
|
|
150
|
-
(0,
|
|
42
|
+
(0, _logtape_logtape.getLogger)([
|
|
151
43
|
"fedify",
|
|
152
44
|
"sig",
|
|
153
45
|
"http"
|
|
@@ -216,7 +108,7 @@ const compactParameters = (member) => {
|
|
|
216
108
|
* @since 2.1.0
|
|
217
109
|
*/
|
|
218
110
|
function validateAcceptSignature(members) {
|
|
219
|
-
const logger = (0,
|
|
111
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
220
112
|
"fedify",
|
|
221
113
|
"sig",
|
|
222
114
|
"http"
|
|
@@ -259,7 +151,6 @@ function fulfillAcceptSignature(entry, localKeyId, localAlg) {
|
|
|
259
151
|
expires: entry.parameters.expires
|
|
260
152
|
};
|
|
261
153
|
}
|
|
262
|
-
|
|
263
154
|
//#endregion
|
|
264
155
|
//#region src/sig/key.ts
|
|
265
156
|
/**
|
|
@@ -275,8 +166,7 @@ function validateCryptoKey(key, type) {
|
|
|
275
166
|
if (!key.extractable) throw new TypeError("The key is not extractable.");
|
|
276
167
|
if (key.algorithm.name !== "RSASSA-PKCS1-v1_5" && key.algorithm.name !== "Ed25519") throw new TypeError("Currently only RSASSA-PKCS1-v1_5 and Ed25519 keys are supported. More algorithms will be added in the future!");
|
|
277
168
|
if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
|
|
278
|
-
|
|
279
|
-
if (algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
|
|
169
|
+
if (key.algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
|
|
280
170
|
}
|
|
281
171
|
}
|
|
282
172
|
/**
|
|
@@ -287,7 +177,7 @@ function validateCryptoKey(key, type) {
|
|
|
287
177
|
* @throws {TypeError} If the algorithm is unsupported.
|
|
288
178
|
*/
|
|
289
179
|
function generateCryptoKeyPair(algorithm) {
|
|
290
|
-
if (algorithm == null) (0,
|
|
180
|
+
if (algorithm == null) (0, _logtape_logtape.getLogger)([
|
|
291
181
|
"fedify",
|
|
292
182
|
"sig",
|
|
293
183
|
"key"
|
|
@@ -342,10 +232,9 @@ async function importJwk(jwk, type) {
|
|
|
342
232
|
return key;
|
|
343
233
|
}
|
|
344
234
|
async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
345
|
-
tracerProvider ??=
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
kind: __opentelemetry_api.SpanKind.CLIENT,
|
|
235
|
+
tracerProvider ??= _opentelemetry_api.trace.getTracerProvider();
|
|
236
|
+
return await tracerProvider.getTracer(name, version).startActiveSpan("activitypub.fetch_key", {
|
|
237
|
+
kind: _opentelemetry_api.SpanKind.CLIENT,
|
|
349
238
|
attributes: {
|
|
350
239
|
"http.method": "GET",
|
|
351
240
|
"url.full": keyId.href,
|
|
@@ -362,7 +251,7 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
|
362
251
|
return result;
|
|
363
252
|
} catch (e) {
|
|
364
253
|
span.setStatus({
|
|
365
|
-
code:
|
|
254
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
366
255
|
message: String(e)
|
|
367
256
|
});
|
|
368
257
|
throw e;
|
|
@@ -405,41 +294,41 @@ function fetchKey(keyId, cls, options = {}) {
|
|
|
405
294
|
async function fetchKeyDetailed(keyId, cls, options = {}) {
|
|
406
295
|
const cacheKey = typeof keyId === "string" ? new URL(keyId) : keyId;
|
|
407
296
|
return await withFetchKeySpan(cacheKey, options.tracerProvider, async () => {
|
|
408
|
-
return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey
|
|
409
|
-
const fetchError = await keyCache?.getFetchError?.(cacheKey
|
|
297
|
+
return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey, keyId, keyCache, logger) => {
|
|
298
|
+
const fetchError = await keyCache?.getFetchError?.(cacheKey);
|
|
410
299
|
if (fetchError != null) {
|
|
411
|
-
logger.debug("Entry {keyId} found in cache with preserved fetch failure details.", { keyId
|
|
300
|
+
logger.debug("Entry {keyId} found in cache with preserved fetch failure details.", { keyId });
|
|
412
301
|
return {
|
|
413
302
|
key: null,
|
|
414
303
|
cached: true,
|
|
415
304
|
fetchError
|
|
416
305
|
};
|
|
417
306
|
}
|
|
418
|
-
logger.debug("Entry {keyId} found in cache, but no fetch failure details are available.", { keyId
|
|
307
|
+
logger.debug("Entry {keyId} found in cache, but no fetch failure details are available.", { keyId });
|
|
419
308
|
return {
|
|
420
309
|
key: null,
|
|
421
310
|
cached: true
|
|
422
311
|
};
|
|
423
|
-
}, async (error, cacheKey
|
|
312
|
+
}, async (error, cacheKey, keyId, keyCache, logger) => {
|
|
424
313
|
logger.debug("Failed to fetch key {keyId}.", {
|
|
425
|
-
keyId
|
|
314
|
+
keyId,
|
|
426
315
|
error
|
|
427
316
|
});
|
|
428
|
-
await keyCache?.set(cacheKey
|
|
429
|
-
if (error instanceof
|
|
430
|
-
const fetchError
|
|
317
|
+
await keyCache?.set(cacheKey, null);
|
|
318
|
+
if (error instanceof _fedify_vocab_runtime.FetchError && error.response != null) {
|
|
319
|
+
const fetchError = {
|
|
431
320
|
status: error.response.status,
|
|
432
321
|
response: error.response.clone()
|
|
433
322
|
};
|
|
434
|
-
await keyCache?.setFetchError?.(cacheKey
|
|
323
|
+
await keyCache?.setFetchError?.(cacheKey, fetchError);
|
|
435
324
|
return {
|
|
436
325
|
key: null,
|
|
437
326
|
cached: false,
|
|
438
|
-
fetchError
|
|
327
|
+
fetchError
|
|
439
328
|
};
|
|
440
329
|
}
|
|
441
330
|
const fetchError = { error: error instanceof Error ? error : new Error(String(error)) };
|
|
442
|
-
await keyCache?.setFetchError?.(cacheKey
|
|
331
|
+
await keyCache?.setFetchError?.(cacheKey, fetchError);
|
|
443
332
|
return {
|
|
444
333
|
key: null,
|
|
445
334
|
cached: false,
|
|
@@ -472,7 +361,7 @@ async function clearFetchErrorMetadata(keyId, keyCache) {
|
|
|
472
361
|
async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider }, logger) {
|
|
473
362
|
let object;
|
|
474
363
|
try {
|
|
475
|
-
object = await
|
|
364
|
+
object = await _fedify_vocab.Object.fromJsonLd(document, {
|
|
476
365
|
documentLoader,
|
|
477
366
|
contextLoader,
|
|
478
367
|
tracerProvider
|
|
@@ -485,8 +374,8 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
|
|
|
485
374
|
contextLoader,
|
|
486
375
|
tracerProvider
|
|
487
376
|
});
|
|
488
|
-
} catch (e
|
|
489
|
-
if (e
|
|
377
|
+
} catch (e) {
|
|
378
|
+
if (e instanceof TypeError) {
|
|
490
379
|
logger.debug("Failed to verify; key {keyId} returned an invalid object.", { keyId });
|
|
491
380
|
await keyCache?.set(cacheKey, null);
|
|
492
381
|
await clearFetchErrorMetadata(cacheKey, keyCache);
|
|
@@ -495,13 +384,13 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
|
|
|
495
384
|
cached: false
|
|
496
385
|
};
|
|
497
386
|
}
|
|
498
|
-
throw e
|
|
387
|
+
throw e;
|
|
499
388
|
}
|
|
500
389
|
}
|
|
501
390
|
let key = null;
|
|
502
391
|
if (object instanceof cls) key = object;
|
|
503
|
-
else if ((0,
|
|
504
|
-
const keys = cls ===
|
|
392
|
+
else if ((0, _fedify_vocab.isActor)(object)) {
|
|
393
|
+
const keys = cls === _fedify_vocab.CryptographicKey ? object.getPublicKeys({
|
|
505
394
|
documentLoader,
|
|
506
395
|
contextLoader,
|
|
507
396
|
tracerProvider
|
|
@@ -563,7 +452,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
|
|
|
563
452
|
};
|
|
564
453
|
}
|
|
565
454
|
async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, onFetchError) {
|
|
566
|
-
const logger = (0,
|
|
455
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
567
456
|
"fedify",
|
|
568
457
|
"sig",
|
|
569
458
|
"key"
|
|
@@ -576,38 +465,35 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
576
465
|
logger.debug("Fetching key {keyId} to verify signature...", { keyId });
|
|
577
466
|
let document;
|
|
578
467
|
try {
|
|
579
|
-
|
|
580
|
-
document = remoteDocument.document;
|
|
468
|
+
document = (await (options.documentLoader ?? (0, _fedify_vocab_runtime.getDocumentLoader)())(keyId)).document;
|
|
581
469
|
} catch (error) {
|
|
582
470
|
return await onFetchError(error, cacheKey, keyId, keyCache, logger);
|
|
583
471
|
}
|
|
584
472
|
return await resolveFetchedKey(document, cacheKey, keyId, cls, options, logger);
|
|
585
473
|
}
|
|
586
474
|
async function fetchKeyInternal(keyId, cls, options = {}) {
|
|
587
|
-
|
|
588
|
-
return await fetchKeyWithResult(cacheKey, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
|
|
475
|
+
return await fetchKeyWithResult(typeof keyId === "string" ? new URL(keyId) : keyId, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
|
|
589
476
|
return {
|
|
590
477
|
key: null,
|
|
591
478
|
cached: true
|
|
592
479
|
};
|
|
593
|
-
}, async (error, cacheKey
|
|
480
|
+
}, async (error, cacheKey, keyId, keyCache, logger) => {
|
|
594
481
|
logger.debug("Failed to fetch key {keyId}.", {
|
|
595
|
-
keyId
|
|
482
|
+
keyId,
|
|
596
483
|
error
|
|
597
484
|
});
|
|
598
|
-
await keyCache?.set(cacheKey
|
|
599
|
-
if (error instanceof
|
|
485
|
+
await keyCache?.set(cacheKey, null);
|
|
486
|
+
if (error instanceof _fedify_vocab_runtime.FetchError && error.response != null) await keyCache?.setFetchError?.(cacheKey, {
|
|
600
487
|
status: error.response.status,
|
|
601
488
|
response: error.response.clone()
|
|
602
489
|
});
|
|
603
|
-
else await keyCache?.setFetchError?.(cacheKey
|
|
490
|
+
else await keyCache?.setFetchError?.(cacheKey, { error: error instanceof Error ? error : new Error(String(error)) });
|
|
604
491
|
return {
|
|
605
492
|
key: null,
|
|
606
493
|
cached: false
|
|
607
494
|
};
|
|
608
495
|
});
|
|
609
496
|
}
|
|
610
|
-
|
|
611
497
|
//#endregion
|
|
612
498
|
//#region src/sig/http.ts
|
|
613
499
|
const DEFAULT_MAX_REDIRECTION = 20;
|
|
@@ -622,24 +508,22 @@ const DEFAULT_MAX_REDIRECTION = 20;
|
|
|
622
508
|
*/
|
|
623
509
|
async function signRequest(request, privateKey, keyId, options = {}) {
|
|
624
510
|
validateCryptoKey(privateKey, "private");
|
|
625
|
-
|
|
626
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
627
|
-
return await tracer.startActiveSpan("http_signatures.sign", async (span) => {
|
|
511
|
+
return await (options.tracerProvider ?? _opentelemetry_api.trace.getTracerProvider()).getTracer(name, version).startActiveSpan("http_signatures.sign", async (span) => {
|
|
628
512
|
try {
|
|
629
513
|
const spec = options.spec ?? "draft-cavage-http-signatures-12";
|
|
630
514
|
let signed;
|
|
631
515
|
if (spec === "rfc9421") signed = await signRequestRfc9421(request, privateKey, keyId, span, options.currentTime, options.body, options.rfc9421);
|
|
632
516
|
else signed = await signRequestDraft(request, privateKey, keyId, span, options.currentTime, options.body);
|
|
633
517
|
if (span.isRecording()) {
|
|
634
|
-
span.setAttribute(
|
|
635
|
-
span.setAttribute(
|
|
636
|
-
for (const [name
|
|
518
|
+
span.setAttribute(_opentelemetry_semantic_conventions.ATTR_HTTP_REQUEST_METHOD, signed.method);
|
|
519
|
+
span.setAttribute(_opentelemetry_semantic_conventions.ATTR_URL_FULL, signed.url);
|
|
520
|
+
for (const [name, value] of signed.headers) span.setAttribute((0, _opentelemetry_semantic_conventions.ATTR_HTTP_REQUEST_HEADER)(name), value);
|
|
637
521
|
span.setAttribute("http_signatures.key_id", keyId.href);
|
|
638
522
|
}
|
|
639
523
|
return signed;
|
|
640
524
|
} catch (error) {
|
|
641
525
|
span.setStatus({
|
|
642
|
-
code:
|
|
526
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
643
527
|
message: String(error)
|
|
644
528
|
});
|
|
645
529
|
throw error;
|
|
@@ -661,8 +545,8 @@ async function signRequestDraft(request, privateKey, keyId, span, currentTime, b
|
|
|
661
545
|
}
|
|
662
546
|
if (!headers.has("Date")) headers.set("Date", currentTime == null ? (/* @__PURE__ */ new Date()).toUTCString() : new Date(currentTime.toString()).toUTCString());
|
|
663
547
|
const serialized = [["(request-target)", `${request.method.toLowerCase()} ${url.pathname}`], ...headers];
|
|
664
|
-
const headerNames = serialized.map(([name
|
|
665
|
-
const message = serialized.map(([name
|
|
548
|
+
const headerNames = serialized.map(([name]) => name);
|
|
549
|
+
const message = serialized.map(([name, value]) => `${name}: ${value.trim()}`).join("\n");
|
|
666
550
|
const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, new TextEncoder().encode(message));
|
|
667
551
|
const sigHeader = `keyId="${keyId.href}",algorithm="rsa-sha256",headers="${headerNames.join(" ")}",signature="${(0, byte_encodings_base64.encodeBase64)(signature)}"`;
|
|
668
552
|
headers.set("Signature", sigHeader);
|
|
@@ -732,9 +616,7 @@ const derivedComponents = {
|
|
|
732
616
|
* @returns The formatted signature string.
|
|
733
617
|
*/
|
|
734
618
|
function formatRfc9421Signature(signature, components, parameters, label = "sig1") {
|
|
735
|
-
|
|
736
|
-
const signatureValue = `${label}=:${(0, byte_encodings_base64.encodeBase64)(signature)}:`;
|
|
737
|
-
return [signatureInputValue, signatureValue];
|
|
619
|
+
return [`${label}=(${components.map((c) => formatComponentId(c)).join(" ")});${parameters}`, `${label}=:${(0, byte_encodings_base64.encodeBase64)(signature)}:`];
|
|
738
620
|
}
|
|
739
621
|
/**
|
|
740
622
|
* Parse RFC 9421 Signature-Input header.
|
|
@@ -746,7 +628,7 @@ function parseRfc9421SignatureInput(signatureInput) {
|
|
|
746
628
|
try {
|
|
747
629
|
dict = (0, structured_field_values.decodeDict)(signatureInput);
|
|
748
630
|
} catch (error) {
|
|
749
|
-
(0,
|
|
631
|
+
(0, _logtape_logtape.getLogger)([
|
|
750
632
|
"fedify",
|
|
751
633
|
"sig",
|
|
752
634
|
"http"
|
|
@@ -786,7 +668,7 @@ function parseRfc9421Signature(signature) {
|
|
|
786
668
|
try {
|
|
787
669
|
dict = (0, structured_field_values.decodeDict)(signature);
|
|
788
670
|
} catch (error) {
|
|
789
|
-
(0,
|
|
671
|
+
(0, _logtape_logtape.getLogger)([
|
|
790
672
|
"fedify",
|
|
791
673
|
"sig",
|
|
792
674
|
"http"
|
|
@@ -840,12 +722,11 @@ async function signRequestRfc9421(request, privateKey, keyId, span, currentTime,
|
|
|
840
722
|
value: "content-digest",
|
|
841
723
|
params: {}
|
|
842
724
|
}] : []];
|
|
843
|
-
const expires = rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0;
|
|
844
725
|
const signatureParams = formatRfc9421SignatureParameters({
|
|
845
726
|
algorithm: "rsa-v1_5-sha256",
|
|
846
727
|
keyId,
|
|
847
728
|
created,
|
|
848
|
-
expires,
|
|
729
|
+
expires: rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0,
|
|
849
730
|
nonce: rfc9421Options?.nonce,
|
|
850
731
|
tag: rfc9421Options?.tag
|
|
851
732
|
});
|
|
@@ -955,13 +836,11 @@ async function verifyRequest(request, options = {}) {
|
|
|
955
836
|
* @since 2.1.0
|
|
956
837
|
*/
|
|
957
838
|
async function verifyRequestDetailed(request, options = {}) {
|
|
958
|
-
|
|
959
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
960
|
-
return await tracer.startActiveSpan("http_signatures.verify", async (span) => {
|
|
839
|
+
return await (options.tracerProvider ?? _opentelemetry_api.trace.getTracerProvider()).getTracer(name, version).startActiveSpan("http_signatures.verify", async (span) => {
|
|
961
840
|
if (span.isRecording()) {
|
|
962
|
-
span.setAttribute(
|
|
963
|
-
span.setAttribute(
|
|
964
|
-
for (const [name
|
|
841
|
+
span.setAttribute(_opentelemetry_semantic_conventions.ATTR_HTTP_REQUEST_METHOD, request.method);
|
|
842
|
+
span.setAttribute(_opentelemetry_semantic_conventions.ATTR_URL_FULL, request.url);
|
|
843
|
+
for (const [name, value] of request.headers) span.setAttribute((0, _opentelemetry_semantic_conventions.ATTR_HTTP_REQUEST_HEADER)(name), value);
|
|
965
844
|
}
|
|
966
845
|
try {
|
|
967
846
|
let spec = options.spec;
|
|
@@ -970,11 +849,11 @@ async function verifyRequestDetailed(request, options = {}) {
|
|
|
970
849
|
if (spec === "rfc9421") result = await verifyRequestRfc9421(request, span, options);
|
|
971
850
|
else result = await verifyRequestDraft(request, span, options);
|
|
972
851
|
recordVerificationResult(span, result);
|
|
973
|
-
if (!result.verified) span.setStatus({ code:
|
|
852
|
+
if (!result.verified) span.setStatus({ code: _opentelemetry_api.SpanStatusCode.ERROR });
|
|
974
853
|
return result;
|
|
975
854
|
} catch (error) {
|
|
976
855
|
span.setStatus({
|
|
977
|
-
code:
|
|
856
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
978
857
|
message: String(error)
|
|
979
858
|
});
|
|
980
859
|
throw error;
|
|
@@ -984,7 +863,7 @@ async function verifyRequestDetailed(request, options = {}) {
|
|
|
984
863
|
});
|
|
985
864
|
}
|
|
986
865
|
async function verifyRequestDraft(request, span, { documentLoader, contextLoader, timeWindow, currentTime, keyCache, tracerProvider } = {}) {
|
|
987
|
-
const logger = (0,
|
|
866
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
988
867
|
"fedify",
|
|
989
868
|
"sig",
|
|
990
869
|
"http"
|
|
@@ -1132,7 +1011,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1132
1011
|
if (keyIdUrl == null) return invalidSignatureResult(null);
|
|
1133
1012
|
span?.setAttribute("http_signatures.key_id", keyId);
|
|
1134
1013
|
if ("algorithm" in sigValues) span?.setAttribute("http_signatures.algorithm", sigValues.algorithm);
|
|
1135
|
-
const { key, cached, fetchError } = await fetchKeyDetailed(keyIdUrl,
|
|
1014
|
+
const { key, cached, fetchError } = await fetchKeyDetailed(keyIdUrl, _fedify_vocab.CryptographicKey, {
|
|
1136
1015
|
documentLoader,
|
|
1137
1016
|
contextLoader,
|
|
1138
1017
|
keyCache,
|
|
@@ -1149,11 +1028,10 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1149
1028
|
logger.debug("Failed to verify; required headers missing in the Signature header: {headers}.", { headers });
|
|
1150
1029
|
return invalidSignatureResult(keyIdUrl);
|
|
1151
1030
|
}
|
|
1152
|
-
const message = headerNames.map((name
|
|
1031
|
+
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");
|
|
1153
1032
|
const sig = (0, byte_encodings_base64.decodeBase64)(signature);
|
|
1154
1033
|
span?.setAttribute("http_signatures.signature", (0, byte_encodings_hex.encodeHex)(sig));
|
|
1155
|
-
|
|
1156
|
-
if (!verified) {
|
|
1034
|
+
if (!await crypto.subtle.verify("RSASSA-PKCS1-v1_5", key.publicKey, sig, new TextEncoder().encode(message))) {
|
|
1157
1035
|
if (cached) {
|
|
1158
1036
|
logger.debug("Failed to verify with the cached key {keyId}; signature {signature} is invalid. Retrying with the freshly fetched key...", {
|
|
1159
1037
|
keyId,
|
|
@@ -1167,7 +1045,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1167
1045
|
currentTime,
|
|
1168
1046
|
keyCache: {
|
|
1169
1047
|
get: () => Promise.resolve(void 0),
|
|
1170
|
-
set: async (keyId
|
|
1048
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
1171
1049
|
}
|
|
1172
1050
|
});
|
|
1173
1051
|
}
|
|
@@ -1245,7 +1123,7 @@ async function verifyRfc9421ContentDigest(digestHeader, body) {
|
|
|
1245
1123
|
return false;
|
|
1246
1124
|
}
|
|
1247
1125
|
async function verifyRequestRfc9421(request, span, { documentLoader, contextLoader, timeWindow, currentTime, keyCache, tracerProvider } = {}) {
|
|
1248
|
-
const logger = (0,
|
|
1126
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
1249
1127
|
"fedify",
|
|
1250
1128
|
"sig",
|
|
1251
1129
|
"http"
|
|
@@ -1329,9 +1207,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1329
1207
|
failure = invalidSignatureResult(keyId);
|
|
1330
1208
|
continue;
|
|
1331
1209
|
}
|
|
1332
|
-
|
|
1333
|
-
const digestValid = await verifyRfc9421ContentDigest(contentDigestHeader, body);
|
|
1334
|
-
if (!digestValid) {
|
|
1210
|
+
if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
|
|
1335
1211
|
logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
|
|
1336
1212
|
failure = invalidSignatureResult(keyId);
|
|
1337
1213
|
continue;
|
|
@@ -1343,7 +1219,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1343
1219
|
failure = invalidSignatureResult(null);
|
|
1344
1220
|
continue;
|
|
1345
1221
|
}
|
|
1346
|
-
const { key, cached, fetchError } = await fetchKeyDetailed(keyId,
|
|
1222
|
+
const { key, cached, fetchError } = await fetchKeyDetailed(keyId, _fedify_vocab.CryptographicKey, {
|
|
1347
1223
|
documentLoader,
|
|
1348
1224
|
contextLoader,
|
|
1349
1225
|
keyCache,
|
|
@@ -1389,8 +1265,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1389
1265
|
const signatureBaseBytes = new TextEncoder().encode(signatureBase);
|
|
1390
1266
|
span?.setAttribute("http_signatures.signature", (0, byte_encodings_hex.encodeHex)(sigBytes));
|
|
1391
1267
|
try {
|
|
1392
|
-
|
|
1393
|
-
if (verified) return {
|
|
1268
|
+
if (await crypto.subtle.verify(algorithm, key.publicKey, sigBytes.slice(), signatureBaseBytes)) return {
|
|
1394
1269
|
verified: true,
|
|
1395
1270
|
key,
|
|
1396
1271
|
signatureLabel: sigName
|
|
@@ -1404,7 +1279,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1404
1279
|
currentTime,
|
|
1405
1280
|
keyCache: {
|
|
1406
1281
|
get: () => Promise.resolve(void 0),
|
|
1407
|
-
set: async (keyId
|
|
1282
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
1408
1283
|
},
|
|
1409
1284
|
spec: "rfc9421"
|
|
1410
1285
|
});
|
|
@@ -1480,16 +1355,15 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
|
|
|
1480
1355
|
signal
|
|
1481
1356
|
});
|
|
1482
1357
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1483
|
-
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new
|
|
1484
|
-
const
|
|
1485
|
-
|
|
1486
|
-
if (visited.has(redirectRequest.url)) throw new __fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
1358
|
+
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
|
|
1359
|
+
const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
|
|
1360
|
+
if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
1487
1361
|
return doubleKnockInternal(redirectRequest, identity, {
|
|
1488
1362
|
...options,
|
|
1489
1363
|
body
|
|
1490
1364
|
}, redirected + 1, visited);
|
|
1491
1365
|
} else if (response.status === 400 || response.status === 401 || response.status > 401) {
|
|
1492
|
-
const logger = (0,
|
|
1366
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
1493
1367
|
"fedify",
|
|
1494
1368
|
"sig",
|
|
1495
1369
|
"http"
|
|
@@ -1530,13 +1404,10 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
|
|
|
1530
1404
|
redirect: "manual",
|
|
1531
1405
|
signal
|
|
1532
1406
|
});
|
|
1533
|
-
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
body
|
|
1538
|
-
});
|
|
1539
|
-
}
|
|
1407
|
+
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
|
|
1408
|
+
...options,
|
|
1409
|
+
body
|
|
1410
|
+
});
|
|
1540
1411
|
}
|
|
1541
1412
|
if (fulfilled && response.status < 300) {
|
|
1542
1413
|
await specDeterminer?.rememberSpec(origin, "rfc9421");
|
|
@@ -1562,10 +1433,9 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
|
|
|
1562
1433
|
signal
|
|
1563
1434
|
});
|
|
1564
1435
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1565
|
-
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new
|
|
1566
|
-
const
|
|
1567
|
-
|
|
1568
|
-
if (visited.has(redirectRequest.url)) throw new __fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
1436
|
+
if (redirected >= DEFAULT_MAX_REDIRECTION) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
|
|
1437
|
+
const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
|
|
1438
|
+
if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
|
|
1569
1439
|
return doubleKnockInternal(redirectRequest, identity, {
|
|
1570
1440
|
...options,
|
|
1571
1441
|
body
|
|
@@ -1601,101 +1471,106 @@ function timingSafeEqual(a, b) {
|
|
|
1601
1471
|
result |= lenA ^ lenB;
|
|
1602
1472
|
return result === 0;
|
|
1603
1473
|
}
|
|
1604
|
-
|
|
1605
1474
|
//#endregion
|
|
1606
|
-
Object.defineProperty(exports,
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1475
|
+
Object.defineProperty(exports, "doubleKnock", {
|
|
1476
|
+
enumerable: true,
|
|
1477
|
+
get: function() {
|
|
1478
|
+
return doubleKnock;
|
|
1479
|
+
}
|
|
1611
1480
|
});
|
|
1612
|
-
Object.defineProperty(exports,
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1481
|
+
Object.defineProperty(exports, "exportJwk", {
|
|
1482
|
+
enumerable: true,
|
|
1483
|
+
get: function() {
|
|
1484
|
+
return exportJwk;
|
|
1485
|
+
}
|
|
1486
|
+
});
|
|
1487
|
+
Object.defineProperty(exports, "fetchKey", {
|
|
1488
|
+
enumerable: true,
|
|
1489
|
+
get: function() {
|
|
1490
|
+
return fetchKey;
|
|
1491
|
+
}
|
|
1617
1492
|
});
|
|
1618
|
-
Object.defineProperty(exports,
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1493
|
+
Object.defineProperty(exports, "fetchKeyDetailed", {
|
|
1494
|
+
enumerable: true,
|
|
1495
|
+
get: function() {
|
|
1496
|
+
return fetchKeyDetailed;
|
|
1497
|
+
}
|
|
1498
|
+
});
|
|
1499
|
+
Object.defineProperty(exports, "formatAcceptSignature", {
|
|
1500
|
+
enumerable: true,
|
|
1501
|
+
get: function() {
|
|
1502
|
+
return formatAcceptSignature;
|
|
1503
|
+
}
|
|
1623
1504
|
});
|
|
1624
|
-
Object.defineProperty(exports,
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1505
|
+
Object.defineProperty(exports, "fulfillAcceptSignature", {
|
|
1506
|
+
enumerable: true,
|
|
1507
|
+
get: function() {
|
|
1508
|
+
return fulfillAcceptSignature;
|
|
1509
|
+
}
|
|
1629
1510
|
});
|
|
1630
|
-
Object.defineProperty(exports,
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1511
|
+
Object.defineProperty(exports, "generateCryptoKeyPair", {
|
|
1512
|
+
enumerable: true,
|
|
1513
|
+
get: function() {
|
|
1514
|
+
return generateCryptoKeyPair;
|
|
1515
|
+
}
|
|
1635
1516
|
});
|
|
1636
|
-
Object.defineProperty(exports,
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1517
|
+
Object.defineProperty(exports, "importJwk", {
|
|
1518
|
+
enumerable: true,
|
|
1519
|
+
get: function() {
|
|
1520
|
+
return importJwk;
|
|
1521
|
+
}
|
|
1641
1522
|
});
|
|
1642
|
-
Object.defineProperty(exports,
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1523
|
+
Object.defineProperty(exports, "name", {
|
|
1524
|
+
enumerable: true,
|
|
1525
|
+
get: function() {
|
|
1526
|
+
return name;
|
|
1527
|
+
}
|
|
1647
1528
|
});
|
|
1648
|
-
Object.defineProperty(exports,
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1529
|
+
Object.defineProperty(exports, "parseAcceptSignature", {
|
|
1530
|
+
enumerable: true,
|
|
1531
|
+
get: function() {
|
|
1532
|
+
return parseAcceptSignature;
|
|
1533
|
+
}
|
|
1653
1534
|
});
|
|
1654
|
-
Object.defineProperty(exports,
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1535
|
+
Object.defineProperty(exports, "parseRfc9421SignatureInput", {
|
|
1536
|
+
enumerable: true,
|
|
1537
|
+
get: function() {
|
|
1538
|
+
return parseRfc9421SignatureInput;
|
|
1539
|
+
}
|
|
1659
1540
|
});
|
|
1660
|
-
Object.defineProperty(exports,
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1541
|
+
Object.defineProperty(exports, "signRequest", {
|
|
1542
|
+
enumerable: true,
|
|
1543
|
+
get: function() {
|
|
1544
|
+
return signRequest;
|
|
1545
|
+
}
|
|
1665
1546
|
});
|
|
1666
|
-
Object.defineProperty(exports,
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1547
|
+
Object.defineProperty(exports, "validateAcceptSignature", {
|
|
1548
|
+
enumerable: true,
|
|
1549
|
+
get: function() {
|
|
1550
|
+
return validateAcceptSignature;
|
|
1551
|
+
}
|
|
1671
1552
|
});
|
|
1672
|
-
Object.defineProperty(exports,
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1553
|
+
Object.defineProperty(exports, "validateCryptoKey", {
|
|
1554
|
+
enumerable: true,
|
|
1555
|
+
get: function() {
|
|
1556
|
+
return validateCryptoKey;
|
|
1557
|
+
}
|
|
1677
1558
|
});
|
|
1678
|
-
Object.defineProperty(exports,
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1559
|
+
Object.defineProperty(exports, "verifyRequest", {
|
|
1560
|
+
enumerable: true,
|
|
1561
|
+
get: function() {
|
|
1562
|
+
return verifyRequest;
|
|
1563
|
+
}
|
|
1683
1564
|
});
|
|
1684
|
-
Object.defineProperty(exports,
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1565
|
+
Object.defineProperty(exports, "verifyRequestDetailed", {
|
|
1566
|
+
enumerable: true,
|
|
1567
|
+
get: function() {
|
|
1568
|
+
return verifyRequestDetailed;
|
|
1569
|
+
}
|
|
1689
1570
|
});
|
|
1690
|
-
Object.defineProperty(exports,
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1571
|
+
Object.defineProperty(exports, "version", {
|
|
1572
|
+
enumerable: true,
|
|
1573
|
+
get: function() {
|
|
1574
|
+
return version;
|
|
1575
|
+
}
|
|
1695
1576
|
});
|
|
1696
|
-
Object.defineProperty(exports, 'verifyRequestDetailed', {
|
|
1697
|
-
enumerable: true,
|
|
1698
|
-
get: function () {
|
|
1699
|
-
return verifyRequestDetailed;
|
|
1700
|
-
}
|
|
1701
|
-
});
|