doc-detective 4.41.6 → 4.42.1
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/README.md +3 -4
- package/bin/doc-detective-lsp.js +2 -0
- package/dist/agents/adapters/claude-code.js +1 -1
- package/dist/agents/adapters/claude-code.js.map +1 -1
- package/dist/agents/adapters/copilot-cli.js +2 -2
- package/dist/agents/adapters/copilot-cli.js.map +1 -1
- package/dist/agents/adapters/gemini-cli.js +1 -1
- package/dist/agents/adapters/gemini-cli.js.map +1 -1
- package/dist/agents/adapters/qwen-code.js +1 -1
- package/dist/agents/adapters/qwen-code.js.map +1 -1
- package/dist/cli.js +27 -6
- package/dist/cli.js.map +1 -1
- package/dist/common/src/schemas/schemas.json +2 -2
- package/dist/common/src/schemas/schemasReferenced.json +448 -294
- package/dist/common/src/schemas/validators.cjs +140 -124
- package/dist/common/src/schemas/validatorsCheck.cjs +1 -1
- package/dist/common/src/types/generated/annotate_v3.d.ts +12 -12
- package/dist/common/src/types/generated/annotate_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/annotation_v3.d.ts +6 -6
- package/dist/common/src/types/generated/annotation_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/checkLink_v3.d.ts +4 -0
- package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/click_v3.d.ts +2 -2
- package/dist/common/src/types/generated/click_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/config_v3.d.ts +260 -108
- package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/context_v3.d.ts +10 -2
- package/dist/common/src/types/generated/context_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/dragAndDrop_v3.d.ts +2 -2
- package/dist/common/src/types/generated/dragAndDrop_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/find_v3.d.ts +6 -6
- package/dist/common/src/types/generated/find_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/goTo_v3.d.ts +1 -1
- package/dist/common/src/types/generated/goTo_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/httpRequest_v3.d.ts +2 -2
- package/dist/common/src/types/generated/httpRequest_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/record_v3.d.ts +5 -5
- package/dist/common/src/types/generated/record_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/report_v3.d.ts +529 -207
- package/dist/common/src/types/generated/report_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts +754 -314
- package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/runCode_v3.d.ts +11 -2
- package/dist/common/src/types/generated/runCode_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/runShell_v3.d.ts +11 -2
- package/dist/common/src/types/generated/runShell_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/screenshot_v3.d.ts +12 -12
- package/dist/common/src/types/generated/screenshot_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/spec_v3.d.ts +494 -206
- package/dist/common/src/types/generated/spec_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/startSurface_v3.d.ts +24 -6
- package/dist/common/src/types/generated/startSurface_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/step_v3.d.ts +223 -100
- package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/test_v3.d.ts +482 -202
- package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/type_v3.d.ts +3 -3
- package/dist/common/src/types/generated/type_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/waitUntil_v3.d.ts +2 -2
- package/dist/common/src/types/generated/waitUntil_v3.d.ts.map +1 -1
- package/dist/common/src/types/generated/wait_v3.d.ts +2 -3
- package/dist/common/src/types/generated/wait_v3.d.ts.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +6 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/files.d.ts +18 -3
- package/dist/core/files.d.ts.map +1 -1
- package/dist/core/files.js +58 -18
- package/dist/core/files.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/integrations/index.d.ts +2 -1
- package/dist/core/integrations/index.d.ts.map +1 -1
- package/dist/core/integrations/index.js +15 -5
- package/dist/core/integrations/index.js.map +1 -1
- package/dist/core/openapi.d.ts.map +1 -1
- package/dist/core/openapi.js +130 -6
- package/dist/core/openapi.js.map +1 -1
- package/dist/core/ptyWatchdog.d.ts.map +1 -1
- package/dist/core/ptyWatchdog.js +6 -3
- package/dist/core/ptyWatchdog.js.map +1 -1
- package/dist/core/resolveTests.d.ts.map +1 -1
- package/dist/core/resolveTests.js +5 -3
- package/dist/core/resolveTests.js.map +1 -1
- package/dist/core/telem.d.ts.map +1 -1
- package/dist/core/telem.js +5 -7
- package/dist/core/telem.js.map +1 -1
- package/dist/core/tests/checkLink.d.ts.map +1 -1
- package/dist/core/tests/checkLink.js +12 -7
- package/dist/core/tests/checkLink.js.map +1 -1
- package/dist/core/tests/click.d.ts.map +1 -1
- package/dist/core/tests/click.js +7 -0
- package/dist/core/tests/click.js.map +1 -1
- package/dist/core/tests/findElement.d.ts.map +1 -1
- package/dist/core/tests/findElement.js +3 -2
- package/dist/core/tests/findElement.js.map +1 -1
- package/dist/core/tests/goTo.d.ts.map +1 -1
- package/dist/core/tests/goTo.js +2 -1
- package/dist/core/tests/goTo.js.map +1 -1
- package/dist/core/tests/httpRequest.d.ts.map +1 -1
- package/dist/core/tests/httpRequest.js +4 -5
- package/dist/core/tests/httpRequest.js.map +1 -1
- package/dist/core/tests/processSurface.d.ts +4 -1
- package/dist/core/tests/processSurface.d.ts.map +1 -1
- package/dist/core/tests/processSurface.js +3 -0
- package/dist/core/tests/processSurface.js.map +1 -1
- package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
- package/dist/core/tests/saveScreenshot.js +8 -3
- package/dist/core/tests/saveScreenshot.js.map +1 -1
- package/dist/core/tests/startRecording.d.ts.map +1 -1
- package/dist/core/tests/startRecording.js +2 -1
- package/dist/core/tests/startRecording.js.map +1 -1
- package/dist/core/tests/stopRecording.d.ts.map +1 -1
- package/dist/core/tests/stopRecording.js +2 -1
- package/dist/core/tests/stopRecording.js.map +1 -1
- package/dist/core/tests/timing.d.ts +4 -0
- package/dist/core/tests/timing.d.ts.map +1 -0
- package/dist/core/tests/timing.js +8 -0
- package/dist/core/tests/timing.js.map +1 -0
- package/dist/core/tests.d.ts +15 -0
- package/dist/core/tests.d.ts.map +1 -1
- package/dist/core/tests.js +77 -30
- package/dist/core/tests.js.map +1 -1
- package/dist/core/utils.d.ts +42 -2
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +284 -90
- package/dist/core/utils.js.map +1 -1
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/debug/index.js +8 -36
- package/dist/debug/index.js.map +1 -1
- package/dist/hints/hints.js +2 -2
- package/dist/hints/hints.js.map +1 -1
- package/dist/index.cjs +689 -235
- package/dist/reporters/htmlReporter.js +1 -1
- package/dist/runtime/cacheDir.d.ts.map +1 -1
- package/dist/runtime/cacheDir.js +6 -11
- package/dist/runtime/cacheDir.js.map +1 -1
- package/dist/runtime/heavyDeps.d.ts +12 -0
- package/dist/runtime/heavyDeps.d.ts.map +1 -1
- package/dist/runtime/heavyDeps.js +31 -7
- package/dist/runtime/heavyDeps.js.map +1 -1
- package/dist/runtime/selfUpdate.d.ts +3 -3
- package/dist/runtime/selfUpdate.d.ts.map +1 -1
- package/dist/runtime/selfUpdate.js +34 -5
- package/dist/runtime/selfUpdate.js.map +1 -1
- package/dist/upgradeNotice.d.ts +41 -0
- package/dist/upgradeNotice.d.ts.map +1 -0
- package/dist/upgradeNotice.js +356 -0
- package/dist/upgradeNotice.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +17 -8
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/scripts/postinstall.js +1 -1
package/dist/core/utils.d.ts
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
import type { AxiosRequestConfig } from "axios";
|
|
2
3
|
export declare function loadAxios(): Promise<typeof import("axios").default>;
|
|
3
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Browser and driver versions for a context's report (ADR 01163), read from
|
|
6
|
+
* the WebdriverIO session's capabilities, falling back to the detected app
|
|
7
|
+
* (`availableApps` entry) where the session is silent. appium-geckodriver
|
|
8
|
+
* echoes the requested capabilities rather than geckodriver's, so Firefox's
|
|
9
|
+
* versions come from the detected build ID (`nightly_161.0a1`) and the
|
|
10
|
+
* managed `geckodriver-<version>` binary name. Safari reports no driver
|
|
11
|
+
* version.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sessionVersions({ capabilities, app, }: {
|
|
14
|
+
capabilities?: any;
|
|
15
|
+
app?: {
|
|
16
|
+
name?: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
driver?: string;
|
|
19
|
+
};
|
|
20
|
+
}): {
|
|
21
|
+
browserVersion?: string;
|
|
22
|
+
driver?: {
|
|
23
|
+
name: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
declare const FETCH_TEXT_DEFAULTS: {
|
|
28
|
+
timeout: number;
|
|
29
|
+
maxContentLength: number;
|
|
30
|
+
maxBodyLength: number;
|
|
31
|
+
responseType: "text";
|
|
32
|
+
};
|
|
33
|
+
export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, privateAddressOf, localUrlPolicy, getGuarded, UrlGuardError, FETCH_TEXT_DEFAULTS, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
|
|
4
34
|
export type { BackgroundProcess, ResourceRegistry };
|
|
5
35
|
declare function createAppiumPool(ports: number[]): {
|
|
6
36
|
acquire(): Promise<number>;
|
|
@@ -78,7 +108,17 @@ declare function appendQueryParams(url: string, params: Record<string, unknown>
|
|
|
78
108
|
declare function cleanTemp(): void;
|
|
79
109
|
declare function sanitizeFilesystemName(name: string, fallback: string): string;
|
|
80
110
|
declare function redactUrlForOutput(value: string): string;
|
|
81
|
-
declare
|
|
111
|
+
declare class UrlGuardError extends Error {
|
|
112
|
+
}
|
|
113
|
+
declare function localUrlPolicy(): "hops" | "allow" | "block";
|
|
114
|
+
declare function privateAddressOf(fileURL: string, { every }?: {
|
|
115
|
+
every?: boolean;
|
|
116
|
+
}): Promise<string | undefined>;
|
|
117
|
+
declare function getGuarded(url: string, opts?: AxiosRequestConfig, refuseFirst?: (address: string) => Error, refuseRedirect?: (from: string, address: string) => Error): Promise<{
|
|
118
|
+
data: any;
|
|
119
|
+
url: string;
|
|
120
|
+
reachedPublic: boolean;
|
|
121
|
+
}>;
|
|
82
122
|
declare function fetchFile(fileURL: string, opts?: {
|
|
83
123
|
binary?: boolean;
|
|
84
124
|
}): Promise<{
|
package/dist/core/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/core/utils.js
CHANGED
|
@@ -3,12 +3,13 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
5
|
import dns from "node:dns/promises";
|
|
6
|
+
import dnsCallback from "node:dns";
|
|
6
7
|
import net from "node:net";
|
|
7
8
|
import { spawn } from "node:child_process";
|
|
8
9
|
import { loadHeavyDep, resolveHeavyDepPath, ensureRuntimeInstalled, } from "../runtime/loader.js";
|
|
9
10
|
import { resolveWindowsBash as defaultResolveWindowsBash } from "../runtime/windowsBash.js";
|
|
11
|
+
import { ownVersion } from "../runtime/heavyDeps.js";
|
|
10
12
|
import { assertConptyAllocatable, ensurePtyBackendOnDisk, } from "./ptyWatchdog.js";
|
|
11
|
-
import { createRequire } from "node:module";
|
|
12
13
|
import { applyVerification, declarePage, VERIFIED_TOOL } from "./verification.js";
|
|
13
14
|
// axios (~70 modules with its deps) loads on first use rather than at CLI
|
|
14
15
|
// startup (see test/startup-modules.test.js). Cached, so hot paths pay the
|
|
@@ -17,7 +18,54 @@ let axiosModule;
|
|
|
17
18
|
export function loadAxios() {
|
|
18
19
|
return (axiosModule ??= import("axios").then((m) => m.default));
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Browser and driver versions for a context's report (ADR 01163), read from
|
|
23
|
+
* the WebdriverIO session's capabilities, falling back to the detected app
|
|
24
|
+
* (`availableApps` entry) where the session is silent. appium-geckodriver
|
|
25
|
+
* echoes the requested capabilities rather than geckodriver's, so Firefox's
|
|
26
|
+
* versions come from the detected build ID (`nightly_161.0a1`) and the
|
|
27
|
+
* managed `geckodriver-<version>` binary name. Safari reports no driver
|
|
28
|
+
* version.
|
|
29
|
+
*/
|
|
30
|
+
export function sessionVersions({ capabilities, app, }) {
|
|
31
|
+
const result = {};
|
|
32
|
+
// Runs after the driver started, so odd values are ignored, never thrown on.
|
|
33
|
+
const str = (value) => typeof value === "string" && value ? value : undefined;
|
|
34
|
+
const caps = capabilities ?? {};
|
|
35
|
+
const browserVersion = str(caps.browserVersion) ?? str(app?.version)?.replace(/^[a-z]+_/, "");
|
|
36
|
+
if (browserVersion)
|
|
37
|
+
result.browserVersion = browserVersion;
|
|
38
|
+
const chromedriver = str(caps.chrome?.chromedriverVersion);
|
|
39
|
+
if (chromedriver) {
|
|
40
|
+
result.driver = { name: "chromedriver", version: chromedriver.split(" ")[0] };
|
|
41
|
+
}
|
|
42
|
+
else if (app?.name === "firefox") {
|
|
43
|
+
const version = str(caps["moz:geckodriverVersion"]) ??
|
|
44
|
+
/geckodriver-(\d+(?:\.\d+)*)/i.exec(path.basename(str(app.driver) ?? ""))?.[1];
|
|
45
|
+
result.driver = { name: "geckodriver", ...(version && { version }) };
|
|
46
|
+
}
|
|
47
|
+
else if (app?.name === "safari") {
|
|
48
|
+
result.driver = { name: "safaridriver" };
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
// Fetch a file from a URL and save to a temp directory.
|
|
53
|
+
// With `{ binary: true }`, fetches as arraybuffer and preserves raw bytes —
|
|
54
|
+
// required for images and other non-text payloads. Binary fetches also apply
|
|
55
|
+
// hard limits (timeout, max body size; getGuarded caps redirects) so a
|
|
56
|
+
// misbehaving server can't stall or OOM the run.
|
|
57
|
+
// Otherwise, non-JSON responses are stringified (text pass-through).
|
|
58
|
+
// Returns `{ result: "error", message }` on failure.
|
|
59
|
+
const FETCH_BINARY_DEFAULTS = {
|
|
60
|
+
responseType: "arraybuffer",
|
|
61
|
+
timeout: 30_000,
|
|
62
|
+
maxContentLength: 50 * 1024 * 1024,
|
|
63
|
+
maxBodyLength: 50 * 1024 * 1024,
|
|
64
|
+
};
|
|
65
|
+
// The same limits for text bodies, such as OpenAPI descriptions and their
|
|
66
|
+
// $refs. "text" also stops axios from parsing JSON on its own.
|
|
67
|
+
const FETCH_TEXT_DEFAULTS = { ...FETCH_BINARY_DEFAULTS, responseType: "text" };
|
|
68
|
+
export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, privateAddressOf, localUrlPolicy, getGuarded, UrlGuardError, FETCH_TEXT_DEFAULTS, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
|
|
21
69
|
// A fixed set of Appium server ports shared by concurrent runners. `acquire()`
|
|
22
70
|
// hands out a free port, waiting if every port is checked out; `release()`
|
|
23
71
|
// returns one, handing it straight to the next waiter. Single-threaded JS
|
|
@@ -385,11 +433,9 @@ async function spawnPtyBackgroundCommand(cmd, args = [], options = {}) {
|
|
|
385
433
|
try {
|
|
386
434
|
ptyProcess = pty.spawn(shell, shellArgs, {
|
|
387
435
|
name: "xterm-color",
|
|
388
|
-
//
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
cols: 120,
|
|
392
|
-
rows: 30,
|
|
436
|
+
// `tty: {cols, rows}`; Ajv skips defaults inside the schema's anyOf.
|
|
437
|
+
cols: options.cols ?? 120,
|
|
438
|
+
rows: options.rows ?? 30,
|
|
393
439
|
cwd: options.cwd || process.cwd(),
|
|
394
440
|
env: shellSpawnEnv(options.shell) ?? process.env,
|
|
395
441
|
});
|
|
@@ -1078,20 +1124,6 @@ function cleanTemp() {
|
|
|
1078
1124
|
}
|
|
1079
1125
|
}
|
|
1080
1126
|
}
|
|
1081
|
-
// Fetch a file from a URL and save to a temp directory.
|
|
1082
|
-
// With `{ binary: true }`, fetches as arraybuffer and preserves raw bytes —
|
|
1083
|
-
// required for images and other non-text payloads. Binary fetches also apply
|
|
1084
|
-
// hard limits (timeout, max body size, max redirects) so a misbehaving server
|
|
1085
|
-
// can't stall or OOM the run.
|
|
1086
|
-
// Otherwise, non-JSON responses are stringified (text pass-through).
|
|
1087
|
-
// Returns `{ result: "error", message }` on failure.
|
|
1088
|
-
const FETCH_BINARY_DEFAULTS = {
|
|
1089
|
-
responseType: "arraybuffer",
|
|
1090
|
-
timeout: 30_000,
|
|
1091
|
-
maxContentLength: 50 * 1024 * 1024,
|
|
1092
|
-
maxBodyLength: 50 * 1024 * 1024,
|
|
1093
|
-
maxRedirects: 5,
|
|
1094
|
-
};
|
|
1095
1127
|
// Replace characters that are invalid in filenames on Windows (and often
|
|
1096
1128
|
// problematic on other platforms) with `_`. Keeps dots, hyphens, and
|
|
1097
1129
|
// alphanumerics untouched so names stay recognizable. Also rejects leading
|
|
@@ -1152,7 +1184,9 @@ function redactUrlForOutput(value) {
|
|
|
1152
1184
|
// Private/loopback/link-local IP ranges that binary URL fetches refuse to
|
|
1153
1185
|
// reach by default. Covers IPv4 RFC1918, loopback, link-local (169.254/16),
|
|
1154
1186
|
// carrier-grade NAT (100.64/10), and the cloud-metadata special cases
|
|
1155
|
-
// (169.254.169.254 is inside link-local and thus covered).
|
|
1187
|
+
// (169.254.169.254 is inside link-local and thus covered). Teredo
|
|
1188
|
+
// (2001:0::/32) isn't covered: routing HTTP through it needs Teredo relay
|
|
1189
|
+
// infrastructure, so it isn't a realistic SSRF path.
|
|
1156
1190
|
function isPrivateOrLoopbackAddress(ip) {
|
|
1157
1191
|
if (!ip)
|
|
1158
1192
|
return false;
|
|
@@ -1175,61 +1209,84 @@ function isPrivateOrLoopbackAddress(ip) {
|
|
|
1175
1209
|
return false;
|
|
1176
1210
|
}
|
|
1177
1211
|
if (net.isIPv6(ip)) {
|
|
1178
|
-
const
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
// (::ffff:HHHH:LLLL = the embedded 32-bit v4); reconstruct and re-check.
|
|
1205
|
-
const hexMatch = tail.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
|
|
1206
|
-
if (hexMatch) {
|
|
1207
|
-
const hi = parseInt(hexMatch[1], 16);
|
|
1208
|
-
const lo = parseInt(hexMatch[2], 16);
|
|
1209
|
-
const dotted = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
|
|
1210
|
-
return isPrivateOrLoopbackAddress(dotted);
|
|
1211
|
-
}
|
|
1212
|
-
// Any other ::ffff: form (e.g. ::ffff:1) is a normal IPv6 address, not an
|
|
1213
|
-
// IPv4-mapped one, and matches none of the private prefixes above → public.
|
|
1214
|
-
return false;
|
|
1212
|
+
const g = ipv6Groups(ip);
|
|
1213
|
+
const zero = (from, to) => g.slice(from, to).every((x) => x === 0);
|
|
1214
|
+
// The IPv4 address in the low 32 bits, for forms that embed one.
|
|
1215
|
+
const v4 = `${g[6] >> 8}.${g[6] & 0xff}.${g[7] >> 8}.${g[7] & 0xff}`;
|
|
1216
|
+
if ((g[0] & 0xfe00) === 0xfc00)
|
|
1217
|
+
return true; // unique local fc00::/7
|
|
1218
|
+
if ((g[0] & 0xffc0) === 0xfe80)
|
|
1219
|
+
return true; // link-local fe80::/10
|
|
1220
|
+
if ((g[0] & 0xffc0) === 0xfec0)
|
|
1221
|
+
return true; // site-local fec0::/10 (deprecated)
|
|
1222
|
+
// 6to4 2002::/16 carries an IPv4 address in its second and third groups.
|
|
1223
|
+
if (g[0] === 0x2002) {
|
|
1224
|
+
return isPrivateOrLoopbackAddress(`${g[1] >> 8}.${g[1] & 0xff}.${g[2] >> 8}.${g[2] & 0xff}`);
|
|
1225
|
+
}
|
|
1226
|
+
// IPv4-translated ::ffff:0:a.b.c.d.
|
|
1227
|
+
if (zero(0, 4) && g[4] === 0xffff && g[5] === 0)
|
|
1228
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1229
|
+
// IPv4-compatible ::a.b.c.d (also covers :: and ::1, which embed 0.0.0.x).
|
|
1230
|
+
if (zero(0, 6))
|
|
1231
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1232
|
+
// IPv4-mapped ::ffff:a.b.c.d. ADR 01010: the URL parser emits these as hex.
|
|
1233
|
+
if (zero(0, 5) && g[5] === 0xffff)
|
|
1234
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1235
|
+
// NAT64 64:ff9b::/96.
|
|
1236
|
+
if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {
|
|
1237
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1215
1238
|
}
|
|
1216
1239
|
return false;
|
|
1217
1240
|
}
|
|
1218
1241
|
return false;
|
|
1219
1242
|
}
|
|
1220
|
-
//
|
|
1221
|
-
//
|
|
1222
|
-
//
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1243
|
+
// The eight 16-bit groups of a valid IPv6 address. Expands `::`, reads a
|
|
1244
|
+
// dotted IPv4 tail (DNS answers aren't URL-normalized), and drops a zone id.
|
|
1245
|
+
// It doesn't validate: callers check net.isIPv6 first, or get NaN groups.
|
|
1246
|
+
function ipv6Groups(ip) {
|
|
1247
|
+
let text = ip.toLowerCase().split("%")[0];
|
|
1248
|
+
const dotted = text.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
|
1249
|
+
if (dotted) {
|
|
1250
|
+
const [a, b, c, d] = dotted.slice(1).map(Number);
|
|
1251
|
+
text =
|
|
1252
|
+
text.slice(0, dotted.index) +
|
|
1253
|
+
`${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;
|
|
1254
|
+
}
|
|
1255
|
+
const [head, tail] = text.split("::");
|
|
1256
|
+
const left = head ? head.split(":") : [];
|
|
1257
|
+
const right = tail ? tail.split(":") : [];
|
|
1258
|
+
const groups = tail === undefined
|
|
1259
|
+
? left
|
|
1260
|
+
: [...left, ...Array(8 - left.length - right.length).fill("0"), ...right];
|
|
1261
|
+
return groups.map((group) => parseInt(group, 16));
|
|
1262
|
+
}
|
|
1263
|
+
// On/off switches in the environment: 1, true, yes or on, in any case.
|
|
1264
|
+
function envFlag(name) {
|
|
1265
|
+
return /^(1|true|yes|on)$/i.test((process.env[name] ?? "").trim());
|
|
1266
|
+
}
|
|
1267
|
+
// A guarded fetch's own error: a refusal, or conflicting switches. Its
|
|
1268
|
+
// message is complete, so callers report it as is.
|
|
1269
|
+
class UrlGuardError extends Error {
|
|
1270
|
+
}
|
|
1271
|
+
// What the guarded fetches (screenshot reference images, OpenAPI `$ref`s) may
|
|
1272
|
+
// reach (ADR 01162). Env only, so a repository's config can't loosen it.
|
|
1273
|
+
// "hops" (default) local URLs are fine; a public-to-private redirect or
|
|
1274
|
+
// `$ref` is refused.
|
|
1275
|
+
// "allow" DOC_DETECTIVE_ALLOW_LOCAL_URLS: no checks.
|
|
1276
|
+
// "block" DOC_DETECTIVE_BLOCK_LOCAL_URLS: every private address is refused.
|
|
1277
|
+
function localUrlPolicy() {
|
|
1278
|
+
const allow = envFlag("DOC_DETECTIVE_ALLOW_LOCAL_URLS");
|
|
1279
|
+
const block = envFlag("DOC_DETECTIVE_BLOCK_LOCAL_URLS");
|
|
1280
|
+
if (allow && block) {
|
|
1281
|
+
throw new UrlGuardError("DOC_DETECTIVE_ALLOW_LOCAL_URLS and DOC_DETECTIVE_BLOCK_LOCAL_URLS can't both be set.");
|
|
1282
|
+
}
|
|
1283
|
+
return allow ? "allow" : block ? "block" : "hops";
|
|
1284
|
+
}
|
|
1285
|
+
// The private, loopback or link-local address a URL points at, or undefined
|
|
1286
|
+
// when it's public. A hostname counts as private when any of its addresses is,
|
|
1287
|
+
// or with `every`, only when all of them are. Names can resolve differently
|
|
1288
|
+
// at connect time; getGuarded checks again there.
|
|
1289
|
+
async function privateAddressOf(fileURL, { every = false } = {}) {
|
|
1233
1290
|
let parsed;
|
|
1234
1291
|
try {
|
|
1235
1292
|
parsed = new URL(fileURL);
|
|
@@ -1243,38 +1300,175 @@ async function assertUrlHostIsPublic(fileURL) {
|
|
|
1243
1300
|
const host = parsed.hostname.replace(/^\[|\]$/g, "");
|
|
1244
1301
|
// Direct IP literals: check immediately.
|
|
1245
1302
|
if (net.isIP(host)) {
|
|
1246
|
-
|
|
1247
|
-
throw new Error(`Refusing to fetch private/loopback address (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
|
|
1248
|
-
}
|
|
1249
|
-
return;
|
|
1303
|
+
return isPrivateOrLoopbackAddress(host) ? host : undefined;
|
|
1250
1304
|
}
|
|
1251
1305
|
// Hostnames: resolve and check every answer (A + AAAA).
|
|
1252
1306
|
const lower = host.toLowerCase();
|
|
1253
1307
|
if (lower === "localhost" || lower.endsWith(".localhost")) {
|
|
1254
|
-
|
|
1308
|
+
return host;
|
|
1255
1309
|
}
|
|
1256
1310
|
let addresses;
|
|
1257
1311
|
try {
|
|
1258
1312
|
addresses = await dns.lookup(host, { all: true });
|
|
1259
1313
|
}
|
|
1260
1314
|
catch (error) {
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1315
|
+
// `host` and `code` let callers word their own message.
|
|
1316
|
+
throw Object.assign(new Error(`Couldn't resolve host ${host}: ${error.message}`), { host, code: error.code ?? error.message });
|
|
1317
|
+
}
|
|
1318
|
+
const privates = addresses.filter(({ address }) => isPrivateOrLoopbackAddress(address));
|
|
1319
|
+
const isPrivate = every ? privates.length === addresses.length : privates.length > 0;
|
|
1320
|
+
return isPrivate ? privates[0]?.address : undefined;
|
|
1321
|
+
}
|
|
1322
|
+
function strictModeError(url) {
|
|
1323
|
+
return new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: DOC_DETECTIVE_BLOCK_LOCAL_URLS refuses private and loopback addresses.\n` +
|
|
1324
|
+
"Hint: Unset DOC_DETECTIVE_BLOCK_LOCAL_URLS to allow local URLs.");
|
|
1325
|
+
}
|
|
1326
|
+
function redirectError(from, address) {
|
|
1327
|
+
return new UrlGuardError(`Couldn't follow the redirect from ${redactUrlForOutput(from)}: it leads to ${address}, a private address, from a public one.\n` +
|
|
1328
|
+
"Hint: If you trust this redirect, set DOC_DETECTIVE_ALLOW_LOCAL_URLS=1.");
|
|
1329
|
+
}
|
|
1330
|
+
const REDIRECT_STATUSES = [301, 302, 303, 307, 308];
|
|
1331
|
+
// A hostname as a lookup sees it: no IPv6 brackets, no trailing dot, any case.
|
|
1332
|
+
function hostKey(hostname) {
|
|
1333
|
+
return hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
|
|
1334
|
+
}
|
|
1335
|
+
// Whether an HTTP(S) proxy is configured in the environment, the variables
|
|
1336
|
+
// axios and Node read. Only then can a lookup be for a name other than the
|
|
1337
|
+
// request's own host. It doesn't read NO_PROXY, and needn't. A proxy-exempt
|
|
1338
|
+
// host connects directly, so the only lookup is its own, and that one counts.
|
|
1339
|
+
function proxyConfigured() {
|
|
1340
|
+
return ["http_proxy", "https_proxy", "all_proxy"].some((key) => process.env[key] || process.env[key.toUpperCase()]);
|
|
1341
|
+
}
|
|
1342
|
+
// GET for the guarded fetches. Follows up to 5 redirects by hand so each hop
|
|
1343
|
+
// is checked against localUrlPolicy(), both before it's requested and again
|
|
1344
|
+
// when it connects: a name can answer public to privateAddressOf() and private
|
|
1345
|
+
// to the connection (DNS rebinding). `refuseFirst`, from a caller whose
|
|
1346
|
+
// referrer is public, makes the first request refuse a private address too.
|
|
1347
|
+
// `refuseRedirect` builds the refusal of a public-to-private redirect, so a
|
|
1348
|
+
// caller can word it its own way.
|
|
1349
|
+
// Returns the body, the final URL, and whether any hop reached a public
|
|
1350
|
+
// address.
|
|
1351
|
+
async function getGuarded(url,
|
|
1352
|
+
// Binary by default (reference images); text callers pass FETCH_TEXT_DEFAULTS.
|
|
1353
|
+
opts = FETCH_BINARY_DEFAULTS, refuseFirst, refuseRedirect = redirectError) {
|
|
1354
|
+
const policy = localUrlPolicy();
|
|
1355
|
+
const axios = await loadAxios();
|
|
1356
|
+
const [{ default: http }, { default: https }] = await Promise.all([
|
|
1357
|
+
import("node:http"),
|
|
1358
|
+
import("node:https"),
|
|
1359
|
+
]);
|
|
1360
|
+
let current = url;
|
|
1361
|
+
let refuse = policy === "hops" ? refuseFirst : undefined;
|
|
1362
|
+
let reachedPublic = false;
|
|
1363
|
+
for (let hops = 0;; hops++) {
|
|
1364
|
+
if (policy === "block") {
|
|
1365
|
+
// The pre-connect check. A second lookup fires at connect time through
|
|
1366
|
+
// the agent's `lookup` below (ADR 01162).
|
|
1367
|
+
if (await privateAddressOf(current))
|
|
1368
|
+
throw strictModeError(current);
|
|
1369
|
+
const hopUrl = current;
|
|
1370
|
+
refuse = () => strictModeError(hopUrl);
|
|
1266
1371
|
}
|
|
1372
|
+
// Fresh agents per request, so no pooled socket skips the lookup. It
|
|
1373
|
+
// notes whether the connection resolved to a private address, and
|
|
1374
|
+
// refuses one when `refuse` is set.
|
|
1375
|
+
const seen = {};
|
|
1376
|
+
const refuseAtConnect = refuse;
|
|
1377
|
+
const target = hostKey(new URL(current).hostname);
|
|
1378
|
+
const lookup = (hostname, options, callback) => {
|
|
1379
|
+
// With a proxy configured, a lookup of another name is the proxy's. It
|
|
1380
|
+
// says nothing about the target, so it's neither refused nor counted;
|
|
1381
|
+
// the pre-connect checks still apply (ADR 01162).
|
|
1382
|
+
if (proxyConfigured() && hostKey(hostname) !== target) {
|
|
1383
|
+
return dnsCallback.lookup(hostname, options, callback);
|
|
1384
|
+
}
|
|
1385
|
+
return dnsCallback.lookup(hostname, options, (error, address, family) => {
|
|
1386
|
+
if (error)
|
|
1387
|
+
return callback(error, address, family);
|
|
1388
|
+
const answers = Array.isArray(address) ? address : [{ address }];
|
|
1389
|
+
seen.resolved = true;
|
|
1390
|
+
seen.private = answers.find((a) => isPrivateOrLoopbackAddress(a.address))?.address;
|
|
1391
|
+
seen.public = answers.some((a) => !isPrivateOrLoopbackAddress(a.address));
|
|
1392
|
+
if (seen.private && refuseAtConnect)
|
|
1393
|
+
return callback(refuseAtConnect(seen.private));
|
|
1394
|
+
callback(null, address, family);
|
|
1395
|
+
});
|
|
1396
|
+
};
|
|
1397
|
+
const response = await axios.get(current, {
|
|
1398
|
+
...opts,
|
|
1399
|
+
maxRedirects: 0,
|
|
1400
|
+
httpAgent: new http.Agent({ lookup }),
|
|
1401
|
+
httpsAgent: new https.Agent({ lookup }),
|
|
1402
|
+
validateStatus: (status) => (status >= 200 && status < 300) || REDIRECT_STATUSES.includes(status),
|
|
1403
|
+
}).catch((error) => {
|
|
1404
|
+
// axios wraps a refusal at connect time; hand back the refusal itself.
|
|
1405
|
+
throw error?.cause instanceof UrlGuardError ? error.cause : error;
|
|
1406
|
+
});
|
|
1407
|
+
// An IP literal skips the lookup, so classify it directly. A name the
|
|
1408
|
+
// lookup never saw (a proxy) is public unless every address is private.
|
|
1409
|
+
let hopPublic = seen.resolved
|
|
1410
|
+
? seen.public
|
|
1411
|
+
: net.isIP(target)
|
|
1412
|
+
? !isPrivateOrLoopbackAddress(target)
|
|
1413
|
+
: undefined;
|
|
1414
|
+
// A fresh lookup of this hop's host, made at most once: a flapping
|
|
1415
|
+
// resolver can't give the two checks below different answers. A failed
|
|
1416
|
+
// lookup counts as public. `every: true` is deliberate: the host is
|
|
1417
|
+
// private only when every address is, so in the `fromPublic` check a hop
|
|
1418
|
+
// the connection saw as private still counts as public when the fresh
|
|
1419
|
+
// lookup finds any public address. That's the guard failing closed.
|
|
1420
|
+
// `fresh` resets every iteration, and `current` stays this hop's URL until
|
|
1421
|
+
// `current = next` at the end of the loop.
|
|
1422
|
+
let fresh;
|
|
1423
|
+
const freshPublic = () => (fresh ??= privateAddressOf(current, { every: true }).then((a) => !a, () => true));
|
|
1424
|
+
if (hopPublic === undefined && policy !== "allow")
|
|
1425
|
+
hopPublic = await freshPublic();
|
|
1426
|
+
if (hopPublic)
|
|
1427
|
+
reachedPublic = true;
|
|
1428
|
+
if (!REDIRECT_STATUSES.includes(response.status)) {
|
|
1429
|
+
return { data: response.data, url: current, reachedPublic };
|
|
1430
|
+
}
|
|
1431
|
+
const location = response.headers?.location;
|
|
1432
|
+
// `hops` counts redirects followed, so at 5 a sixth redirect arrived and
|
|
1433
|
+
// "more than 5" is accurate.
|
|
1434
|
+
if (!location || hops >= 5) {
|
|
1435
|
+
// Names the original URL on purpose: it's the one the spec named. When
|
|
1436
|
+
// the limit and a missing Location both apply, the limit wins on purpose.
|
|
1437
|
+
throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: ${hops >= 5 ? "it needs more than 5 redirects" : `the ${response.status} redirect has no Location header`}.`);
|
|
1438
|
+
}
|
|
1439
|
+
const next = new URL(location, current).toString();
|
|
1440
|
+
const scheme = new URL(next).protocol;
|
|
1441
|
+
if (scheme !== "http:" && scheme !== "https:") {
|
|
1442
|
+
throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(current)}: the redirect leads to an unsupported scheme (\`${scheme.slice(0, -1)}\`).`);
|
|
1443
|
+
}
|
|
1444
|
+
if (policy === "hops") {
|
|
1445
|
+
// Fail closed: the hop comes from a public origin unless both the
|
|
1446
|
+
// connection and a fresh lookup say every address is private. Through a
|
|
1447
|
+
// proxy the connection looked up the proxy, not this host, so the fresh
|
|
1448
|
+
// lookup is the only signal.
|
|
1449
|
+
// The two `every` values differ on purpose, and both fail closed. This
|
|
1450
|
+
// hop is public when any address is; the target is refused when any is
|
|
1451
|
+
// private.
|
|
1452
|
+
const fromPublic = hopPublic || (await freshPublic());
|
|
1453
|
+
refuse = undefined;
|
|
1454
|
+
if (fromPublic) {
|
|
1455
|
+
const address = await privateAddressOf(next);
|
|
1456
|
+
if (address)
|
|
1457
|
+
throw refuseRedirect(current, address);
|
|
1458
|
+
const from = current;
|
|
1459
|
+
refuse = (connectAddress) => refuseRedirect(from, connectAddress);
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
current = next;
|
|
1267
1463
|
}
|
|
1268
1464
|
}
|
|
1269
1465
|
async function fetchFile(fileURL, opts = {}) {
|
|
1270
1466
|
try {
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
await
|
|
1276
|
-
}
|
|
1277
|
-
const response = await (await loadAxios()).get(fileURL, opts.binary ? FETCH_BINARY_DEFAULTS : undefined);
|
|
1467
|
+
// Binary fetches (screenshot reference images) are guarded. The text
|
|
1468
|
+
// path loads operator-chosen input; not gated by design (ADR 01162).
|
|
1469
|
+
const response = opts.binary
|
|
1470
|
+
? await getGuarded(fileURL)
|
|
1471
|
+
: await (await loadAxios()).get(fileURL);
|
|
1278
1472
|
let data;
|
|
1279
1473
|
if (opts.binary) {
|
|
1280
1474
|
data = Buffer.from(response.data);
|
|
@@ -1898,7 +2092,7 @@ function applyVerifiedMarkers({ config, results, files: detectedFiles = [], init
|
|
|
1898
2092
|
}
|
|
1899
2093
|
}
|
|
1900
2094
|
const today = verifiedDate();
|
|
1901
|
-
const version =
|
|
2095
|
+
const version = ownVersion() ?? "unknown";
|
|
1902
2096
|
for (const file of files) {
|
|
1903
2097
|
try {
|
|
1904
2098
|
if (!fs.existsSync(file))
|