doc-detective 4.41.6 → 4.42.0
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 +122 -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 +281 -89
- 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 +684 -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
|
|
@@ -1175,61 +1207,84 @@ function isPrivateOrLoopbackAddress(ip) {
|
|
|
1175
1207
|
return false;
|
|
1176
1208
|
}
|
|
1177
1209
|
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;
|
|
1210
|
+
const g = ipv6Groups(ip);
|
|
1211
|
+
const zero = (from, to) => g.slice(from, to).every((x) => x === 0);
|
|
1212
|
+
// The IPv4 address in the low 32 bits, for forms that embed one.
|
|
1213
|
+
const v4 = `${g[6] >> 8}.${g[6] & 0xff}.${g[7] >> 8}.${g[7] & 0xff}`;
|
|
1214
|
+
if ((g[0] & 0xfe00) === 0xfc00)
|
|
1215
|
+
return true; // unique local fc00::/7
|
|
1216
|
+
if ((g[0] & 0xffc0) === 0xfe80)
|
|
1217
|
+
return true; // link-local fe80::/10
|
|
1218
|
+
if ((g[0] & 0xffc0) === 0xfec0)
|
|
1219
|
+
return true; // site-local fec0::/10 (deprecated)
|
|
1220
|
+
// 6to4 2002::/16 carries an IPv4 address in its second and third groups.
|
|
1221
|
+
if (g[0] === 0x2002) {
|
|
1222
|
+
return isPrivateOrLoopbackAddress(`${g[1] >> 8}.${g[1] & 0xff}.${g[2] >> 8}.${g[2] & 0xff}`);
|
|
1223
|
+
}
|
|
1224
|
+
// IPv4-translated ::ffff:0:a.b.c.d.
|
|
1225
|
+
if (zero(0, 4) && g[4] === 0xffff && g[5] === 0)
|
|
1226
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1227
|
+
// IPv4-compatible ::a.b.c.d (also covers :: and ::1, which embed 0.0.0.x).
|
|
1228
|
+
if (zero(0, 6))
|
|
1229
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1230
|
+
// IPv4-mapped ::ffff:a.b.c.d. ADR 01010: the URL parser emits these as hex.
|
|
1231
|
+
if (zero(0, 5) && g[5] === 0xffff)
|
|
1232
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1233
|
+
// NAT64 64:ff9b::/96.
|
|
1234
|
+
if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {
|
|
1235
|
+
return isPrivateOrLoopbackAddress(v4);
|
|
1215
1236
|
}
|
|
1216
1237
|
return false;
|
|
1217
1238
|
}
|
|
1218
1239
|
return false;
|
|
1219
1240
|
}
|
|
1220
|
-
//
|
|
1221
|
-
//
|
|
1222
|
-
//
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1241
|
+
// The eight 16-bit groups of a valid IPv6 address. Expands `::`, reads a
|
|
1242
|
+
// dotted IPv4 tail (DNS answers aren't URL-normalized), and drops a zone id.
|
|
1243
|
+
// It doesn't validate: callers check net.isIPv6 first, or get NaN groups.
|
|
1244
|
+
function ipv6Groups(ip) {
|
|
1245
|
+
let text = ip.toLowerCase().split("%")[0];
|
|
1246
|
+
const dotted = text.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
|
1247
|
+
if (dotted) {
|
|
1248
|
+
const [a, b, c, d] = dotted.slice(1).map(Number);
|
|
1249
|
+
text =
|
|
1250
|
+
text.slice(0, dotted.index) +
|
|
1251
|
+
`${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;
|
|
1252
|
+
}
|
|
1253
|
+
const [head, tail] = text.split("::");
|
|
1254
|
+
const left = head ? head.split(":") : [];
|
|
1255
|
+
const right = tail ? tail.split(":") : [];
|
|
1256
|
+
const groups = tail === undefined
|
|
1257
|
+
? left
|
|
1258
|
+
: [...left, ...Array(8 - left.length - right.length).fill("0"), ...right];
|
|
1259
|
+
return groups.map((group) => parseInt(group, 16));
|
|
1260
|
+
}
|
|
1261
|
+
// On/off switches in the environment: 1, true, yes or on, in any case.
|
|
1262
|
+
function envFlag(name) {
|
|
1263
|
+
return /^(1|true|yes|on)$/i.test((process.env[name] ?? "").trim());
|
|
1264
|
+
}
|
|
1265
|
+
// A guarded fetch's own error: a refusal, or conflicting switches. Its
|
|
1266
|
+
// message is complete, so callers report it as is.
|
|
1267
|
+
class UrlGuardError extends Error {
|
|
1268
|
+
}
|
|
1269
|
+
// What the guarded fetches (screenshot reference images, OpenAPI `$ref`s) may
|
|
1270
|
+
// reach (ADR 01162). Env only, so a repository's config can't loosen it.
|
|
1271
|
+
// "hops" (default) local URLs are fine; a public-to-private redirect or
|
|
1272
|
+
// `$ref` is refused.
|
|
1273
|
+
// "allow" DOC_DETECTIVE_ALLOW_LOCAL_URLS: no checks.
|
|
1274
|
+
// "block" DOC_DETECTIVE_BLOCK_LOCAL_URLS: every private address is refused.
|
|
1275
|
+
function localUrlPolicy() {
|
|
1276
|
+
const allow = envFlag("DOC_DETECTIVE_ALLOW_LOCAL_URLS");
|
|
1277
|
+
const block = envFlag("DOC_DETECTIVE_BLOCK_LOCAL_URLS");
|
|
1278
|
+
if (allow && block) {
|
|
1279
|
+
throw new UrlGuardError("DOC_DETECTIVE_ALLOW_LOCAL_URLS and DOC_DETECTIVE_BLOCK_LOCAL_URLS can't both be set.");
|
|
1280
|
+
}
|
|
1281
|
+
return allow ? "allow" : block ? "block" : "hops";
|
|
1282
|
+
}
|
|
1283
|
+
// The private, loopback or link-local address a URL points at, or undefined
|
|
1284
|
+
// when it's public. A hostname counts as private when any of its addresses is,
|
|
1285
|
+
// or with `every`, only when all of them are. Names can resolve differently
|
|
1286
|
+
// at connect time; getGuarded checks again there.
|
|
1287
|
+
async function privateAddressOf(fileURL, { every = false } = {}) {
|
|
1233
1288
|
let parsed;
|
|
1234
1289
|
try {
|
|
1235
1290
|
parsed = new URL(fileURL);
|
|
@@ -1243,38 +1298,175 @@ async function assertUrlHostIsPublic(fileURL) {
|
|
|
1243
1298
|
const host = parsed.hostname.replace(/^\[|\]$/g, "");
|
|
1244
1299
|
// Direct IP literals: check immediately.
|
|
1245
1300
|
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;
|
|
1301
|
+
return isPrivateOrLoopbackAddress(host) ? host : undefined;
|
|
1250
1302
|
}
|
|
1251
1303
|
// Hostnames: resolve and check every answer (A + AAAA).
|
|
1252
1304
|
const lower = host.toLowerCase();
|
|
1253
1305
|
if (lower === "localhost" || lower.endsWith(".localhost")) {
|
|
1254
|
-
|
|
1306
|
+
return host;
|
|
1255
1307
|
}
|
|
1256
1308
|
let addresses;
|
|
1257
1309
|
try {
|
|
1258
1310
|
addresses = await dns.lookup(host, { all: true });
|
|
1259
1311
|
}
|
|
1260
1312
|
catch (error) {
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1313
|
+
// `host` and `code` let callers word their own message.
|
|
1314
|
+
throw Object.assign(new Error(`Couldn't resolve host ${host}: ${error.message}`), { host, code: error.code ?? error.message });
|
|
1315
|
+
}
|
|
1316
|
+
const privates = addresses.filter(({ address }) => isPrivateOrLoopbackAddress(address));
|
|
1317
|
+
const isPrivate = every ? privates.length === addresses.length : privates.length > 0;
|
|
1318
|
+
return isPrivate ? privates[0]?.address : undefined;
|
|
1319
|
+
}
|
|
1320
|
+
function strictModeError(url) {
|
|
1321
|
+
return new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: DOC_DETECTIVE_BLOCK_LOCAL_URLS refuses private and loopback addresses.\n` +
|
|
1322
|
+
"Hint: Unset DOC_DETECTIVE_BLOCK_LOCAL_URLS to allow local URLs.");
|
|
1323
|
+
}
|
|
1324
|
+
function redirectError(from, address) {
|
|
1325
|
+
return new UrlGuardError(`Couldn't follow the redirect from ${redactUrlForOutput(from)}: it leads to ${address}, a private address, from a public one.\n` +
|
|
1326
|
+
"Hint: If you trust this redirect, set DOC_DETECTIVE_ALLOW_LOCAL_URLS=1.");
|
|
1327
|
+
}
|
|
1328
|
+
const REDIRECT_STATUSES = [301, 302, 303, 307, 308];
|
|
1329
|
+
// A hostname as a lookup sees it: no IPv6 brackets, no trailing dot, any case.
|
|
1330
|
+
function hostKey(hostname) {
|
|
1331
|
+
return hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
|
|
1332
|
+
}
|
|
1333
|
+
// Whether an HTTP(S) proxy is configured in the environment, the variables
|
|
1334
|
+
// axios and Node read. Only then can a lookup be for a name other than the
|
|
1335
|
+
// request's own host. It doesn't read NO_PROXY, and needn't. A proxy-exempt
|
|
1336
|
+
// host connects directly, so the only lookup is its own, and that one counts.
|
|
1337
|
+
function proxyConfigured() {
|
|
1338
|
+
return ["http_proxy", "https_proxy", "all_proxy"].some((key) => process.env[key] || process.env[key.toUpperCase()]);
|
|
1339
|
+
}
|
|
1340
|
+
// GET for the guarded fetches. Follows up to 5 redirects by hand so each hop
|
|
1341
|
+
// is checked against localUrlPolicy(), both before it's requested and again
|
|
1342
|
+
// when it connects: a name can answer public to privateAddressOf() and private
|
|
1343
|
+
// to the connection (DNS rebinding). `refuseFirst`, from a caller whose
|
|
1344
|
+
// referrer is public, makes the first request refuse a private address too.
|
|
1345
|
+
// `refuseRedirect` builds the refusal of a public-to-private redirect, so a
|
|
1346
|
+
// caller can word it its own way.
|
|
1347
|
+
// Returns the body, the final URL, and whether any hop reached a public
|
|
1348
|
+
// address.
|
|
1349
|
+
async function getGuarded(url,
|
|
1350
|
+
// Binary by default (reference images); text callers pass FETCH_TEXT_DEFAULTS.
|
|
1351
|
+
opts = FETCH_BINARY_DEFAULTS, refuseFirst, refuseRedirect = redirectError) {
|
|
1352
|
+
const policy = localUrlPolicy();
|
|
1353
|
+
const axios = await loadAxios();
|
|
1354
|
+
const [{ default: http }, { default: https }] = await Promise.all([
|
|
1355
|
+
import("node:http"),
|
|
1356
|
+
import("node:https"),
|
|
1357
|
+
]);
|
|
1358
|
+
let current = url;
|
|
1359
|
+
let refuse = policy === "hops" ? refuseFirst : undefined;
|
|
1360
|
+
let reachedPublic = false;
|
|
1361
|
+
for (let hops = 0;; hops++) {
|
|
1362
|
+
if (policy === "block") {
|
|
1363
|
+
// The pre-connect check. A second lookup fires at connect time through
|
|
1364
|
+
// the agent's `lookup` below (ADR 01162).
|
|
1365
|
+
if (await privateAddressOf(current))
|
|
1366
|
+
throw strictModeError(current);
|
|
1367
|
+
const hopUrl = current;
|
|
1368
|
+
refuse = () => strictModeError(hopUrl);
|
|
1266
1369
|
}
|
|
1370
|
+
// Fresh agents per request, so no pooled socket skips the lookup. It
|
|
1371
|
+
// notes whether the connection resolved to a private address, and
|
|
1372
|
+
// refuses one when `refuse` is set.
|
|
1373
|
+
const seen = {};
|
|
1374
|
+
const refuseAtConnect = refuse;
|
|
1375
|
+
const target = hostKey(new URL(current).hostname);
|
|
1376
|
+
const lookup = (hostname, options, callback) => {
|
|
1377
|
+
// With a proxy configured, a lookup of another name is the proxy's. It
|
|
1378
|
+
// says nothing about the target, so it's neither refused nor counted;
|
|
1379
|
+
// the pre-connect checks still apply (ADR 01162).
|
|
1380
|
+
if (proxyConfigured() && hostKey(hostname) !== target) {
|
|
1381
|
+
return dnsCallback.lookup(hostname, options, callback);
|
|
1382
|
+
}
|
|
1383
|
+
return dnsCallback.lookup(hostname, options, (error, address, family) => {
|
|
1384
|
+
if (error)
|
|
1385
|
+
return callback(error, address, family);
|
|
1386
|
+
const answers = Array.isArray(address) ? address : [{ address }];
|
|
1387
|
+
seen.resolved = true;
|
|
1388
|
+
seen.private = answers.find((a) => isPrivateOrLoopbackAddress(a.address))?.address;
|
|
1389
|
+
seen.public = answers.some((a) => !isPrivateOrLoopbackAddress(a.address));
|
|
1390
|
+
if (seen.private && refuseAtConnect)
|
|
1391
|
+
return callback(refuseAtConnect(seen.private));
|
|
1392
|
+
callback(null, address, family);
|
|
1393
|
+
});
|
|
1394
|
+
};
|
|
1395
|
+
const response = await axios.get(current, {
|
|
1396
|
+
...opts,
|
|
1397
|
+
maxRedirects: 0,
|
|
1398
|
+
httpAgent: new http.Agent({ lookup }),
|
|
1399
|
+
httpsAgent: new https.Agent({ lookup }),
|
|
1400
|
+
validateStatus: (status) => (status >= 200 && status < 300) || REDIRECT_STATUSES.includes(status),
|
|
1401
|
+
}).catch((error) => {
|
|
1402
|
+
// axios wraps a refusal at connect time; hand back the refusal itself.
|
|
1403
|
+
throw error?.cause instanceof UrlGuardError ? error.cause : error;
|
|
1404
|
+
});
|
|
1405
|
+
// An IP literal skips the lookup, so classify it directly. A name the
|
|
1406
|
+
// lookup never saw (a proxy) is public unless every address is private.
|
|
1407
|
+
let hopPublic = seen.resolved
|
|
1408
|
+
? seen.public
|
|
1409
|
+
: net.isIP(target)
|
|
1410
|
+
? !isPrivateOrLoopbackAddress(target)
|
|
1411
|
+
: undefined;
|
|
1412
|
+
// A fresh lookup of this hop's host, made at most once: a flapping
|
|
1413
|
+
// resolver can't give the two checks below different answers. A failed
|
|
1414
|
+
// lookup counts as public. `every: true` is deliberate: the host is
|
|
1415
|
+
// private only when every address is, so in the `fromPublic` check a hop
|
|
1416
|
+
// the connection saw as private still counts as public when the fresh
|
|
1417
|
+
// lookup finds any public address. That's the guard failing closed.
|
|
1418
|
+
// `fresh` resets every iteration, and `current` stays this hop's URL until
|
|
1419
|
+
// `current = next` at the end of the loop.
|
|
1420
|
+
let fresh;
|
|
1421
|
+
const freshPublic = () => (fresh ??= privateAddressOf(current, { every: true }).then((a) => !a, () => true));
|
|
1422
|
+
if (hopPublic === undefined && policy !== "allow")
|
|
1423
|
+
hopPublic = await freshPublic();
|
|
1424
|
+
if (hopPublic)
|
|
1425
|
+
reachedPublic = true;
|
|
1426
|
+
if (!REDIRECT_STATUSES.includes(response.status)) {
|
|
1427
|
+
return { data: response.data, url: current, reachedPublic };
|
|
1428
|
+
}
|
|
1429
|
+
const location = response.headers?.location;
|
|
1430
|
+
// `hops` counts redirects followed, so at 5 a sixth redirect arrived and
|
|
1431
|
+
// "more than 5" is accurate.
|
|
1432
|
+
if (!location || hops >= 5) {
|
|
1433
|
+
// Names the original URL on purpose: it's the one the spec named. When
|
|
1434
|
+
// the limit and a missing Location both apply, the limit wins on purpose.
|
|
1435
|
+
throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: ${hops >= 5 ? "it needs more than 5 redirects" : `the ${response.status} redirect has no Location header`}.`);
|
|
1436
|
+
}
|
|
1437
|
+
const next = new URL(location, current).toString();
|
|
1438
|
+
const scheme = new URL(next).protocol;
|
|
1439
|
+
if (scheme !== "http:" && scheme !== "https:") {
|
|
1440
|
+
throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(current)}: the redirect leads to an unsupported scheme (\`${scheme.slice(0, -1)}\`).`);
|
|
1441
|
+
}
|
|
1442
|
+
if (policy === "hops") {
|
|
1443
|
+
// Fail closed: the hop comes from a public origin unless both the
|
|
1444
|
+
// connection and a fresh lookup say every address is private. Through a
|
|
1445
|
+
// proxy the connection looked up the proxy, not this host, so the fresh
|
|
1446
|
+
// lookup is the only signal.
|
|
1447
|
+
// The two `every` values differ on purpose, and both fail closed. This
|
|
1448
|
+
// hop is public when any address is; the target is refused when any is
|
|
1449
|
+
// private.
|
|
1450
|
+
const fromPublic = hopPublic || (await freshPublic());
|
|
1451
|
+
refuse = undefined;
|
|
1452
|
+
if (fromPublic) {
|
|
1453
|
+
const address = await privateAddressOf(next);
|
|
1454
|
+
if (address)
|
|
1455
|
+
throw refuseRedirect(current, address);
|
|
1456
|
+
const from = current;
|
|
1457
|
+
refuse = (connectAddress) => refuseRedirect(from, connectAddress);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
current = next;
|
|
1267
1461
|
}
|
|
1268
1462
|
}
|
|
1269
1463
|
async function fetchFile(fileURL, opts = {}) {
|
|
1270
1464
|
try {
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
await
|
|
1276
|
-
}
|
|
1277
|
-
const response = await (await loadAxios()).get(fileURL, opts.binary ? FETCH_BINARY_DEFAULTS : undefined);
|
|
1465
|
+
// Binary fetches (screenshot reference images) are guarded. The text
|
|
1466
|
+
// path loads operator-chosen input; not gated by design (ADR 01162).
|
|
1467
|
+
const response = opts.binary
|
|
1468
|
+
? await getGuarded(fileURL)
|
|
1469
|
+
: await (await loadAxios()).get(fileURL);
|
|
1278
1470
|
let data;
|
|
1279
1471
|
if (opts.binary) {
|
|
1280
1472
|
data = Buffer.from(response.data);
|
|
@@ -1898,7 +2090,7 @@ function applyVerifiedMarkers({ config, results, files: detectedFiles = [], init
|
|
|
1898
2090
|
}
|
|
1899
2091
|
}
|
|
1900
2092
|
const today = verifiedDate();
|
|
1901
|
-
const version =
|
|
2093
|
+
const version = ownVersion() ?? "unknown";
|
|
1902
2094
|
for (const file of files) {
|
|
1903
2095
|
try {
|
|
1904
2096
|
if (!fs.existsSync(file))
|