doc-detective 4.0.2-dev.11 → 4.0.2-dev.12
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/common/src/schemas/schemas.json +196 -112
- package/dist/common/src/types/generated/screenshot_v3.d.ts +2 -2
- package/dist/common/src/types/generated/step_v3.d.ts +2 -2
- package/dist/common/src/types/generated/test_v3.d.ts +4 -4
- package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
- package/dist/core/tests/saveScreenshot.js +130 -33
- package/dist/core/tests/saveScreenshot.js.map +1 -1
- package/dist/core/utils.d.ts +8 -2
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +193 -14
- package/dist/core/utils.js.map +1 -1
- package/dist/index.cjs +426 -146
- package/package.json +1 -1
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export type Screenshot = ScreenshotSimple | CaptureScreenshotDetailed | CaptureScreenshot;
|
|
9
9
|
/**
|
|
10
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
10
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
11
11
|
*/
|
|
12
12
|
export type ScreenshotSimple = string;
|
|
13
13
|
/**
|
|
14
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
14
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
15
15
|
*/
|
|
16
16
|
export type ScreenshotSimple1 = string;
|
|
17
17
|
/**
|
|
@@ -83,11 +83,11 @@ export type TypeKeysSimple1 = string | string[];
|
|
|
83
83
|
*/
|
|
84
84
|
export type Screenshot1 = ScreenshotSimple | CaptureScreenshotDetailed | CaptureScreenshot;
|
|
85
85
|
/**
|
|
86
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
86
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
87
87
|
*/
|
|
88
88
|
export type ScreenshotSimple = string;
|
|
89
89
|
/**
|
|
90
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
90
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
91
91
|
*/
|
|
92
92
|
export type ScreenshotSimple1 = string;
|
|
93
93
|
/**
|
|
@@ -158,11 +158,11 @@ export type TypeKeysSimple1 = string | string[];
|
|
|
158
158
|
*/
|
|
159
159
|
export type Screenshot1 = ScreenshotSimple | CaptureScreenshotDetailed | CaptureScreenshot;
|
|
160
160
|
/**
|
|
161
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
161
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
162
162
|
*/
|
|
163
163
|
export type ScreenshotSimple = string;
|
|
164
164
|
/**
|
|
165
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
165
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
166
166
|
*/
|
|
167
167
|
export type ScreenshotSimple1 = string;
|
|
168
168
|
/**
|
|
@@ -395,11 +395,11 @@ export type TypeKeysSimple3 = string | string[];
|
|
|
395
395
|
*/
|
|
396
396
|
export type Screenshot3 = ScreenshotSimple2 | CaptureScreenshotDetailed1 | CaptureScreenshot1;
|
|
397
397
|
/**
|
|
398
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
398
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
399
399
|
*/
|
|
400
400
|
export type ScreenshotSimple2 = string;
|
|
401
401
|
/**
|
|
402
|
-
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.
|
|
402
|
+
* File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step. If an `http(s)` URL is supplied, the remote image is downloaded and used as a read-only reference for comparison; the new capture is written to a local run-specific folder instead of being uploaded back to the URL.
|
|
403
403
|
*/
|
|
404
404
|
export type ScreenshotSimple3 = string;
|
|
405
405
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveScreenshot.d.ts","sourceRoot":"","sources":["../../../src/core/tests/saveScreenshot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"saveScreenshot.d.ts","sourceRoot":"","sources":["../../../src/core/tests/saveScreenshot.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AAE5D,KAAK,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAOpE,iBAAS,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBnE;AAED,iBAAS,iBAAiB,CACxB,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAIT;AAED,iBAAe,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,gBA0f9F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { validate } from "../../common/src/validate.js";
|
|
2
2
|
import { findElement } from "./findElement.js";
|
|
3
|
-
import { log } from "../utils.js";
|
|
3
|
+
import { log, fetchFile, getOrInitRunTimestamp, redactUrlForOutput, sanitizeFilesystemName, } from "../utils.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import fs from "node:fs";
|
|
6
6
|
import { PNG } from "pngjs";
|
|
@@ -98,25 +98,85 @@ async function saveScreenshot({ config, step, driver }) {
|
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
100
|
let filePath = step.screenshot.path;
|
|
101
|
-
// Set path directory
|
|
102
|
-
const dir = path.dirname(step.screenshot.path);
|
|
103
|
-
// If `dir` doesn't exist, create it
|
|
104
|
-
if (!fs.existsSync(dir)) {
|
|
105
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
106
|
-
}
|
|
107
|
-
// Check if file already exists
|
|
108
101
|
let existFilePath;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
102
|
+
let dir;
|
|
103
|
+
// Detect URL paths. A URL `path` is treated as a read-only reference:
|
|
104
|
+
// we download it to a temp file for comparison, and write the new capture
|
|
105
|
+
// to a local run-specific folder (URLs can't be written back to).
|
|
106
|
+
const isUrlPath = /^https?:\/\//i.test(filePath);
|
|
107
|
+
const originalUrlPath = isUrlPath ? filePath : undefined;
|
|
108
|
+
// Safe form for logs/descriptions/outputs: strips query + fragment so
|
|
109
|
+
// presigned-URL signatures/tokens don't leak into the report.
|
|
110
|
+
const redactedUrl = isUrlPath ? redactUrlForOutput(filePath) : undefined;
|
|
111
|
+
if (isUrlPath) {
|
|
112
|
+
const fetched = await fetchFile(originalUrlPath, { binary: true });
|
|
113
|
+
if (fetched.result !== "success") {
|
|
114
|
+
result.status = "FAIL";
|
|
115
|
+
result.description = `Couldn't fetch remote reference image (${redactedUrl}): ${fetched.message}`;
|
|
114
116
|
return result;
|
|
115
117
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
existFilePath = fetched.path;
|
|
119
|
+
// URL-derived names can contain path separators (`/`, `\`) or `..`
|
|
120
|
+
// segments. `path.basename` on a slash-normalized string strips directory
|
|
121
|
+
// components; we also sanitize any residual traversal and prepend stepId
|
|
122
|
+
// so two URL screenshots with the same basename don't clobber each other.
|
|
123
|
+
let urlPathname;
|
|
124
|
+
try {
|
|
125
|
+
urlPathname = new URL(originalUrlPath).pathname;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
urlPathname = originalUrlPath;
|
|
129
|
+
}
|
|
130
|
+
const rawBase = path.basename(urlPathname.split("?")[0].split("#")[0].replace(/\\/g, "/"));
|
|
131
|
+
// Also strip characters that are invalid in filenames on Windows
|
|
132
|
+
// (`< > : " | ? *` and control chars). Without this, a URL segment like
|
|
133
|
+
// `img:v2.png` would build a path the Windows file system refuses to
|
|
134
|
+
// create. Shared helper so the rule stays consistent with fetchFile.
|
|
135
|
+
const safeBase = sanitizeFilesystemName(rawBase, `${step.stepId}.png`);
|
|
136
|
+
dir = path.join(process.cwd(), "doc-detective-runs", getOrInitRunTimestamp(config));
|
|
137
|
+
if (!fs.existsSync(dir)) {
|
|
138
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
139
|
+
}
|
|
140
|
+
// Append a per-capture suffix so URL refs that share a basename (or a
|
|
141
|
+
// future code path that reuses `stepId`) can't clobber each other.
|
|
142
|
+
const captureId = `${step.stepId || "screenshot"}_${Date.now()}`;
|
|
143
|
+
filePath = path.join(dir, `${captureId}_${safeBase}`);
|
|
144
|
+
// Defense in depth: the resolved capture path must stay inside `dir`.
|
|
145
|
+
const resolvedDir = path.resolve(dir);
|
|
146
|
+
const resolvedFile = path.resolve(filePath);
|
|
147
|
+
if (!resolvedFile.startsWith(resolvedDir + path.sep)) {
|
|
148
|
+
result.status = "FAIL";
|
|
149
|
+
result.description = `Refusing to write screenshot outside run folder: ${resolvedFile}`;
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
// Overwrite semantics can't apply to a URL. The comparison block below
|
|
153
|
+
// gates every mutating branch on `!isUrlPath`, so we log the user's
|
|
154
|
+
// original value and leave `step.screenshot.overwrite` untouched — the
|
|
155
|
+
// reported step object continues to reflect what they actually specified.
|
|
156
|
+
if (step.screenshot.overwrite !== "false") {
|
|
157
|
+
log(config, "debug", `Screenshot path is a URL (${redactedUrl}); overwrite is ignored, running comparison only.`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Set path directory
|
|
162
|
+
dir = path.dirname(step.screenshot.path);
|
|
163
|
+
// If `dir` doesn't exist, create it
|
|
164
|
+
if (!fs.existsSync(dir)) {
|
|
165
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
166
|
+
}
|
|
167
|
+
// Check if file already exists
|
|
168
|
+
if (fs.existsSync(filePath)) {
|
|
169
|
+
if (step.screenshot.overwrite == "false") {
|
|
170
|
+
// File already exists
|
|
171
|
+
result.status = "SKIPPED";
|
|
172
|
+
result.description = `File already exists: ${filePath}`;
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Set temp file path
|
|
177
|
+
existFilePath = filePath;
|
|
178
|
+
filePath = path.join(dir, `${step.stepId}_${Date.now()}.png`);
|
|
179
|
+
}
|
|
120
180
|
}
|
|
121
181
|
}
|
|
122
182
|
if (step.screenshot.crop) {
|
|
@@ -298,7 +358,10 @@ async function saveScreenshot({ config, step, driver }) {
|
|
|
298
358
|
// If overwrite is true, replace old file with new file
|
|
299
359
|
// If overwrite is aboveVariation, compare files and replace if variance is greater than threshold
|
|
300
360
|
if (existFilePath) {
|
|
301
|
-
|
|
361
|
+
// URL paths never take the "overwrite=true" fast path: existFilePath is a
|
|
362
|
+
// temp download, not a user-owned reference, and the local capture is
|
|
363
|
+
// kept in the run folder for inspection.
|
|
364
|
+
if (step.screenshot.overwrite == "true" && !isUrlPath) {
|
|
302
365
|
// Replace old file with new file
|
|
303
366
|
result.description += ` Overwrote existing file.`;
|
|
304
367
|
fs.renameSync(filePath, existFilePath);
|
|
@@ -313,13 +376,31 @@ async function saveScreenshot({ config, step, driver }) {
|
|
|
313
376
|
let fractionalDiff;
|
|
314
377
|
// Perform numerical pixel diff with pixelmatch
|
|
315
378
|
if (step.screenshot.maxVariation != null) {
|
|
316
|
-
|
|
317
|
-
|
|
379
|
+
let img1;
|
|
380
|
+
let img2;
|
|
381
|
+
try {
|
|
382
|
+
img1 = PNG.sync.read(fs.readFileSync(existFilePath));
|
|
383
|
+
img2 = PNG.sync.read(fs.readFileSync(filePath));
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
result.status = "FAIL";
|
|
387
|
+
result.description = isUrlPath
|
|
388
|
+
? `Couldn't decode PNG for comparison. The URL reference (${redactedUrl}) may not be a valid PNG. ${error}`
|
|
389
|
+
: `Couldn't decode PNG for comparison. ${error}`;
|
|
390
|
+
if (!isUrlPath &&
|
|
391
|
+
filePath !== existFilePath &&
|
|
392
|
+
fs.existsSync(filePath)) {
|
|
393
|
+
fs.unlinkSync(filePath);
|
|
394
|
+
}
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
318
397
|
// Compare aspect ratio of images
|
|
319
398
|
if (!aspectRatiosMatch(img1, img2)) {
|
|
320
399
|
result.status = "FAIL";
|
|
321
400
|
result.description = `Couldn't compare images. Images have different aspect ratios.`;
|
|
322
|
-
if (
|
|
401
|
+
if (!isUrlPath &&
|
|
402
|
+
filePath !== existFilePath &&
|
|
403
|
+
fs.existsSync(filePath)) {
|
|
323
404
|
fs.unlinkSync(filePath);
|
|
324
405
|
}
|
|
325
406
|
return result;
|
|
@@ -358,29 +439,45 @@ async function saveScreenshot({ config, step, driver }) {
|
|
|
358
439
|
fractionalDiff,
|
|
359
440
|
});
|
|
360
441
|
if (fractionalDiff > step.screenshot.maxVariation) {
|
|
361
|
-
if (step.screenshot.overwrite == "aboveVariation") {
|
|
442
|
+
if (step.screenshot.overwrite == "aboveVariation" && !isUrlPath) {
|
|
362
443
|
// Replace old file with new file
|
|
363
444
|
fs.renameSync(filePath, existFilePath);
|
|
364
445
|
}
|
|
365
446
|
result.status = "WARNING";
|
|
366
447
|
result.description += ` The difference between the existing screenshot and new screenshot (${fractionalDiff.toFixed(2)}) is greater than the max accepted variation (${step.screenshot.maxVariation}).`;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
448
|
+
if (isUrlPath) {
|
|
449
|
+
// URL references are read-only: we can't write back to the remote.
|
|
450
|
+
// Leave `outputs.changed` at its default (false) so upload pipelines
|
|
451
|
+
// like collectChangedFiles()/Heretto don't treat this as something
|
|
452
|
+
// to push, and omit sourceIntegration for the same reason. The
|
|
453
|
+
// drift signal lives in `result.status === "WARNING"` + the local
|
|
454
|
+
// capture path + referenceUrl.
|
|
455
|
+
result.outputs.screenshotPath = filePath;
|
|
456
|
+
result.outputs.referenceUrl = redactedUrl;
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
result.outputs.changed = true;
|
|
460
|
+
result.outputs.screenshotPath = existFilePath;
|
|
461
|
+
if (step.screenshot.sourceIntegration) {
|
|
462
|
+
result.outputs.sourceIntegration = step.screenshot.sourceIntegration;
|
|
463
|
+
}
|
|
372
464
|
}
|
|
373
465
|
return result;
|
|
374
466
|
}
|
|
375
467
|
else {
|
|
376
468
|
result.description += ` Screenshots are within maximum accepted variation: ${fractionalDiff.toFixed(2)}.`;
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
result.outputs.sourceIntegration = step.screenshot.sourceIntegration;
|
|
469
|
+
if (isUrlPath) {
|
|
470
|
+
result.outputs.screenshotPath = filePath;
|
|
471
|
+
result.outputs.referenceUrl = redactedUrl;
|
|
381
472
|
}
|
|
382
|
-
|
|
383
|
-
|
|
473
|
+
else {
|
|
474
|
+
result.outputs.screenshotPath = existFilePath;
|
|
475
|
+
if (step.screenshot.sourceIntegration) {
|
|
476
|
+
result.outputs.sourceIntegration = step.screenshot.sourceIntegration;
|
|
477
|
+
}
|
|
478
|
+
if (step.screenshot.overwrite != "true") {
|
|
479
|
+
fs.unlinkSync(filePath);
|
|
480
|
+
}
|
|
384
481
|
}
|
|
385
482
|
}
|
|
386
483
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveScreenshot.js","sourceRoot":"","sources":["../../../src/core/tests/saveScreenshot.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"saveScreenshot.js","sourceRoot":"","sources":["../../../src/core/tests/saveScreenshot.ts"],"names":[],"mappings":"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"}
|
package/dist/core/utils.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
export { outputResults, loadEnvs, log, timestamp, replaceEnvs, spawnCommand, inContainer, cleanTemp, calculateFractionalDifference, fetchFile, isRelativeUrl, };
|
|
1
|
+
export { outputResults, loadEnvs, log, timestamp, getOrInitRunTimestamp, replaceEnvs, spawnCommand, inContainer, cleanTemp, calculateFractionalDifference, fetchFile, isRelativeUrl, redactUrlForOutput, assertUrlHostIsPublic, sanitizeFilesystemName, };
|
|
2
2
|
declare function isRelativeUrl(url: string): boolean;
|
|
3
3
|
declare function cleanTemp(): void;
|
|
4
|
-
declare function
|
|
4
|
+
declare function sanitizeFilesystemName(name: string, fallback: string): string;
|
|
5
|
+
declare function redactUrlForOutput(value: string): string;
|
|
6
|
+
declare function assertUrlHostIsPublic(fileURL: string): Promise<void>;
|
|
7
|
+
declare function fetchFile(fileURL: string, opts?: {
|
|
8
|
+
binary?: boolean;
|
|
9
|
+
}): Promise<{
|
|
5
10
|
result: string;
|
|
6
11
|
path: string;
|
|
7
12
|
message?: undefined;
|
|
@@ -27,6 +32,7 @@ declare function loadEnvs(envsFile: string): Promise<{
|
|
|
27
32
|
declare function log(config: any, level: string, message?: any): Promise<void>;
|
|
28
33
|
declare function replaceEnvs(stringOrObject: any): any;
|
|
29
34
|
declare function timestamp(): string;
|
|
35
|
+
declare function getOrInitRunTimestamp(config: any): string;
|
|
30
36
|
/**
|
|
31
37
|
* Executes a command in a child process using the `spawn` function from the `child_process` module.
|
|
32
38
|
* @param {string} cmd - The command to execute.
|
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":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AASA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,GAAG,EACH,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,6BAA6B,EAC7B,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,CAAC;AAEF,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,WASjC;AAGD,iBAAS,SAAS,SAajB;AAqBD,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtE;AAwBD,iBAAS,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD;AA4CD,iBAAe,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CnE;AAED,iBAAe,SAAS,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;GA8ChC;AAED,iBAAe,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,iBAOnE;AAED;;;;;;;;GAQG;AACH,iBAAe,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;GASvC;AAED,iBAAe,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,iBAuC3D;AAED,iBAAS,WAAW,CAAC,cAAc,EAAE,GAAG,GAAG,GAAG,CA2C7C;AAED,iBAAS,SAAS,WASjB;AAID,iBAAS,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAMlD;AAGD;;;;;;;;GAQG;AACH,iBAAe,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,GAAQ;;;;GA4C9E;AAED,iBAAe,WAAW,qBASzB;AAED;;;;;;;GAOG;AACH,iBAAS,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAMlE"}
|
package/dist/core/utils.js
CHANGED
|
@@ -2,9 +2,11 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
|
+
import dns from "node:dns/promises";
|
|
6
|
+
import net from "node:net";
|
|
5
7
|
import axios from "axios";
|
|
6
8
|
import { spawn } from "node:child_process";
|
|
7
|
-
export { outputResults, loadEnvs, log, timestamp, replaceEnvs, spawnCommand, inContainer, cleanTemp, calculateFractionalDifference, fetchFile, isRelativeUrl, };
|
|
9
|
+
export { outputResults, loadEnvs, log, timestamp, getOrInitRunTimestamp, replaceEnvs, spawnCommand, inContainer, cleanTemp, calculateFractionalDifference, fetchFile, isRelativeUrl, redactUrlForOutput, assertUrlHostIsPublic, sanitizeFilesystemName, };
|
|
8
10
|
function isRelativeUrl(url) {
|
|
9
11
|
try {
|
|
10
12
|
new URL(url);
|
|
@@ -32,29 +34,196 @@ function cleanTemp() {
|
|
|
32
34
|
});
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
|
-
// Fetch a file from a URL and save to a temp directory
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
|
|
37
|
+
// Fetch a file from a URL and save to a temp directory.
|
|
38
|
+
// With `{ binary: true }`, fetches as arraybuffer and preserves raw bytes —
|
|
39
|
+
// required for images and other non-text payloads. Binary fetches also apply
|
|
40
|
+
// hard limits (timeout, max body size, max redirects) so a misbehaving server
|
|
41
|
+
// can't stall or OOM the run.
|
|
42
|
+
// Otherwise, non-JSON responses are stringified (text pass-through).
|
|
43
|
+
// Returns `{ result: "error", message }` on failure.
|
|
44
|
+
const FETCH_BINARY_DEFAULTS = {
|
|
45
|
+
responseType: "arraybuffer",
|
|
46
|
+
timeout: 30_000,
|
|
47
|
+
maxContentLength: 50 * 1024 * 1024,
|
|
48
|
+
maxBodyLength: 50 * 1024 * 1024,
|
|
49
|
+
maxRedirects: 5,
|
|
50
|
+
};
|
|
51
|
+
// Replace characters that are invalid in filenames on Windows (and often
|
|
52
|
+
// problematic on other platforms) with `_`. Keeps dots, hyphens, and
|
|
53
|
+
// alphanumerics untouched so names stay recognizable. Also rejects leading
|
|
54
|
+
// dots that could turn the file into a traversal segment.
|
|
55
|
+
function sanitizeFilesystemName(name, fallback) {
|
|
56
|
+
if (!name || name === "." || name === "..")
|
|
57
|
+
return fallback;
|
|
58
|
+
// Control chars 0x00-0x1f + Windows reserved: < > : " / \ | ? *
|
|
59
|
+
const cleaned = name.replace(/[\x00-\x1f<>:"/\\|?*]/g, "_");
|
|
60
|
+
// After replacement, guard against all-dots or empty results.
|
|
61
|
+
if (!cleaned || /^\.+$/.test(cleaned))
|
|
62
|
+
return fallback;
|
|
63
|
+
return cleaned;
|
|
64
|
+
}
|
|
65
|
+
// Derive a safe on-disk filename from a URL. URL-derived strings can contain
|
|
66
|
+
// path separators (`/`, `\`), traversal segments (`..`), or characters that
|
|
67
|
+
// are invalid in filenames on Windows (`:<>"|?*`). `path.basename` strips
|
|
68
|
+
// directory components; `sanitizeFilesystemName` then neutralizes remaining
|
|
69
|
+
// unsafe characters so `fetchFile` works on every platform.
|
|
70
|
+
function safeFilenameFromUrl(fileURL, fallback) {
|
|
71
|
+
let raw;
|
|
72
|
+
try {
|
|
73
|
+
raw = new URL(fileURL).pathname;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
raw = fileURL;
|
|
77
|
+
}
|
|
78
|
+
raw = raw.split("?")[0].split("#")[0];
|
|
79
|
+
const base = path.basename(raw.replace(/\\/g, "/"));
|
|
80
|
+
return sanitizeFilesystemName(base, fallback);
|
|
81
|
+
}
|
|
82
|
+
// Strip query string and fragment from a URL for display/logging. S3
|
|
83
|
+
// pre-signed URLs carry tokens/signatures in the query; leaking them into
|
|
84
|
+
// step descriptions, debug logs, or result outputs exposes credentials.
|
|
85
|
+
// The full URL with query is still used for the fetch itself — only the
|
|
86
|
+
// *reported* form is redacted.
|
|
87
|
+
function redactUrlForOutput(value) {
|
|
39
88
|
try {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
89
|
+
const url = new URL(value);
|
|
90
|
+
url.search = "";
|
|
91
|
+
url.hash = "";
|
|
92
|
+
return url.toString();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return value.split("?")[0].split("#")[0];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Private/loopback/link-local IP ranges that binary URL fetches refuse to
|
|
99
|
+
// reach by default. Covers IPv4 RFC1918, loopback, link-local (169.254/16),
|
|
100
|
+
// carrier-grade NAT (100.64/10), and the cloud-metadata special cases
|
|
101
|
+
// (169.254.169.254 is inside link-local and thus covered).
|
|
102
|
+
function isPrivateOrLoopbackAddress(ip) {
|
|
103
|
+
if (!ip)
|
|
104
|
+
return false;
|
|
105
|
+
if (net.isIPv4(ip)) {
|
|
106
|
+
const [a, b] = ip.split(".").map(Number);
|
|
107
|
+
if (a === 10)
|
|
108
|
+
return true;
|
|
109
|
+
if (a === 127)
|
|
110
|
+
return true;
|
|
111
|
+
if (a === 0)
|
|
112
|
+
return true;
|
|
113
|
+
if (a === 169 && b === 254)
|
|
114
|
+
return true;
|
|
115
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
116
|
+
return true;
|
|
117
|
+
if (a === 192 && b === 168)
|
|
118
|
+
return true;
|
|
119
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
120
|
+
return true;
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (net.isIPv6(ip)) {
|
|
124
|
+
const normalized = ip.toLowerCase();
|
|
125
|
+
if (normalized === "::1")
|
|
126
|
+
return true;
|
|
127
|
+
if (normalized === "::")
|
|
128
|
+
return true;
|
|
129
|
+
if (normalized.startsWith("fc") || normalized.startsWith("fd"))
|
|
130
|
+
return true; // unique local
|
|
131
|
+
if (normalized.startsWith("fe80:"))
|
|
132
|
+
return true; // link-local
|
|
133
|
+
if (normalized.startsWith("::ffff:")) {
|
|
134
|
+
// IPv4-mapped: recurse on the embedded v4
|
|
135
|
+
return isPrivateOrLoopbackAddress(normalized.replace("::ffff:", ""));
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
// Reject URLs whose host resolves to a loopback/private IP, unless the
|
|
142
|
+
// caller explicitly opts in (DOC_DETECTIVE_ALLOW_LOCAL_URLS=true). Tests
|
|
143
|
+
// and trusted internal integrations set the env var; normal doc-spec input
|
|
144
|
+
// does not, so an untrusted spec can't pivot through doc-detective to hit
|
|
145
|
+
// cloud metadata or intranet services.
|
|
146
|
+
//
|
|
147
|
+
// Note: this is a best-effort check. DNS rebinding and TOCTOU races are
|
|
148
|
+
// possible between resolution and connect; for true SSRF-grade isolation,
|
|
149
|
+
// wire in an agent that validates the actual remote address at connect
|
|
150
|
+
// time. This guard covers the common misuse cases.
|
|
151
|
+
async function assertUrlHostIsPublic(fileURL) {
|
|
152
|
+
if (process.env.DOC_DETECTIVE_ALLOW_LOCAL_URLS === "true")
|
|
153
|
+
return;
|
|
154
|
+
let parsed;
|
|
155
|
+
try {
|
|
156
|
+
parsed = new URL(fileURL);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
throw new Error(`Invalid URL: ${redactUrlForOutput(fileURL)}`);
|
|
160
|
+
}
|
|
161
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
162
|
+
throw new Error(`Unsupported URL scheme (${parsed.protocol}) for ${redactUrlForOutput(fileURL)}`);
|
|
163
|
+
}
|
|
164
|
+
const host = parsed.hostname.replace(/^\[|\]$/g, "");
|
|
165
|
+
// Direct IP literals: check immediately.
|
|
166
|
+
if (net.isIP(host)) {
|
|
167
|
+
if (isPrivateOrLoopbackAddress(host)) {
|
|
168
|
+
throw new Error(`Refusing to fetch private/loopback address (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Hostnames: resolve and check every answer (A + AAAA).
|
|
173
|
+
const lower = host.toLowerCase();
|
|
174
|
+
if (lower === "localhost" || lower.endsWith(".localhost")) {
|
|
175
|
+
throw new Error(`Refusing to fetch localhost (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
|
|
176
|
+
}
|
|
177
|
+
let addresses;
|
|
178
|
+
try {
|
|
179
|
+
addresses = await dns.lookup(host, { all: true });
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
throw new Error(`Couldn't resolve host ${host} for SSRF check: ${error.message}`);
|
|
183
|
+
}
|
|
184
|
+
for (const { address } of addresses) {
|
|
185
|
+
if (isPrivateOrLoopbackAddress(address)) {
|
|
186
|
+
throw new Error(`Host ${host} resolves to a private/loopback address (${address}); refusing to fetch. Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function fetchFile(fileURL, opts = {}) {
|
|
191
|
+
try {
|
|
192
|
+
if (opts.binary) {
|
|
193
|
+
// Only gate binary fetches for now — the text path is an internal
|
|
194
|
+
// loader used by the test-detection pipeline and pre-dates this
|
|
195
|
+
// change; expanding SSRF coverage there belongs in its own PR.
|
|
196
|
+
await assertUrlHostIsPublic(fileURL);
|
|
197
|
+
}
|
|
198
|
+
const response = await axios.get(fileURL, opts.binary ? FETCH_BINARY_DEFAULTS : undefined);
|
|
199
|
+
let data;
|
|
200
|
+
if (opts.binary) {
|
|
201
|
+
data = Buffer.from(response.data);
|
|
202
|
+
}
|
|
203
|
+
else if (typeof response.data === "object") {
|
|
204
|
+
data = JSON.stringify(response.data, null, 2);
|
|
43
205
|
}
|
|
44
206
|
else {
|
|
45
|
-
|
|
207
|
+
data = response.data.toString();
|
|
46
208
|
}
|
|
47
|
-
const fileName = fileURL
|
|
48
|
-
const hash = crypto.createHash("md5").update(
|
|
209
|
+
const fileName = safeFilenameFromUrl(fileURL, "fetched_file");
|
|
210
|
+
const hash = crypto.createHash("md5").update(data).digest("hex");
|
|
49
211
|
const ddTempDir = path.join(os.tmpdir(), "doc-detective");
|
|
50
212
|
const filePath = path.join(ddTempDir, `${hash}_${fileName}`);
|
|
51
|
-
//
|
|
213
|
+
// Defense in depth: ensure the resolved path is still inside ddTempDir.
|
|
214
|
+
const resolvedDir = path.resolve(ddTempDir);
|
|
215
|
+
const resolvedFile = path.resolve(filePath);
|
|
216
|
+
if (!resolvedFile.startsWith(resolvedDir + path.sep)) {
|
|
217
|
+
return {
|
|
218
|
+
result: "error",
|
|
219
|
+
message: new Error(`Refusing to write outside temp dir: ${resolvedFile}`),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
52
222
|
if (!fs.existsSync(ddTempDir)) {
|
|
53
223
|
fs.mkdirSync(ddTempDir, { recursive: true });
|
|
54
224
|
}
|
|
55
|
-
// If file doesn't exist, write it
|
|
56
225
|
if (!fs.existsSync(filePath)) {
|
|
57
|
-
fs.writeFileSync(filePath,
|
|
226
|
+
fs.writeFileSync(filePath, data);
|
|
58
227
|
}
|
|
59
228
|
return { result: "success", path: filePath };
|
|
60
229
|
}
|
|
@@ -179,6 +348,16 @@ function timestamp() {
|
|
|
179
348
|
let timestamp = new Date();
|
|
180
349
|
return `${timestamp.getFullYear()}${("0" + (timestamp.getMonth() + 1)).slice(-2)}${("0" + timestamp.getDate()).slice(-2)}-${("0" + timestamp.getHours()).slice(-2)}${("0" + timestamp.getMinutes()).slice(-2)}${("0" + timestamp.getSeconds()).slice(-2)}`;
|
|
181
350
|
}
|
|
351
|
+
// Memoize one timestamp per run on the config object so every URL-referenced
|
|
352
|
+
// screenshot in a single run lands in the same folder.
|
|
353
|
+
function getOrInitRunTimestamp(config) {
|
|
354
|
+
if (!config)
|
|
355
|
+
return timestamp();
|
|
356
|
+
if (!config.__runTimestamp) {
|
|
357
|
+
config.__runTimestamp = timestamp();
|
|
358
|
+
}
|
|
359
|
+
return config.__runTimestamp;
|
|
360
|
+
}
|
|
182
361
|
// Perform a native command in the current working directory.
|
|
183
362
|
/**
|
|
184
363
|
* Executes a command in a child process using the `spawn` function from the `child_process` module.
|