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.
@@ -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":"AAiBA,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,gBA2Y9F"}
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
- if (fs.existsSync(filePath)) {
110
- if (step.screenshot.overwrite == "false") {
111
- // File already exists
112
- result.status = "SKIPPED";
113
- result.description = `File already exists: ${filePath}`;
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
- else {
117
- // Set temp file path
118
- existFilePath = filePath;
119
- filePath = path.join(dir, `${step.stepId}_${Date.now()}.png`);
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
- if (step.screenshot.overwrite == "true") {
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
- const img1 = PNG.sync.read(fs.readFileSync(existFilePath));
317
- const img2 = PNG.sync.read(fs.readFileSync(filePath));
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 (existFilePath && filePath !== existFilePath && fs.existsSync(filePath)) {
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
- result.outputs.changed = true;
368
- result.outputs.screenshotPath = existFilePath;
369
- // Preserve sourceIntegration metadata for upload processing
370
- if (step.screenshot.sourceIntegration) {
371
- result.outputs.sourceIntegration = step.screenshot.sourceIntegration;
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
- result.outputs.screenshotPath = existFilePath;
378
- // Preserve sourceIntegration metadata
379
- if (step.screenshot.sourceIntegration) {
380
- result.outputs.sourceIntegration = step.screenshot.sourceIntegration;
469
+ if (isUrlPath) {
470
+ result.outputs.screenshotPath = filePath;
471
+ result.outputs.referenceUrl = redactedUrl;
381
472
  }
382
- if (step.screenshot.overwrite != "true") {
383
- fs.unlinkSync(filePath);
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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"}
@@ -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 fetchFile(fileURL: string): Promise<{
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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,GAAG,EACH,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,6BAA6B,EAC7B,SAAS,EACT,aAAa,GACd,CAAC;AAEF,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,WASjC;AAGD,iBAAS,SAAS,SAajB;AAKD,iBAAe,SAAS,CAAC,OAAO,EAAE,MAAM;;;;;;;;GAwBvC;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;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"}
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"}
@@ -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
- // If the file is not JSON, return the contents as a string
37
- // If the file is not found, return an error
38
- async function fetchFile(fileURL) {
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 response = await axios.get(fileURL);
41
- if (typeof response.data === "object") {
42
- response.data = JSON.stringify(response.data, null, 2);
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
- response.data = response.data.toString();
207
+ data = response.data.toString();
46
208
  }
47
- const fileName = fileURL.split("/").pop() || "fetched_file";
48
- const hash = crypto.createHash("md5").update(response.data).digest("hex");
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
- // If doc-detective temp directory doesn't exist, create it
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, response.data);
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.