@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,134 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const byte_encodings_base64 = require_chunk.__toESM(require("byte-encodings/base64"));
|
|
13
|
-
const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runtime"));
|
|
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.2";
|
|
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,40 +465,38 @@ 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
|
|
499
|
+
const DEFAULT_MAX_REDIRECTION = 20;
|
|
613
500
|
/**
|
|
614
501
|
* Signs a request using the given private key.
|
|
615
502
|
* @param request The request to sign.
|
|
@@ -621,24 +508,22 @@ async function fetchKeyInternal(keyId, cls, options = {}) {
|
|
|
621
508
|
*/
|
|
622
509
|
async function signRequest(request, privateKey, keyId, options = {}) {
|
|
623
510
|
validateCryptoKey(privateKey, "private");
|
|
624
|
-
|
|
625
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
626
|
-
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) => {
|
|
627
512
|
try {
|
|
628
513
|
const spec = options.spec ?? "draft-cavage-http-signatures-12";
|
|
629
514
|
let signed;
|
|
630
515
|
if (spec === "rfc9421") signed = await signRequestRfc9421(request, privateKey, keyId, span, options.currentTime, options.body, options.rfc9421);
|
|
631
516
|
else signed = await signRequestDraft(request, privateKey, keyId, span, options.currentTime, options.body);
|
|
632
517
|
if (span.isRecording()) {
|
|
633
|
-
span.setAttribute(
|
|
634
|
-
span.setAttribute(
|
|
635
|
-
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);
|
|
636
521
|
span.setAttribute("http_signatures.key_id", keyId.href);
|
|
637
522
|
}
|
|
638
523
|
return signed;
|
|
639
524
|
} catch (error) {
|
|
640
525
|
span.setStatus({
|
|
641
|
-
code:
|
|
526
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
642
527
|
message: String(error)
|
|
643
528
|
});
|
|
644
529
|
throw error;
|
|
@@ -660,8 +545,8 @@ async function signRequestDraft(request, privateKey, keyId, span, currentTime, b
|
|
|
660
545
|
}
|
|
661
546
|
if (!headers.has("Date")) headers.set("Date", currentTime == null ? (/* @__PURE__ */ new Date()).toUTCString() : new Date(currentTime.toString()).toUTCString());
|
|
662
547
|
const serialized = [["(request-target)", `${request.method.toLowerCase()} ${url.pathname}`], ...headers];
|
|
663
|
-
const headerNames = serialized.map(([name
|
|
664
|
-
const message = serialized.map(([name
|
|
548
|
+
const headerNames = serialized.map(([name]) => name);
|
|
549
|
+
const message = serialized.map(([name, value]) => `${name}: ${value.trim()}`).join("\n");
|
|
665
550
|
const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, new TextEncoder().encode(message));
|
|
666
551
|
const sigHeader = `keyId="${keyId.href}",algorithm="rsa-sha256",headers="${headerNames.join(" ")}",signature="${(0, byte_encodings_base64.encodeBase64)(signature)}"`;
|
|
667
552
|
headers.set("Signature", sigHeader);
|
|
@@ -731,9 +616,7 @@ const derivedComponents = {
|
|
|
731
616
|
* @returns The formatted signature string.
|
|
732
617
|
*/
|
|
733
618
|
function formatRfc9421Signature(signature, components, parameters, label = "sig1") {
|
|
734
|
-
|
|
735
|
-
const signatureValue = `${label}=:${(0, byte_encodings_base64.encodeBase64)(signature)}:`;
|
|
736
|
-
return [signatureInputValue, signatureValue];
|
|
619
|
+
return [`${label}=(${components.map((c) => formatComponentId(c)).join(" ")});${parameters}`, `${label}=:${(0, byte_encodings_base64.encodeBase64)(signature)}:`];
|
|
737
620
|
}
|
|
738
621
|
/**
|
|
739
622
|
* Parse RFC 9421 Signature-Input header.
|
|
@@ -745,7 +628,7 @@ function parseRfc9421SignatureInput(signatureInput) {
|
|
|
745
628
|
try {
|
|
746
629
|
dict = (0, structured_field_values.decodeDict)(signatureInput);
|
|
747
630
|
} catch (error) {
|
|
748
|
-
(0,
|
|
631
|
+
(0, _logtape_logtape.getLogger)([
|
|
749
632
|
"fedify",
|
|
750
633
|
"sig",
|
|
751
634
|
"http"
|
|
@@ -785,7 +668,7 @@ function parseRfc9421Signature(signature) {
|
|
|
785
668
|
try {
|
|
786
669
|
dict = (0, structured_field_values.decodeDict)(signature);
|
|
787
670
|
} catch (error) {
|
|
788
|
-
(0,
|
|
671
|
+
(0, _logtape_logtape.getLogger)([
|
|
789
672
|
"fedify",
|
|
790
673
|
"sig",
|
|
791
674
|
"http"
|
|
@@ -839,12 +722,11 @@ async function signRequestRfc9421(request, privateKey, keyId, span, currentTime,
|
|
|
839
722
|
value: "content-digest",
|
|
840
723
|
params: {}
|
|
841
724
|
}] : []];
|
|
842
|
-
const expires = rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0;
|
|
843
725
|
const signatureParams = formatRfc9421SignatureParameters({
|
|
844
726
|
algorithm: "rsa-v1_5-sha256",
|
|
845
727
|
keyId,
|
|
846
728
|
created,
|
|
847
|
-
expires,
|
|
729
|
+
expires: rfc9421Options?.expires === true ? (currentTime.epochMilliseconds / 1e3 | 0) + 3600 : void 0,
|
|
848
730
|
nonce: rfc9421Options?.nonce,
|
|
849
731
|
tag: rfc9421Options?.tag
|
|
850
732
|
});
|
|
@@ -954,13 +836,11 @@ async function verifyRequest(request, options = {}) {
|
|
|
954
836
|
* @since 2.1.0
|
|
955
837
|
*/
|
|
956
838
|
async function verifyRequestDetailed(request, options = {}) {
|
|
957
|
-
|
|
958
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
959
|
-
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) => {
|
|
960
840
|
if (span.isRecording()) {
|
|
961
|
-
span.setAttribute(
|
|
962
|
-
span.setAttribute(
|
|
963
|
-
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);
|
|
964
844
|
}
|
|
965
845
|
try {
|
|
966
846
|
let spec = options.spec;
|
|
@@ -969,11 +849,11 @@ async function verifyRequestDetailed(request, options = {}) {
|
|
|
969
849
|
if (spec === "rfc9421") result = await verifyRequestRfc9421(request, span, options);
|
|
970
850
|
else result = await verifyRequestDraft(request, span, options);
|
|
971
851
|
recordVerificationResult(span, result);
|
|
972
|
-
if (!result.verified) span.setStatus({ code:
|
|
852
|
+
if (!result.verified) span.setStatus({ code: _opentelemetry_api.SpanStatusCode.ERROR });
|
|
973
853
|
return result;
|
|
974
854
|
} catch (error) {
|
|
975
855
|
span.setStatus({
|
|
976
|
-
code:
|
|
856
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
977
857
|
message: String(error)
|
|
978
858
|
});
|
|
979
859
|
throw error;
|
|
@@ -983,7 +863,7 @@ async function verifyRequestDetailed(request, options = {}) {
|
|
|
983
863
|
});
|
|
984
864
|
}
|
|
985
865
|
async function verifyRequestDraft(request, span, { documentLoader, contextLoader, timeWindow, currentTime, keyCache, tracerProvider } = {}) {
|
|
986
|
-
const logger = (0,
|
|
866
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
987
867
|
"fedify",
|
|
988
868
|
"sig",
|
|
989
869
|
"http"
|
|
@@ -1131,7 +1011,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1131
1011
|
if (keyIdUrl == null) return invalidSignatureResult(null);
|
|
1132
1012
|
span?.setAttribute("http_signatures.key_id", keyId);
|
|
1133
1013
|
if ("algorithm" in sigValues) span?.setAttribute("http_signatures.algorithm", sigValues.algorithm);
|
|
1134
|
-
const { key, cached, fetchError } = await fetchKeyDetailed(keyIdUrl,
|
|
1014
|
+
const { key, cached, fetchError } = await fetchKeyDetailed(keyIdUrl, _fedify_vocab.CryptographicKey, {
|
|
1135
1015
|
documentLoader,
|
|
1136
1016
|
contextLoader,
|
|
1137
1017
|
keyCache,
|
|
@@ -1148,11 +1028,10 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1148
1028
|
logger.debug("Failed to verify; required headers missing in the Signature header: {headers}.", { headers });
|
|
1149
1029
|
return invalidSignatureResult(keyIdUrl);
|
|
1150
1030
|
}
|
|
1151
|
-
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");
|
|
1152
1032
|
const sig = (0, byte_encodings_base64.decodeBase64)(signature);
|
|
1153
1033
|
span?.setAttribute("http_signatures.signature", (0, byte_encodings_hex.encodeHex)(sig));
|
|
1154
|
-
|
|
1155
|
-
if (!verified) {
|
|
1034
|
+
if (!await crypto.subtle.verify("RSASSA-PKCS1-v1_5", key.publicKey, sig, new TextEncoder().encode(message))) {
|
|
1156
1035
|
if (cached) {
|
|
1157
1036
|
logger.debug("Failed to verify with the cached key {keyId}; signature {signature} is invalid. Retrying with the freshly fetched key...", {
|
|
1158
1037
|
keyId,
|
|
@@ -1166,7 +1045,7 @@ async function verifyRequestDraft(request, span, { documentLoader, contextLoader
|
|
|
1166
1045
|
currentTime,
|
|
1167
1046
|
keyCache: {
|
|
1168
1047
|
get: () => Promise.resolve(void 0),
|
|
1169
|
-
set: async (keyId
|
|
1048
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
1170
1049
|
}
|
|
1171
1050
|
});
|
|
1172
1051
|
}
|
|
@@ -1244,7 +1123,7 @@ async function verifyRfc9421ContentDigest(digestHeader, body) {
|
|
|
1244
1123
|
return false;
|
|
1245
1124
|
}
|
|
1246
1125
|
async function verifyRequestRfc9421(request, span, { documentLoader, contextLoader, timeWindow, currentTime, keyCache, tracerProvider } = {}) {
|
|
1247
|
-
const logger = (0,
|
|
1126
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
1248
1127
|
"fedify",
|
|
1249
1128
|
"sig",
|
|
1250
1129
|
"http"
|
|
@@ -1328,9 +1207,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1328
1207
|
failure = invalidSignatureResult(keyId);
|
|
1329
1208
|
continue;
|
|
1330
1209
|
}
|
|
1331
|
-
|
|
1332
|
-
const digestValid = await verifyRfc9421ContentDigest(contentDigestHeader, body);
|
|
1333
|
-
if (!digestValid) {
|
|
1210
|
+
if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
|
|
1334
1211
|
logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
|
|
1335
1212
|
failure = invalidSignatureResult(keyId);
|
|
1336
1213
|
continue;
|
|
@@ -1342,7 +1219,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1342
1219
|
failure = invalidSignatureResult(null);
|
|
1343
1220
|
continue;
|
|
1344
1221
|
}
|
|
1345
|
-
const { key, cached, fetchError } = await fetchKeyDetailed(keyId,
|
|
1222
|
+
const { key, cached, fetchError } = await fetchKeyDetailed(keyId, _fedify_vocab.CryptographicKey, {
|
|
1346
1223
|
documentLoader,
|
|
1347
1224
|
contextLoader,
|
|
1348
1225
|
keyCache,
|
|
@@ -1388,8 +1265,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1388
1265
|
const signatureBaseBytes = new TextEncoder().encode(signatureBase);
|
|
1389
1266
|
span?.setAttribute("http_signatures.signature", (0, byte_encodings_hex.encodeHex)(sigBytes));
|
|
1390
1267
|
try {
|
|
1391
|
-
|
|
1392
|
-
if (verified) return {
|
|
1268
|
+
if (await crypto.subtle.verify(algorithm, key.publicKey, sigBytes.slice(), signatureBaseBytes)) return {
|
|
1393
1269
|
verified: true,
|
|
1394
1270
|
key,
|
|
1395
1271
|
signatureLabel: sigName
|
|
@@ -1403,7 +1279,7 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
|
|
|
1403
1279
|
currentTime,
|
|
1404
1280
|
keyCache: {
|
|
1405
1281
|
get: () => Promise.resolve(void 0),
|
|
1406
|
-
set: async (keyId
|
|
1282
|
+
set: async (keyId, key) => await keyCache?.set(keyId, key)
|
|
1407
1283
|
},
|
|
1408
1284
|
spec: "rfc9421"
|
|
1409
1285
|
});
|
|
@@ -1460,7 +1336,11 @@ function createRedirectRequest(request, location, body) {
|
|
|
1460
1336
|
* @since 1.6.0
|
|
1461
1337
|
*/
|
|
1462
1338
|
async function doubleKnock(request, identity, options = {}) {
|
|
1339
|
+
return await doubleKnockInternal(request, identity, options);
|
|
1340
|
+
}
|
|
1341
|
+
async function doubleKnockInternal(request, identity, options, redirected = 0, visited = /* @__PURE__ */ new Set()) {
|
|
1463
1342
|
const { specDeterminer, log, tracerProvider, signal } = options;
|
|
1343
|
+
visited.add(request.url);
|
|
1464
1344
|
const origin = new URL(request.url).origin;
|
|
1465
1345
|
const firstTrySpec = specDeterminer == null ? "rfc9421" : await specDeterminer.determineSpec(origin);
|
|
1466
1346
|
const body = options.body !== void 0 ? options.body : request.method !== "GET" && request.method !== "HEAD" ? await request.clone().arrayBuffer() : null;
|
|
@@ -1475,13 +1355,15 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
1475
1355
|
signal
|
|
1476
1356
|
});
|
|
1477
1357
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1478
|
-
|
|
1479
|
-
|
|
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}`);
|
|
1361
|
+
return doubleKnockInternal(redirectRequest, identity, {
|
|
1480
1362
|
...options,
|
|
1481
1363
|
body
|
|
1482
|
-
});
|
|
1364
|
+
}, redirected + 1, visited);
|
|
1483
1365
|
} else if (response.status === 400 || response.status === 401 || response.status > 401) {
|
|
1484
|
-
const logger = (0,
|
|
1366
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
1485
1367
|
"fedify",
|
|
1486
1368
|
"sig",
|
|
1487
1369
|
"http"
|
|
@@ -1522,13 +1404,10 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
1522
1404
|
redirect: "manual",
|
|
1523
1405
|
signal
|
|
1524
1406
|
});
|
|
1525
|
-
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
body
|
|
1530
|
-
});
|
|
1531
|
-
}
|
|
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
|
+
});
|
|
1532
1411
|
}
|
|
1533
1412
|
if (fulfilled && response.status < 300) {
|
|
1534
1413
|
await specDeterminer?.rememberSpec(origin, "rfc9421");
|
|
@@ -1554,11 +1433,13 @@ async function doubleKnock(request, identity, options = {}) {
|
|
|
1554
1433
|
signal
|
|
1555
1434
|
});
|
|
1556
1435
|
if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
|
|
1557
|
-
|
|
1558
|
-
|
|
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}`);
|
|
1439
|
+
return doubleKnockInternal(redirectRequest, identity, {
|
|
1559
1440
|
...options,
|
|
1560
1441
|
body
|
|
1561
|
-
});
|
|
1442
|
+
}, redirected + 1, visited);
|
|
1562
1443
|
} else if (response.status !== 400 && response.status !== 401) await specDeterminer?.rememberSpec(origin, spec);
|
|
1563
1444
|
} else await specDeterminer?.rememberSpec(origin, firstTrySpec);
|
|
1564
1445
|
return response;
|
|
@@ -1590,101 +1471,106 @@ function timingSafeEqual(a, b) {
|
|
|
1590
1471
|
result |= lenA ^ lenB;
|
|
1591
1472
|
return result === 0;
|
|
1592
1473
|
}
|
|
1593
|
-
|
|
1594
1474
|
//#endregion
|
|
1595
|
-
Object.defineProperty(exports,
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1475
|
+
Object.defineProperty(exports, "doubleKnock", {
|
|
1476
|
+
enumerable: true,
|
|
1477
|
+
get: function() {
|
|
1478
|
+
return doubleKnock;
|
|
1479
|
+
}
|
|
1600
1480
|
});
|
|
1601
|
-
Object.defineProperty(exports,
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1481
|
+
Object.defineProperty(exports, "exportJwk", {
|
|
1482
|
+
enumerable: true,
|
|
1483
|
+
get: function() {
|
|
1484
|
+
return exportJwk;
|
|
1485
|
+
}
|
|
1606
1486
|
});
|
|
1607
|
-
Object.defineProperty(exports,
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1487
|
+
Object.defineProperty(exports, "fetchKey", {
|
|
1488
|
+
enumerable: true,
|
|
1489
|
+
get: function() {
|
|
1490
|
+
return fetchKey;
|
|
1491
|
+
}
|
|
1612
1492
|
});
|
|
1613
|
-
Object.defineProperty(exports,
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1493
|
+
Object.defineProperty(exports, "fetchKeyDetailed", {
|
|
1494
|
+
enumerable: true,
|
|
1495
|
+
get: function() {
|
|
1496
|
+
return fetchKeyDetailed;
|
|
1497
|
+
}
|
|
1618
1498
|
});
|
|
1619
|
-
Object.defineProperty(exports,
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1499
|
+
Object.defineProperty(exports, "formatAcceptSignature", {
|
|
1500
|
+
enumerable: true,
|
|
1501
|
+
get: function() {
|
|
1502
|
+
return formatAcceptSignature;
|
|
1503
|
+
}
|
|
1624
1504
|
});
|
|
1625
|
-
Object.defineProperty(exports,
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1505
|
+
Object.defineProperty(exports, "fulfillAcceptSignature", {
|
|
1506
|
+
enumerable: true,
|
|
1507
|
+
get: function() {
|
|
1508
|
+
return fulfillAcceptSignature;
|
|
1509
|
+
}
|
|
1630
1510
|
});
|
|
1631
|
-
Object.defineProperty(exports,
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1511
|
+
Object.defineProperty(exports, "generateCryptoKeyPair", {
|
|
1512
|
+
enumerable: true,
|
|
1513
|
+
get: function() {
|
|
1514
|
+
return generateCryptoKeyPair;
|
|
1515
|
+
}
|
|
1636
1516
|
});
|
|
1637
|
-
Object.defineProperty(exports,
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1517
|
+
Object.defineProperty(exports, "importJwk", {
|
|
1518
|
+
enumerable: true,
|
|
1519
|
+
get: function() {
|
|
1520
|
+
return importJwk;
|
|
1521
|
+
}
|
|
1522
|
+
});
|
|
1523
|
+
Object.defineProperty(exports, "name", {
|
|
1524
|
+
enumerable: true,
|
|
1525
|
+
get: function() {
|
|
1526
|
+
return name;
|
|
1527
|
+
}
|
|
1642
1528
|
});
|
|
1643
|
-
Object.defineProperty(exports,
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1529
|
+
Object.defineProperty(exports, "parseAcceptSignature", {
|
|
1530
|
+
enumerable: true,
|
|
1531
|
+
get: function() {
|
|
1532
|
+
return parseAcceptSignature;
|
|
1533
|
+
}
|
|
1534
|
+
});
|
|
1535
|
+
Object.defineProperty(exports, "parseRfc9421SignatureInput", {
|
|
1536
|
+
enumerable: true,
|
|
1537
|
+
get: function() {
|
|
1538
|
+
return parseRfc9421SignatureInput;
|
|
1539
|
+
}
|
|
1648
1540
|
});
|
|
1649
|
-
Object.defineProperty(exports,
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1541
|
+
Object.defineProperty(exports, "signRequest", {
|
|
1542
|
+
enumerable: true,
|
|
1543
|
+
get: function() {
|
|
1544
|
+
return signRequest;
|
|
1545
|
+
}
|
|
1654
1546
|
});
|
|
1655
|
-
Object.defineProperty(exports,
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1547
|
+
Object.defineProperty(exports, "validateAcceptSignature", {
|
|
1548
|
+
enumerable: true,
|
|
1549
|
+
get: function() {
|
|
1550
|
+
return validateAcceptSignature;
|
|
1551
|
+
}
|
|
1660
1552
|
});
|
|
1661
|
-
Object.defineProperty(exports,
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1553
|
+
Object.defineProperty(exports, "validateCryptoKey", {
|
|
1554
|
+
enumerable: true,
|
|
1555
|
+
get: function() {
|
|
1556
|
+
return validateCryptoKey;
|
|
1557
|
+
}
|
|
1666
1558
|
});
|
|
1667
|
-
Object.defineProperty(exports,
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1559
|
+
Object.defineProperty(exports, "verifyRequest", {
|
|
1560
|
+
enumerable: true,
|
|
1561
|
+
get: function() {
|
|
1562
|
+
return verifyRequest;
|
|
1563
|
+
}
|
|
1672
1564
|
});
|
|
1673
|
-
Object.defineProperty(exports,
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1565
|
+
Object.defineProperty(exports, "verifyRequestDetailed", {
|
|
1566
|
+
enumerable: true,
|
|
1567
|
+
get: function() {
|
|
1568
|
+
return verifyRequestDetailed;
|
|
1569
|
+
}
|
|
1678
1570
|
});
|
|
1679
|
-
Object.defineProperty(exports,
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1571
|
+
Object.defineProperty(exports, "version", {
|
|
1572
|
+
enumerable: true,
|
|
1573
|
+
get: function() {
|
|
1574
|
+
return version;
|
|
1575
|
+
}
|
|
1684
1576
|
});
|
|
1685
|
-
Object.defineProperty(exports, 'verifyRequestDetailed', {
|
|
1686
|
-
enumerable: true,
|
|
1687
|
-
get: function () {
|
|
1688
|
-
return verifyRequestDetailed;
|
|
1689
|
-
}
|
|
1690
|
-
});
|