@fedify/webfinger 2.4.0-dev.2155 → 2.4.0-dev.2157
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/deno.json +1 -1
- package/dist/lookup.test.cjs +48 -4
- package/dist/lookup.test.js +47 -4
- package/dist/mod.cjs +6 -2
- package/dist/mod.js +6 -2
- package/package.json +2 -2
- package/src/lookup.test.ts +67 -0
- package/src/lookup.ts +11 -4
package/deno.json
CHANGED
package/dist/lookup.test.cjs
CHANGED
|
@@ -22,10 +22,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
22
22
|
}) : target, mod));
|
|
23
23
|
//#endregion
|
|
24
24
|
let _fedify_fixture = require("@fedify/fixture");
|
|
25
|
-
let es_toolkit = require("es-toolkit");
|
|
26
|
-
let node_assert_strict = require("node:assert/strict");
|
|
27
25
|
let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
|
|
28
26
|
let _logtape_logtape = require("@logtape/logtape");
|
|
27
|
+
let es_toolkit = require("es-toolkit");
|
|
28
|
+
let node_assert_strict = require("node:assert/strict");
|
|
29
|
+
let node_dns_promises = require("node:dns/promises");
|
|
30
|
+
node_dns_promises = __toESM(node_dns_promises, 1);
|
|
29
31
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
30
32
|
//#endregion
|
|
31
33
|
//#region ../../node_modules/.pnpm/regexparam@3.0.0/node_modules/regexparam/dist/index.mjs
|
|
@@ -1235,7 +1237,7 @@ var esm_default = new class FetchMock {
|
|
|
1235
1237
|
//#endregion
|
|
1236
1238
|
//#region deno.json
|
|
1237
1239
|
var name = "@fedify/webfinger";
|
|
1238
|
-
var version = "2.4.0-dev.
|
|
1240
|
+
var version = "2.4.0-dev.2157+b76e5888";
|
|
1239
1241
|
//#endregion
|
|
1240
1242
|
//#region src/body.ts
|
|
1241
1243
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
|
@@ -1454,7 +1456,11 @@ async function lookupWebFingerInternal(resource, options = {}) {
|
|
|
1454
1456
|
await (0, _fedify_vocab_runtime.validatePublicUrl)(url.href);
|
|
1455
1457
|
} catch (e) {
|
|
1456
1458
|
if (e instanceof _fedify_vocab_runtime.UrlError) {
|
|
1457
|
-
logger.
|
|
1459
|
+
if (e.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
1460
|
+
url: url.href,
|
|
1461
|
+
error: e
|
|
1462
|
+
});
|
|
1463
|
+
else logger.error("Invalid URL for WebFinger resource descriptor: {error}", { error: e });
|
|
1458
1464
|
return {
|
|
1459
1465
|
resource: null,
|
|
1460
1466
|
result: "network_error",
|
|
@@ -1996,4 +2002,42 @@ async function lookupWebFingerInternal(resource, options = {}) {
|
|
|
1996
2002
|
esm_default.hardReset();
|
|
1997
2003
|
}
|
|
1998
2004
|
});
|
|
2005
|
+
(0, _fedify_fixture.test)("lookupWebFinger() logs DNS failures as such", async (t) => {
|
|
2006
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") return;
|
|
2007
|
+
for (const result of [
|
|
2008
|
+
"throws",
|
|
2009
|
+
"empty",
|
|
2010
|
+
"private"
|
|
2011
|
+
]) await t.step(result, async () => {
|
|
2012
|
+
const originalLookup = node_dns_promises.default.lookup;
|
|
2013
|
+
node_dns_promises.default.lookup = (() => result === "throws" ? Promise.reject(/* @__PURE__ */ new Error("Resolver unavailable")) : Promise.resolve(result === "empty" ? [] : [{
|
|
2014
|
+
address: "127.0.0.1",
|
|
2015
|
+
family: 4
|
|
2016
|
+
}]));
|
|
2017
|
+
const records = [];
|
|
2018
|
+
await (0, _logtape_logtape.configure)({
|
|
2019
|
+
sinks: { buffer: (record) => records.push(record) },
|
|
2020
|
+
loggers: [{
|
|
2021
|
+
category: "fedify",
|
|
2022
|
+
sinks: ["buffer"],
|
|
2023
|
+
lowestLevel: "debug"
|
|
2024
|
+
}, {
|
|
2025
|
+
category: ["logtape", "meta"],
|
|
2026
|
+
sinks: []
|
|
2027
|
+
}],
|
|
2028
|
+
reset: true
|
|
2029
|
+
});
|
|
2030
|
+
try {
|
|
2031
|
+
(0, node_assert_strict.deepStrictEqual)(await lookupWebFinger("acct:alice@dns-failure.invalid"), null);
|
|
2032
|
+
const failures = records.filter((r) => r.rawMessage !== "Fetching WebFinger resource descriptor from {url}...");
|
|
2033
|
+
(0, node_assert_strict.deepStrictEqual)(failures.map((r) => [r.level, r.rawMessage]), [result === "private" ? ["error", "Invalid URL for WebFinger resource descriptor: {error}"] : ["debug", "DNS lookup failed for {url}"]]);
|
|
2034
|
+
const { error } = failures[0].properties;
|
|
2035
|
+
(0, node_assert_strict.ok)(error instanceof _fedify_vocab_runtime.UrlError);
|
|
2036
|
+
(0, node_assert_strict.deepStrictEqual)(error.reason, result === "private" ? "disallowed" : "dns");
|
|
2037
|
+
} finally {
|
|
2038
|
+
await (0, _logtape_logtape.reset)();
|
|
2039
|
+
node_dns_promises.default.lookup = originalLookup;
|
|
2040
|
+
}
|
|
2041
|
+
});
|
|
2042
|
+
});
|
|
1999
2043
|
//#endregion
|
package/dist/lookup.test.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createTestMeterProvider, test } from "@fedify/fixture";
|
|
2
|
+
import { FetchError, UrlError, getUserAgent, validatePublicUrl } from "@fedify/vocab-runtime";
|
|
3
|
+
import { configure, getLogger, reset } from "@logtape/logtape";
|
|
2
4
|
import { withTimeout } from "es-toolkit";
|
|
3
5
|
import { deepStrictEqual, ok } from "node:assert/strict";
|
|
4
|
-
import
|
|
5
|
-
import { getLogger } from "@logtape/logtape";
|
|
6
|
+
import dns from "node:dns/promises";
|
|
6
7
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
7
8
|
//#region \0rolldown/runtime.js
|
|
8
9
|
var __create = Object.create;
|
|
@@ -1234,7 +1235,7 @@ var esm_default = new class FetchMock {
|
|
|
1234
1235
|
//#endregion
|
|
1235
1236
|
//#region deno.json
|
|
1236
1237
|
var name = "@fedify/webfinger";
|
|
1237
|
-
var version = "2.4.0-dev.
|
|
1238
|
+
var version = "2.4.0-dev.2157+b76e5888";
|
|
1238
1239
|
//#endregion
|
|
1239
1240
|
//#region src/body.ts
|
|
1240
1241
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
|
@@ -1453,7 +1454,11 @@ async function lookupWebFingerInternal(resource, options = {}) {
|
|
|
1453
1454
|
await validatePublicUrl(url.href);
|
|
1454
1455
|
} catch (e) {
|
|
1455
1456
|
if (e instanceof UrlError) {
|
|
1456
|
-
logger.
|
|
1457
|
+
if (e.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
1458
|
+
url: url.href,
|
|
1459
|
+
error: e
|
|
1460
|
+
});
|
|
1461
|
+
else logger.error("Invalid URL for WebFinger resource descriptor: {error}", { error: e });
|
|
1457
1462
|
return {
|
|
1458
1463
|
resource: null,
|
|
1459
1464
|
result: "network_error",
|
|
@@ -1995,5 +2000,43 @@ test("lookupWebFinger() bounds resource descriptors", async () => {
|
|
|
1995
2000
|
esm_default.hardReset();
|
|
1996
2001
|
}
|
|
1997
2002
|
});
|
|
2003
|
+
test("lookupWebFinger() logs DNS failures as such", async (t) => {
|
|
2004
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") return;
|
|
2005
|
+
for (const result of [
|
|
2006
|
+
"throws",
|
|
2007
|
+
"empty",
|
|
2008
|
+
"private"
|
|
2009
|
+
]) await t.step(result, async () => {
|
|
2010
|
+
const originalLookup = dns.lookup;
|
|
2011
|
+
dns.lookup = (() => result === "throws" ? Promise.reject(/* @__PURE__ */ new Error("Resolver unavailable")) : Promise.resolve(result === "empty" ? [] : [{
|
|
2012
|
+
address: "127.0.0.1",
|
|
2013
|
+
family: 4
|
|
2014
|
+
}]));
|
|
2015
|
+
const records = [];
|
|
2016
|
+
await configure({
|
|
2017
|
+
sinks: { buffer: (record) => records.push(record) },
|
|
2018
|
+
loggers: [{
|
|
2019
|
+
category: "fedify",
|
|
2020
|
+
sinks: ["buffer"],
|
|
2021
|
+
lowestLevel: "debug"
|
|
2022
|
+
}, {
|
|
2023
|
+
category: ["logtape", "meta"],
|
|
2024
|
+
sinks: []
|
|
2025
|
+
}],
|
|
2026
|
+
reset: true
|
|
2027
|
+
});
|
|
2028
|
+
try {
|
|
2029
|
+
deepStrictEqual(await lookupWebFinger("acct:alice@dns-failure.invalid"), null);
|
|
2030
|
+
const failures = records.filter((r) => r.rawMessage !== "Fetching WebFinger resource descriptor from {url}...");
|
|
2031
|
+
deepStrictEqual(failures.map((r) => [r.level, r.rawMessage]), [result === "private" ? ["error", "Invalid URL for WebFinger resource descriptor: {error}"] : ["debug", "DNS lookup failed for {url}"]]);
|
|
2032
|
+
const { error } = failures[0].properties;
|
|
2033
|
+
ok(error instanceof UrlError);
|
|
2034
|
+
deepStrictEqual(error.reason, result === "private" ? "disallowed" : "dns");
|
|
2035
|
+
} finally {
|
|
2036
|
+
await reset();
|
|
2037
|
+
dns.lookup = originalLookup;
|
|
2038
|
+
}
|
|
2039
|
+
});
|
|
2040
|
+
});
|
|
1998
2041
|
//#endregion
|
|
1999
2042
|
export {};
|
package/dist/mod.cjs
CHANGED
|
@@ -4,7 +4,7 @@ let _logtape_logtape = require("@logtape/logtape");
|
|
|
4
4
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
5
5
|
//#region deno.json
|
|
6
6
|
var name = "@fedify/webfinger";
|
|
7
|
-
var version = "2.4.0-dev.
|
|
7
|
+
var version = "2.4.0-dev.2157+b76e5888";
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region src/body.ts
|
|
10
10
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
|
@@ -223,7 +223,11 @@ async function lookupWebFingerInternal(resource, options = {}) {
|
|
|
223
223
|
await (0, _fedify_vocab_runtime.validatePublicUrl)(url.href);
|
|
224
224
|
} catch (e) {
|
|
225
225
|
if (e instanceof _fedify_vocab_runtime.UrlError) {
|
|
226
|
-
logger.
|
|
226
|
+
if (e.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
227
|
+
url: url.href,
|
|
228
|
+
error: e
|
|
229
|
+
});
|
|
230
|
+
else logger.error("Invalid URL for WebFinger resource descriptor: {error}", { error: e });
|
|
227
231
|
return {
|
|
228
232
|
resource: null,
|
|
229
233
|
result: "network_error",
|
package/dist/mod.js
CHANGED
|
@@ -3,7 +3,7 @@ import { getLogger } from "@logtape/logtape";
|
|
|
3
3
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
4
4
|
//#region deno.json
|
|
5
5
|
var name = "@fedify/webfinger";
|
|
6
|
-
var version = "2.4.0-dev.
|
|
6
|
+
var version = "2.4.0-dev.2157+b76e5888";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/body.ts
|
|
9
9
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
|
@@ -222,7 +222,11 @@ async function lookupWebFingerInternal(resource, options = {}) {
|
|
|
222
222
|
await validatePublicUrl(url.href);
|
|
223
223
|
} catch (e) {
|
|
224
224
|
if (e instanceof UrlError) {
|
|
225
|
-
logger.
|
|
225
|
+
if (e.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
226
|
+
url: url.href,
|
|
227
|
+
error: e
|
|
228
|
+
});
|
|
229
|
+
else logger.error("Invalid URL for WebFinger resource descriptor: {error}", { error: e });
|
|
226
230
|
return {
|
|
227
231
|
resource: null,
|
|
228
232
|
result: "network_error",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/webfinger",
|
|
3
|
-
"version": "2.4.0-dev.
|
|
3
|
+
"version": "2.4.0-dev.2157+b76e5888",
|
|
4
4
|
"homepage": "https://fedify.dev/",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@logtape/logtape": "^2.2.0",
|
|
58
58
|
"@opentelemetry/api": "^1.9.1",
|
|
59
59
|
"es-toolkit": "1.46.1",
|
|
60
|
-
"@fedify/vocab-runtime": "2.4.0-dev.
|
|
60
|
+
"@fedify/vocab-runtime": "2.4.0-dev.2157+b76e5888"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build:self": "tsdown",
|
package/src/lookup.test.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { createTestMeterProvider, test } from "@fedify/fixture";
|
|
2
|
+
import { UrlError } from "@fedify/vocab-runtime";
|
|
3
|
+
import { configure, type LogRecord, reset } from "@logtape/logtape";
|
|
2
4
|
import { withTimeout } from "es-toolkit";
|
|
3
5
|
import fetchMock from "fetch-mock";
|
|
4
6
|
import { deepStrictEqual, ok } from "node:assert/strict";
|
|
7
|
+
import dns from "node:dns/promises";
|
|
5
8
|
import type { ResourceDescriptor } from "./jrd.ts";
|
|
6
9
|
import { lookupWebFinger } from "./lookup.ts";
|
|
7
10
|
|
|
@@ -922,3 +925,67 @@ test("lookupWebFinger() bounds resource descriptors", async () => {
|
|
|
922
925
|
fetchMock.hardReset();
|
|
923
926
|
}
|
|
924
927
|
});
|
|
928
|
+
|
|
929
|
+
test("lookupWebFinger() logs DNS failures as such", async (t) => {
|
|
930
|
+
// The validator skips DNS when Deno has no network permission. Checked
|
|
931
|
+
// here rather than with top-level await, which the CommonJS build rejects.
|
|
932
|
+
if (
|
|
933
|
+
"Deno" in globalThis &&
|
|
934
|
+
(await Deno.permissions.query({ name: "net" })).state !== "granted"
|
|
935
|
+
) return;
|
|
936
|
+
for (const result of ["throws", "empty", "private"] as const) {
|
|
937
|
+
await t.step(result, async () => {
|
|
938
|
+
// Stubbing works only because vocab-runtime's url.ts uses the default
|
|
939
|
+
// node:dns/promises import; see the FIXME there.
|
|
940
|
+
const originalLookup = dns.lookup;
|
|
941
|
+
dns.lookup = (() =>
|
|
942
|
+
result === "throws"
|
|
943
|
+
? Promise.reject(new Error("Resolver unavailable"))
|
|
944
|
+
: Promise.resolve(
|
|
945
|
+
result === "empty" ? [] : [{ address: "127.0.0.1", family: 4 }],
|
|
946
|
+
)) as typeof dns.lookup;
|
|
947
|
+
const records: LogRecord[] = [];
|
|
948
|
+
await configure({
|
|
949
|
+
sinks: {
|
|
950
|
+
buffer: (record) =>
|
|
951
|
+
records.push(record),
|
|
952
|
+
},
|
|
953
|
+
loggers: [
|
|
954
|
+
{ category: "fedify", sinks: ["buffer"], lowestLevel: "debug" },
|
|
955
|
+
{ category: ["logtape", "meta"], sinks: [] },
|
|
956
|
+
],
|
|
957
|
+
reset: true,
|
|
958
|
+
});
|
|
959
|
+
try {
|
|
960
|
+
deepStrictEqual(
|
|
961
|
+
await lookupWebFinger("acct:alice@dns-failure.invalid"),
|
|
962
|
+
null,
|
|
963
|
+
);
|
|
964
|
+
const failures = records.filter((r) =>
|
|
965
|
+
r.rawMessage !==
|
|
966
|
+
"Fetching WebFinger resource descriptor from {url}..."
|
|
967
|
+
);
|
|
968
|
+
deepStrictEqual(
|
|
969
|
+
failures.map((r) => [r.level, r.rawMessage]),
|
|
970
|
+
[
|
|
971
|
+
result === "private"
|
|
972
|
+
? [
|
|
973
|
+
"error",
|
|
974
|
+
"Invalid URL for WebFinger resource descriptor: {error}",
|
|
975
|
+
]
|
|
976
|
+
: ["debug", "DNS lookup failed for {url}"],
|
|
977
|
+
],
|
|
978
|
+
);
|
|
979
|
+
const { error } = failures[0].properties;
|
|
980
|
+
ok(error instanceof UrlError);
|
|
981
|
+
deepStrictEqual(
|
|
982
|
+
error.reason,
|
|
983
|
+
result === "private" ? "disallowed" : "dns",
|
|
984
|
+
);
|
|
985
|
+
} finally {
|
|
986
|
+
await reset();
|
|
987
|
+
dns.lookup = originalLookup;
|
|
988
|
+
}
|
|
989
|
+
});
|
|
990
|
+
}
|
|
991
|
+
});
|
package/src/lookup.ts
CHANGED
|
@@ -322,10 +322,17 @@ async function lookupWebFingerInternal(
|
|
|
322
322
|
await validatePublicUrl(url.href);
|
|
323
323
|
} catch (e) {
|
|
324
324
|
if (e instanceof UrlError) {
|
|
325
|
-
|
|
326
|
-
"
|
|
327
|
-
|
|
328
|
-
|
|
325
|
+
if (e.reason === "dns") {
|
|
326
|
+
logger.debug("DNS lookup failed for {url}", {
|
|
327
|
+
url: url.href,
|
|
328
|
+
error: e,
|
|
329
|
+
});
|
|
330
|
+
} else {
|
|
331
|
+
logger.error(
|
|
332
|
+
"Invalid URL for WebFinger resource descriptor: {error}",
|
|
333
|
+
{ error: e },
|
|
334
|
+
);
|
|
335
|
+
}
|
|
329
336
|
return { resource: null, result: "network_error", remoteHost };
|
|
330
337
|
}
|
|
331
338
|
throw e;
|