secureflow-cli 2.1.1 → 2.1.3
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/exporters.d.ts +8 -0
- package/dist/exporters.d.ts.map +1 -1
- package/dist/exporters.js +39 -0
- package/dist/exporters.js.map +1 -1
- package/dist/ignore.d.ts +34 -0
- package/dist/ignore.d.ts.map +1 -0
- package/dist/ignore.js +118 -0
- package/dist/ignore.js.map +1 -0
- package/dist/index.js +66 -11
- package/dist/index.js.map +1 -1
- package/dist/sarif.d.ts +17 -0
- package/dist/sarif.d.ts.map +1 -1
- package/dist/sarif.js +236 -1
- package/dist/sarif.js.map +1 -1
- package/dist/scanner.d.ts +20 -4
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +71 -4
- package/dist/scanner.js.map +1 -1
- package/package.json +1 -1
package/dist/exporters.d.ts
CHANGED
|
@@ -27,6 +27,10 @@ export declare function escapeCsv(value: string): string;
|
|
|
27
27
|
* content (e.g. source code snippets) in generated HTML reports.
|
|
28
28
|
*/
|
|
29
29
|
export declare function escapeHtml(value: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Escapes characters that break Markdown table syntax (pipes, backslashes, and line breaks).
|
|
32
|
+
*/
|
|
33
|
+
export declare function escapeMarkdownTable(value: string): string;
|
|
30
34
|
/**
|
|
31
35
|
* Formats scan results as a CSV string.
|
|
32
36
|
*
|
|
@@ -46,4 +50,8 @@ export declare function formatCsv(results: FileScanResult[]): string;
|
|
|
46
50
|
* HTML-escaped to prevent XSS.
|
|
47
51
|
*/
|
|
48
52
|
export declare function formatHtml(results: FileScanResult[]): string;
|
|
53
|
+
/**
|
|
54
|
+
* Formats scan results as a GitHub-flavored Markdown report.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatMarkdown(results: FileScanResult[]): string;
|
|
49
57
|
//# sourceMappingURL=exporters.d.ts.map
|
package/dist/exporters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../src/exporters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAcnD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAQD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAY3D;AAMD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CA4G5D"}
|
|
1
|
+
{"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../src/exporters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAcnD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAQD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAY3D;AAMD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CA4G5D;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAgChE"}
|
package/dist/exporters.js
CHANGED
|
@@ -49,6 +49,12 @@ export function escapeHtml(value) {
|
|
|
49
49
|
.replace(/"/g, """)
|
|
50
50
|
.replace(/'/g, "'");
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Escapes characters that break Markdown table syntax (pipes, backslashes, and line breaks).
|
|
54
|
+
*/
|
|
55
|
+
export function escapeMarkdownTable(value) {
|
|
56
|
+
return value.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\r?\n/g, "<br>");
|
|
57
|
+
}
|
|
52
58
|
// ---------------------------------------------------------------------------
|
|
53
59
|
// CSV formatter
|
|
54
60
|
// ---------------------------------------------------------------------------
|
|
@@ -184,4 +190,37 @@ ${tableRows}
|
|
|
184
190
|
</html>
|
|
185
191
|
`;
|
|
186
192
|
}
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Markdown formatter
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
/**
|
|
197
|
+
* Formats scan results as a GitHub-flavored Markdown report.
|
|
198
|
+
*/
|
|
199
|
+
export function formatMarkdown(results) {
|
|
200
|
+
const violations = [];
|
|
201
|
+
for (const file of results) {
|
|
202
|
+
for (const v of file.violations) {
|
|
203
|
+
violations.push({ path: file.path, line: v.line, text: v.text, reason: v.reason });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const lines = ["# 🛡️ SecureFlow Scan Report", ""];
|
|
207
|
+
if (violations.length === 0) {
|
|
208
|
+
lines.push("✅ **No violations detected.**");
|
|
209
|
+
lines.push("");
|
|
210
|
+
return lines.join("\n");
|
|
211
|
+
}
|
|
212
|
+
lines.push(`Found **${violations.length}** violation${violations.length === 1 ? "" : "s"}.`);
|
|
213
|
+
lines.push("");
|
|
214
|
+
lines.push("| File | Line | Violation | Reason |");
|
|
215
|
+
lines.push("| --- | --- | --- | --- |");
|
|
216
|
+
for (const v of violations) {
|
|
217
|
+
const file = escapeMarkdownTable(v.path);
|
|
218
|
+
const line = v.line;
|
|
219
|
+
const text = `\`${escapeMarkdownTable(v.text)}\``;
|
|
220
|
+
const reason = escapeMarkdownTable(v.reason);
|
|
221
|
+
lines.push(`| ${file} | ${line} | ${text} | ${reason} |`);
|
|
222
|
+
}
|
|
223
|
+
lines.push("");
|
|
224
|
+
return lines.join("\n");
|
|
225
|
+
}
|
|
187
226
|
//# sourceMappingURL=exporters.js.map
|
package/dist/exporters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporters.js","sourceRoot":"","sources":["../src/exporters.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exporters.js","sourceRoot":"","sources":["../src/exporters.ts"],"names":[],"mappings":"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"}
|
package/dist/ignore.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface SecureFlowIgnoreConfig {
|
|
2
|
+
ignoredPaths: string[];
|
|
3
|
+
placeholders: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Normalizes a file path for consistent matching against ignore patterns:
|
|
7
|
+
* converts backslashes to forward slashes, removes leading `./` or `/`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeScanPath(filename: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Parses the raw text of a `.secureflowignore` file into structured configuration.
|
|
12
|
+
*
|
|
13
|
+
* Supports comments (`#`), whitespace trimming, and optional section headers:
|
|
14
|
+
* - `[paths]` or `[files]`: file paths and glob patterns to ignore
|
|
15
|
+
* - `[placeholders]` or `[mocks]`: test credential values/patterns to suppress
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseSecureFlowIgnore(content: string): SecureFlowIgnoreConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Compiles an array of glob strings into RegExp patterns for path matching.
|
|
20
|
+
*/
|
|
21
|
+
export declare function compileIgnorePatterns(patterns: string[]): RegExp[];
|
|
22
|
+
/**
|
|
23
|
+
* Checks whether a given file path matches any compiled ignore regular expression.
|
|
24
|
+
*/
|
|
25
|
+
export declare function shouldIgnorePath(filename: string, customIgnores?: RegExp[]): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Searches for and loads `.secureflowignore` from the specified path or directory root.
|
|
28
|
+
* Returns the parsed configuration and compiled regex patterns, or `null` if the file doesn't exist.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadSecureFlowIgnore(customFilePath?: string, rootDir?: string): {
|
|
31
|
+
config: SecureFlowIgnoreConfig;
|
|
32
|
+
compiledPatterns: RegExp[];
|
|
33
|
+
} | null;
|
|
34
|
+
//# sourceMappingURL=ignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CA+B7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwClE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,OAAO,CAOxF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,MAAsB,GAC9B;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAsBvE"}
|
package/dist/ignore.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes a file path for consistent matching against ignore patterns:
|
|
5
|
+
* converts backslashes to forward slashes, removes leading `./` or `/`.
|
|
6
|
+
*/
|
|
7
|
+
export function normalizeScanPath(filename) {
|
|
8
|
+
return filename
|
|
9
|
+
.replace(/\\/g, "/")
|
|
10
|
+
.replace(/^\.\//, "")
|
|
11
|
+
.replace(/^\/+/, "");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parses the raw text of a `.secureflowignore` file into structured configuration.
|
|
15
|
+
*
|
|
16
|
+
* Supports comments (`#`), whitespace trimming, and optional section headers:
|
|
17
|
+
* - `[paths]` or `[files]`: file paths and glob patterns to ignore
|
|
18
|
+
* - `[placeholders]` or `[mocks]`: test credential values/patterns to suppress
|
|
19
|
+
*/
|
|
20
|
+
export function parseSecureFlowIgnore(content) {
|
|
21
|
+
const ignoredPaths = [];
|
|
22
|
+
const placeholders = [];
|
|
23
|
+
let currentSection = "paths";
|
|
24
|
+
const lines = content.split(/\r?\n/);
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const lower = trimmed.toLowerCase();
|
|
31
|
+
if (lower === "[placeholders]" || lower === "[mocks]") {
|
|
32
|
+
currentSection = "placeholders";
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (lower === "[paths]" || lower === "[files]") {
|
|
36
|
+
currentSection = "paths";
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (currentSection === "placeholders") {
|
|
40
|
+
placeholders.push(trimmed);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
ignoredPaths.push(trimmed);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { ignoredPaths, placeholders };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compiles an array of glob strings into RegExp patterns for path matching.
|
|
50
|
+
*/
|
|
51
|
+
export function compileIgnorePatterns(patterns) {
|
|
52
|
+
return patterns
|
|
53
|
+
.map((p) => p.trim())
|
|
54
|
+
.filter((p) => p.length > 0 && !p.startsWith("#"))
|
|
55
|
+
.map((p) => {
|
|
56
|
+
let pattern = p.replace(/\\/g, "/");
|
|
57
|
+
const hasLeadingSlash = pattern.startsWith("/");
|
|
58
|
+
const cleanPattern = hasLeadingSlash ? pattern.slice(1) : pattern;
|
|
59
|
+
let glob = cleanPattern;
|
|
60
|
+
if (glob.endsWith("/")) {
|
|
61
|
+
glob += "**";
|
|
62
|
+
}
|
|
63
|
+
const patternWithoutTrailingSlash = cleanPattern.endsWith("/")
|
|
64
|
+
? cleanPattern.slice(0, -1)
|
|
65
|
+
: cleanPattern;
|
|
66
|
+
const isRootRelative = hasLeadingSlash || patternWithoutTrailingSlash.includes("/");
|
|
67
|
+
// Escape regex special characters except *, ?
|
|
68
|
+
let regexStr = glob.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
69
|
+
// Handle question mark wildcard (single non-slash char)
|
|
70
|
+
regexStr = regexStr.replace(/\?/g, "[^/]");
|
|
71
|
+
// Handle glob double asterisks (arbitrary directories)
|
|
72
|
+
regexStr = regexStr.replace(/\/\*\*\//g, "/(?:.*/)?");
|
|
73
|
+
regexStr = regexStr.replace(/\*\*\//g, "(?:.*/)?");
|
|
74
|
+
regexStr = regexStr.replace(/\/\*\*/g, "(?:/.*)?");
|
|
75
|
+
regexStr = regexStr.replace(/\*\*/g, ".*");
|
|
76
|
+
// Handle glob single asterisk (within a single directory segment)
|
|
77
|
+
regexStr = regexStr.replace(/(?<!\.)\*(?!\.)/g, "[^/]*");
|
|
78
|
+
if (isRootRelative) {
|
|
79
|
+
return new RegExp(`^${regexStr}$`, "i");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return new RegExp(`(^|/)${regexStr}$`, "i");
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Checks whether a given file path matches any compiled ignore regular expression.
|
|
88
|
+
*/
|
|
89
|
+
export function shouldIgnorePath(filename, customIgnores = []) {
|
|
90
|
+
if (!filename || !customIgnores || customIgnores.length === 0) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const normalized = normalizeScanPath(filename);
|
|
94
|
+
return customIgnores.some((pattern) => pattern.test(normalized));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Searches for and loads `.secureflowignore` from the specified path or directory root.
|
|
98
|
+
* Returns the parsed configuration and compiled regex patterns, or `null` if the file doesn't exist.
|
|
99
|
+
*/
|
|
100
|
+
export function loadSecureFlowIgnore(customFilePath, rootDir = process.cwd()) {
|
|
101
|
+
const targetPath = customFilePath
|
|
102
|
+
? path.resolve(rootDir, customFilePath)
|
|
103
|
+
: path.join(rootDir, ".secureflowignore");
|
|
104
|
+
if (!fs.existsSync(targetPath)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const content = fs.readFileSync(targetPath, "utf-8");
|
|
109
|
+
const config = parseSecureFlowIgnore(content);
|
|
110
|
+
const compiledPatterns = compileIgnorePatterns(config.ignoredPaths);
|
|
111
|
+
return { config, compiledPatterns };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.warn(`⚠️ [SecureFlow] Failed to read ignore file at ${targetPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ;SACZ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,cAAc,GAA6B,OAAO,CAAC;IAEvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,cAAc,GAAG,cAAc,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,cAAc,GAAG,OAAO,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAkB;IACtD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAElE,IAAI,IAAI,GAAG,YAAY,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;QAED,MAAM,2BAA2B,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC5D,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,YAAY,CAAC;QACjB,MAAM,cAAc,GAAG,eAAe,IAAI,2BAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpF,8CAA8C;QAC9C,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAEzD,wDAAwD;QACxD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3C,uDAAuD;QACvD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAE3C,kEAAkE;QAClE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAEzD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,IAAI,MAAM,CAAC,IAAI,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,MAAM,CAAC,QAAQ,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,gBAA0B,EAAE;IAC7E,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,cAAuB,EACvB,UAAkB,OAAO,CAAC,GAAG,EAAE;IAE/B,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,kDAAkD,UAAU,KAC1D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import { GitError, getStagedFiles, readStagedContent } from "./git.js";
|
|
4
|
-
import { scanFile, formatScanResults } from "./scanner.js";
|
|
4
|
+
import { scanFile, formatScanResults, parseFailOnArg, shouldFailScan, loadSecureFlowIgnore, } from "./scanner.js";
|
|
5
5
|
import { NetworkUnavailableError, requestAiFileScan, } from "./lib/api-client.js";
|
|
6
6
|
import { hostedAiScanSkipReason } from "./lib/local-mode.js";
|
|
7
7
|
const VERBOSE = process.argv.includes("--verbose");
|
|
8
|
+
const DRY_RUN = process.argv.includes("--dry-run");
|
|
8
9
|
const AI_SKIP_REASON = hostedAiScanSkipReason(process.argv);
|
|
9
10
|
/**
|
|
10
11
|
* --local flag: keep staged code on this machine (#892).
|
|
@@ -35,9 +36,17 @@ function parseFormatArg() {
|
|
|
35
36
|
const valStr = process.argv[formatIndex + 1];
|
|
36
37
|
if (valStr) {
|
|
37
38
|
const val = valStr.toLowerCase();
|
|
38
|
-
if (val === "sarif" ||
|
|
39
|
+
if (val === "sarif" ||
|
|
40
|
+
val === "json" ||
|
|
41
|
+
val === "text" ||
|
|
42
|
+
val === "csv" ||
|
|
43
|
+
val === "html" ||
|
|
44
|
+
val === "markdown") {
|
|
39
45
|
return val;
|
|
40
46
|
}
|
|
47
|
+
if (val === "md") {
|
|
48
|
+
return "markdown";
|
|
49
|
+
}
|
|
41
50
|
}
|
|
42
51
|
}
|
|
43
52
|
return "text";
|
|
@@ -52,6 +61,21 @@ function parseOutputArg() {
|
|
|
52
61
|
}
|
|
53
62
|
return null;
|
|
54
63
|
}
|
|
64
|
+
function parseIgnoreFileArg() {
|
|
65
|
+
const idx = process.argv.findIndex((arg) => arg === "--ignore-file" || arg === "--ignore");
|
|
66
|
+
if (idx !== -1) {
|
|
67
|
+
const val = process.argv[idx + 1];
|
|
68
|
+
if (val && !val.startsWith("-")) {
|
|
69
|
+
return val;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const arg of process.argv) {
|
|
73
|
+
if (arg.startsWith("--ignore-file=")) {
|
|
74
|
+
return arg.split("=")[1];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
55
79
|
function reportSkipped(result) {
|
|
56
80
|
if (VERBOSE && result.skipped) {
|
|
57
81
|
console.log(` ↷ skipped ${result.path} (${result.skipped})`);
|
|
@@ -109,6 +133,12 @@ async function main() {
|
|
|
109
133
|
const unreadable = [];
|
|
110
134
|
const stagedForAi = [];
|
|
111
135
|
let violationCount = 0;
|
|
136
|
+
const customIgnorePath = parseIgnoreFileArg();
|
|
137
|
+
const ignoreData = loadSecureFlowIgnore(customIgnorePath);
|
|
138
|
+
const customIgnores = ignoreData?.compiledPatterns ?? [];
|
|
139
|
+
if (VERBOSE && ignoreData) {
|
|
140
|
+
console.log(`ℹ️ [SecureFlow] Loaded ${ignoreData.config.ignoredPaths.length} ignore pattern(s) from ignore configuration`);
|
|
141
|
+
}
|
|
112
142
|
if (staged.length > 0) {
|
|
113
143
|
for (const path of staged) {
|
|
114
144
|
const content = readStagedContent(path);
|
|
@@ -116,14 +146,16 @@ async function main() {
|
|
|
116
146
|
unreadable.push(path);
|
|
117
147
|
continue;
|
|
118
148
|
}
|
|
119
|
-
|
|
120
|
-
const result = scanFile(path, content);
|
|
149
|
+
const result = scanFile(path, content, customIgnores);
|
|
121
150
|
fileResults.push(result);
|
|
122
151
|
if (format === "text") {
|
|
123
152
|
reportSkipped(result);
|
|
124
153
|
reportViolations(result);
|
|
125
154
|
}
|
|
126
155
|
violationCount += result.violations.length;
|
|
156
|
+
if (!result.skipped) {
|
|
157
|
+
stagedForAi.push({ path, content });
|
|
158
|
+
}
|
|
127
159
|
}
|
|
128
160
|
}
|
|
129
161
|
// AI-powered pass, additive on top of the local scan above. Only
|
|
@@ -137,10 +169,20 @@ async function main() {
|
|
|
137
169
|
}
|
|
138
170
|
}
|
|
139
171
|
const aiViolationCount = aiFindings.filter((f) => f.severity === "HIGH" || f.severity === "CRITICAL").length;
|
|
140
|
-
if (format === "sarif" ||
|
|
172
|
+
if (format === "sarif" ||
|
|
173
|
+
format === "json" ||
|
|
174
|
+
format === "csv" ||
|
|
175
|
+
format === "html" ||
|
|
176
|
+
format === "markdown") {
|
|
141
177
|
const outputString = formatScanResults(fileResults, format);
|
|
142
178
|
if (outputPath) {
|
|
143
|
-
|
|
179
|
+
if (DRY_RUN) {
|
|
180
|
+
console.log(`[DRY RUN] Would write to ${outputPath}:
|
|
181
|
+
${outputString}`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
fs.writeFileSync(outputPath, outputString, "utf-8");
|
|
185
|
+
}
|
|
144
186
|
console.log(`📄 [SecureFlow] Scan report exported in ${format.toUpperCase()} format to ${outputPath}`);
|
|
145
187
|
}
|
|
146
188
|
else {
|
|
@@ -149,22 +191,35 @@ async function main() {
|
|
|
149
191
|
}
|
|
150
192
|
else if (outputPath) {
|
|
151
193
|
const textOutput = formatScanResults(fileResults, "text");
|
|
152
|
-
|
|
194
|
+
if (DRY_RUN) {
|
|
195
|
+
console.log(`[DRY RUN] Would write to ${outputPath}:
|
|
196
|
+
${textOutput}`);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
fs.writeFileSync(outputPath, textOutput, "utf-8");
|
|
200
|
+
}
|
|
153
201
|
console.log(`📄 [SecureFlow] Scan report written to ${outputPath}`);
|
|
154
202
|
}
|
|
155
203
|
if (unreadable.length > 0 && format === "text") {
|
|
156
204
|
console.warn(`⚠️ [SecureFlow] Could not read ${unreadable.length} staged entr${unreadable.length === 1 ? "y" : "ies"} (submodule, symlink or conflicted): ${unreadable.join(", ")}`);
|
|
157
205
|
}
|
|
158
|
-
|
|
206
|
+
const failOnThreshold = parseFailOnArg();
|
|
207
|
+
const shouldFail = shouldFailScan(violationCount, aiFindings, failOnThreshold);
|
|
208
|
+
if (shouldFail) {
|
|
159
209
|
if (format === "text") {
|
|
160
210
|
console.error(`\n❌ SecureFlow blocked this commit: ${violationCount} secret-logging violation${violationCount === 1 ? "" : "s"}${aiViolationCount > 0
|
|
161
|
-
? ` and ${aiViolationCount} AI-detected
|
|
162
|
-
: ""}. Remove the exposed secrets/env variables, then re-stage.`);
|
|
211
|
+
? ` and ${aiViolationCount} AI-detected finding${aiViolationCount === 1 ? "" : "s"}`
|
|
212
|
+
: ""}${failOnThreshold ? ` (cleared --fail-on=${failOnThreshold})` : ""}. Remove the exposed secrets/env variables, then re-stage.`);
|
|
163
213
|
}
|
|
164
214
|
return 1;
|
|
165
215
|
}
|
|
166
216
|
if (format === "text") {
|
|
167
|
-
|
|
217
|
+
if (violationCount > 0 || aiFindings.length > 0) {
|
|
218
|
+
console.log(`⚠️ SecureFlow advisory warning: findings detected below --fail-on=${failOnThreshold} threshold. Scan passing.`);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
console.log(`✅ SecureFlow scan passed (${staged.length} staged file(s)).`);
|
|
222
|
+
}
|
|
168
223
|
}
|
|
169
224
|
return 0;
|
|
170
225
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sarif.d.ts
CHANGED
|
@@ -68,8 +68,25 @@ export interface SarifDocument {
|
|
|
68
68
|
version: "2.1.0";
|
|
69
69
|
runs: SarifRun[];
|
|
70
70
|
}
|
|
71
|
+
export declare class SarifValidationError extends Error {
|
|
72
|
+
readonly errors: string[];
|
|
73
|
+
constructor(errors: string[]);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validates a document against the OASIS SARIF v2.1.0 specification and
|
|
77
|
+
* external CI/CD ingestion requirements (such as GitHub Advanced Security).
|
|
78
|
+
*/
|
|
79
|
+
export declare function validateSarifDocument(doc: unknown): {
|
|
80
|
+
valid: boolean;
|
|
81
|
+
errors: string[];
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Asserts that a document is a valid SARIF document, throwing a SarifValidationError if invalid.
|
|
85
|
+
*/
|
|
86
|
+
export declare function assertValidSarifDocument(doc: unknown): asserts doc is SarifDocument;
|
|
71
87
|
/**
|
|
72
88
|
* Maps CLI scan results into a valid OASIS SARIF v2.1.0 document object.
|
|
89
|
+
* Validates the schema before returning.
|
|
73
90
|
*/
|
|
74
91
|
export declare function generateSarifReport(scanResults: FileScanResult[], options?: {
|
|
75
92
|
toolVersion?: string;
|
package/dist/sarif.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,oBAAoB,CAAC,EAAE;QACrB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;KAC9C,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,KAAK,EAAE,wBAAwB,EAAE,CAAC;SACnC,CAAC;KACH,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/sarif.js
CHANGED
|
@@ -4,6 +4,238 @@
|
|
|
4
4
|
* Converts CLI scan results into standardized OASIS SARIF v2.1.0 schema format
|
|
5
5
|
* for direct ingestion by GitHub Advanced Security, GitLab Security Dashboards, and enterprise CI/CD systems.
|
|
6
6
|
*/
|
|
7
|
+
const VALID_LEVELS = ["error", "warning", "note", "none"];
|
|
8
|
+
export class SarifValidationError extends Error {
|
|
9
|
+
errors;
|
|
10
|
+
constructor(errors) {
|
|
11
|
+
super(`SARIF schema validation failed:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
12
|
+
this.name = "SarifValidationError";
|
|
13
|
+
this.errors = errors;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validates a document against the OASIS SARIF v2.1.0 specification and
|
|
18
|
+
* external CI/CD ingestion requirements (such as GitHub Advanced Security).
|
|
19
|
+
*/
|
|
20
|
+
export function validateSarifDocument(doc) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
|
|
23
|
+
return { valid: false, errors: ["SARIF root must be a non-null object"] };
|
|
24
|
+
}
|
|
25
|
+
const root = doc;
|
|
26
|
+
// Schema validation
|
|
27
|
+
if (typeof root.$schema !== "string" || !root.$schema.trim()) {
|
|
28
|
+
errors.push("SARIF '$schema' must be a non-empty URI string");
|
|
29
|
+
}
|
|
30
|
+
else if (!root.$schema.includes("sarif")) {
|
|
31
|
+
errors.push(`SARIF '$schema' must reference a SARIF schema (got: '${root.$schema}')`);
|
|
32
|
+
}
|
|
33
|
+
// Version validation
|
|
34
|
+
if (root.version !== "2.1.0") {
|
|
35
|
+
errors.push(`SARIF 'version' must be '2.1.0' (got: '${String(root.version)}')`);
|
|
36
|
+
}
|
|
37
|
+
// Runs validation
|
|
38
|
+
if (!Array.isArray(root.runs)) {
|
|
39
|
+
errors.push("SARIF 'runs' must be an array");
|
|
40
|
+
}
|
|
41
|
+
else if (root.runs.length === 0) {
|
|
42
|
+
errors.push("SARIF 'runs' must contain at least one run object");
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
root.runs.forEach((runItem, runIdx) => {
|
|
46
|
+
const runPath = `runs[${runIdx}]`;
|
|
47
|
+
if (!runItem || typeof runItem !== "object" || Array.isArray(runItem)) {
|
|
48
|
+
errors.push(`${runPath} must be a non-null object`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const run = runItem;
|
|
52
|
+
// Tool validation
|
|
53
|
+
if (!run.tool || typeof run.tool !== "object" || Array.isArray(run.tool)) {
|
|
54
|
+
errors.push(`${runPath}.tool must be an object`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const tool = run.tool;
|
|
58
|
+
if (!tool.driver || typeof tool.driver !== "object" || Array.isArray(tool.driver)) {
|
|
59
|
+
errors.push(`${runPath}.tool.driver must be an object`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const driver = tool.driver;
|
|
63
|
+
if (typeof driver.name !== "string" || !driver.name.trim()) {
|
|
64
|
+
errors.push(`${runPath}.tool.driver.name must be a non-empty string`);
|
|
65
|
+
}
|
|
66
|
+
if (driver.semanticVersion !== undefined && typeof driver.semanticVersion !== "string") {
|
|
67
|
+
errors.push(`${runPath}.tool.driver.semanticVersion must be a string if provided`);
|
|
68
|
+
}
|
|
69
|
+
if (driver.informationUri !== undefined &&
|
|
70
|
+
(typeof driver.informationUri !== "string" || !driver.informationUri.trim())) {
|
|
71
|
+
errors.push(`${runPath}.tool.driver.informationUri must be a valid URI string if provided`);
|
|
72
|
+
}
|
|
73
|
+
if (driver.rules !== undefined) {
|
|
74
|
+
if (!Array.isArray(driver.rules)) {
|
|
75
|
+
errors.push(`${runPath}.tool.driver.rules must be an array`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
driver.rules.forEach((ruleItem, ruleIdx) => {
|
|
79
|
+
const rulePath = `${runPath}.tool.driver.rules[${ruleIdx}]`;
|
|
80
|
+
if (!ruleItem || typeof ruleItem !== "object" || Array.isArray(ruleItem)) {
|
|
81
|
+
errors.push(`${rulePath} must be an object`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const rule = ruleItem;
|
|
85
|
+
if (typeof rule.id !== "string" || !rule.id.trim()) {
|
|
86
|
+
errors.push(`${rulePath}.id must be a non-empty string`);
|
|
87
|
+
}
|
|
88
|
+
if (rule.name !== undefined && typeof rule.name !== "string") {
|
|
89
|
+
errors.push(`${rulePath}.name must be a string`);
|
|
90
|
+
}
|
|
91
|
+
if (!rule.shortDescription ||
|
|
92
|
+
typeof rule.shortDescription !== "object" ||
|
|
93
|
+
typeof rule.shortDescription.text !== "string" ||
|
|
94
|
+
!rule.shortDescription.text.trim()) {
|
|
95
|
+
errors.push(`${rulePath}.shortDescription.text must be a non-empty string`);
|
|
96
|
+
}
|
|
97
|
+
if (rule.defaultConfiguration !== undefined) {
|
|
98
|
+
if (typeof rule.defaultConfiguration !== "object" ||
|
|
99
|
+
!rule.defaultConfiguration) {
|
|
100
|
+
errors.push(`${rulePath}.defaultConfiguration must be an object`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const config = rule.defaultConfiguration;
|
|
104
|
+
if (config.level !== undefined &&
|
|
105
|
+
!VALID_LEVELS.includes(config.level)) {
|
|
106
|
+
errors.push(`${rulePath}.defaultConfiguration.level must be one of 'error' | 'warning' | 'note' | 'none'`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Results validation
|
|
116
|
+
if (!Array.isArray(run.results)) {
|
|
117
|
+
errors.push(`${runPath}.results must be an array`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const driverRules = run.tool?.driver
|
|
121
|
+
? run.tool.driver
|
|
122
|
+
?.rules
|
|
123
|
+
: undefined;
|
|
124
|
+
run.results.forEach((resItem, resIdx) => {
|
|
125
|
+
const resPath = `${runPath}.results[${resIdx}]`;
|
|
126
|
+
if (!resItem || typeof resItem !== "object" || Array.isArray(resItem)) {
|
|
127
|
+
errors.push(`${resPath} must be an object`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const res = resItem;
|
|
131
|
+
if (typeof res.ruleId !== "string" || !res.ruleId.trim()) {
|
|
132
|
+
errors.push(`${resPath}.ruleId must be a non-empty string`);
|
|
133
|
+
}
|
|
134
|
+
if (res.level !== undefined &&
|
|
135
|
+
!VALID_LEVELS.includes(res.level)) {
|
|
136
|
+
errors.push(`${resPath}.level must be one of 'error' | 'warning' | 'note' | 'none'`);
|
|
137
|
+
}
|
|
138
|
+
if (!res.message ||
|
|
139
|
+
typeof res.message !== "object" ||
|
|
140
|
+
typeof res.message.text !== "string" ||
|
|
141
|
+
!res.message.text.trim()) {
|
|
142
|
+
errors.push(`${resPath}.message.text must be a non-empty string`);
|
|
143
|
+
}
|
|
144
|
+
if (res.ruleIndex !== undefined) {
|
|
145
|
+
if (typeof res.ruleIndex !== "number" ||
|
|
146
|
+
!Number.isInteger(res.ruleIndex) ||
|
|
147
|
+
res.ruleIndex < 0) {
|
|
148
|
+
errors.push(`${resPath}.ruleIndex must be a non-negative integer`);
|
|
149
|
+
}
|
|
150
|
+
else if (Array.isArray(driverRules)) {
|
|
151
|
+
if (res.ruleIndex >= driverRules.length) {
|
|
152
|
+
errors.push(`${resPath}.ruleIndex (${res.ruleIndex}) is out of bounds for rules array of length ${driverRules.length}`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const targetRule = driverRules[res.ruleIndex];
|
|
156
|
+
if (targetRule && targetRule.id !== res.ruleId) {
|
|
157
|
+
errors.push(`${resPath}.ruleIndex (${res.ruleIndex}) points to rule id '${String(targetRule.id)}' which does not match result ruleId '${res.ruleId}'`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (res.locations !== undefined) {
|
|
163
|
+
if (!Array.isArray(res.locations)) {
|
|
164
|
+
errors.push(`${resPath}.locations must be an array`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
res.locations.forEach((locItem, locIdx) => {
|
|
168
|
+
const locPath = `${resPath}.locations[${locIdx}]`;
|
|
169
|
+
if (!locItem || typeof locItem !== "object" || Array.isArray(locItem)) {
|
|
170
|
+
errors.push(`${locPath} must be an object`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const loc = locItem;
|
|
174
|
+
if (!loc.physicalLocation ||
|
|
175
|
+
typeof loc.physicalLocation !== "object" ||
|
|
176
|
+
Array.isArray(loc.physicalLocation)) {
|
|
177
|
+
errors.push(`${locPath}.physicalLocation must be an object`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const phys = loc.physicalLocation;
|
|
181
|
+
if (!phys.artifactLocation ||
|
|
182
|
+
typeof phys.artifactLocation !== "object" ||
|
|
183
|
+
typeof phys.artifactLocation.uri !== "string" ||
|
|
184
|
+
!phys.artifactLocation.uri.trim()) {
|
|
185
|
+
errors.push(`${locPath}.physicalLocation.artifactLocation.uri must be a non-empty string`);
|
|
186
|
+
}
|
|
187
|
+
else if (phys.artifactLocation.uri.includes("\\")) {
|
|
188
|
+
errors.push(`${locPath}.physicalLocation.artifactLocation.uri must use forward slashes (no Windows backslashes)`);
|
|
189
|
+
}
|
|
190
|
+
if (!phys.region ||
|
|
191
|
+
typeof phys.region !== "object" ||
|
|
192
|
+
Array.isArray(phys.region)) {
|
|
193
|
+
errors.push(`${locPath}.physicalLocation.region must be an object`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const reg = phys.region;
|
|
197
|
+
if (typeof reg.startLine !== "number" ||
|
|
198
|
+
!Number.isInteger(reg.startLine) ||
|
|
199
|
+
reg.startLine < 1) {
|
|
200
|
+
errors.push(`${locPath}.physicalLocation.region.startLine must be an integer >= 1`);
|
|
201
|
+
}
|
|
202
|
+
if (reg.startColumn !== undefined &&
|
|
203
|
+
(typeof reg.startColumn !== "number" ||
|
|
204
|
+
!Number.isInteger(reg.startColumn) ||
|
|
205
|
+
reg.startColumn < 1)) {
|
|
206
|
+
errors.push(`${locPath}.physicalLocation.region.startColumn must be an integer >= 1`);
|
|
207
|
+
}
|
|
208
|
+
if (reg.endLine !== undefined &&
|
|
209
|
+
(typeof reg.endLine !== "number" ||
|
|
210
|
+
!Number.isInteger(reg.endLine) ||
|
|
211
|
+
reg.endLine < (typeof reg.startLine === "number" ? reg.startLine : 1))) {
|
|
212
|
+
errors.push(`${locPath}.physicalLocation.region.endLine must be an integer >= startLine`);
|
|
213
|
+
}
|
|
214
|
+
if (reg.endColumn !== undefined &&
|
|
215
|
+
(typeof reg.endColumn !== "number" ||
|
|
216
|
+
!Number.isInteger(reg.endColumn) ||
|
|
217
|
+
reg.endColumn < 1)) {
|
|
218
|
+
errors.push(`${locPath}.physicalLocation.region.endColumn must be an integer >= 1`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return { valid: errors.length === 0, errors };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Asserts that a document is a valid SARIF document, throwing a SarifValidationError if invalid.
|
|
232
|
+
*/
|
|
233
|
+
export function assertValidSarifDocument(doc) {
|
|
234
|
+
const result = validateSarifDocument(doc);
|
|
235
|
+
if (!result.valid) {
|
|
236
|
+
throw new SarifValidationError(result.errors);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
7
239
|
const DEFAULT_RULE_DEFINITIONS = {
|
|
8
240
|
"environment variable": {
|
|
9
241
|
id: "SECUREFLOW-001",
|
|
@@ -47,6 +279,7 @@ const DEFAULT_RULE_DEFINITIONS = {
|
|
|
47
279
|
};
|
|
48
280
|
/**
|
|
49
281
|
* Maps CLI scan results into a valid OASIS SARIF v2.1.0 document object.
|
|
282
|
+
* Validates the schema before returning.
|
|
50
283
|
*/
|
|
51
284
|
export function generateSarifReport(scanResults, options) {
|
|
52
285
|
const version = options?.toolVersion || "0.1.0";
|
|
@@ -107,7 +340,7 @@ export function generateSarifReport(scanResults, options) {
|
|
|
107
340
|
// Appended `!` to override 'undefined' error resulting from Record<string, ...> signature
|
|
108
341
|
rulesArray.push(DEFAULT_RULE_DEFINITIONS["generic-secret-logging"]);
|
|
109
342
|
}
|
|
110
|
-
|
|
343
|
+
const sarifDoc = {
|
|
111
344
|
$schema: "https://json.schemastore.org/sarif-2.1.0.json",
|
|
112
345
|
version: "2.1.0",
|
|
113
346
|
runs: [
|
|
@@ -124,6 +357,8 @@ export function generateSarifReport(scanResults, options) {
|
|
|
124
357
|
},
|
|
125
358
|
],
|
|
126
359
|
};
|
|
360
|
+
assertValidSarifDocument(sarifDoc);
|
|
361
|
+
return sarifDoc;
|
|
127
362
|
}
|
|
128
363
|
/**
|
|
129
364
|
* Format SARIF report as pretty JSON string.
|
package/dist/sarif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* the part that decides whether a commit is blocked can actually be tested
|
|
7
7
|
* (#593).
|
|
8
8
|
*/
|
|
9
|
+
import { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, type SecureFlowIgnoreConfig } from "./ignore.js";
|
|
10
|
+
export { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, type SecureFlowIgnoreConfig, };
|
|
9
11
|
/** One flagged call site. */
|
|
10
12
|
export interface Violation {
|
|
11
13
|
/** 1-based line of the `console.*` call. */
|
|
@@ -23,7 +25,7 @@ export interface Violation {
|
|
|
23
25
|
*/
|
|
24
26
|
export declare const MAX_SCANNED_BYTES: number;
|
|
25
27
|
/** Whether `path` should be scanned at all. */
|
|
26
|
-
export declare function shouldScanFile(path: string, byteLength?: number): boolean;
|
|
28
|
+
export declare function shouldScanFile(path: string, byteLength?: number, customIgnores?: RegExp[]): boolean;
|
|
27
29
|
/**
|
|
28
30
|
* Heuristic for content that is binary despite its name.
|
|
29
31
|
*
|
|
@@ -84,10 +86,24 @@ export interface FileScanResult {
|
|
|
84
86
|
skipped?: string;
|
|
85
87
|
}
|
|
86
88
|
/** Scan one staged blob. */
|
|
87
|
-
export declare function scanFile(path: string, content: string): FileScanResult;
|
|
88
|
-
export type OutputFormat = "text" | "json" | "sarif" | "csv" | "html";
|
|
89
|
+
export declare function scanFile(path: string, content: string, customIgnores?: RegExp[]): FileScanResult;
|
|
90
|
+
export type OutputFormat = "text" | "json" | "sarif" | "csv" | "html" | "markdown";
|
|
89
91
|
/**
|
|
90
|
-
* Format scan results based on the chosen output format ('text' | 'json' | 'sarif' | 'csv' | 'html').
|
|
92
|
+
* Format scan results based on the chosen output format ('text' | 'json' | 'sarif' | 'csv' | 'html' | 'markdown').
|
|
91
93
|
*/
|
|
92
94
|
export declare function formatScanResults(results: FileScanResult[], format?: OutputFormat): string;
|
|
95
|
+
export type FailOnSeverity = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" | "NONE";
|
|
96
|
+
export declare function isValidFailOnSeverity(val: string): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Parses `--fail-on=<SEVERITY>` or `--fail-on <SEVERITY>` command line argument.
|
|
99
|
+
*/
|
|
100
|
+
export declare function parseFailOnArg(args?: string[]): FailOnSeverity | null;
|
|
101
|
+
/**
|
|
102
|
+
* Determines whether a scan should return non-zero exit code based on the failOnThreshold.
|
|
103
|
+
*
|
|
104
|
+
* Local secret logging violations are treated as HIGH severity (rank 3).
|
|
105
|
+
*/
|
|
106
|
+
export declare function shouldFailScan(localViolationCount: number, aiFindings: {
|
|
107
|
+
severity: string;
|
|
108
|
+
}[], failOnThreshold?: FailOnSeverity | null): boolean;
|
|
93
109
|
//# sourceMappingURL=scanner.d.ts.map
|
package/dist/scanner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAwFD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAa,CAAC;AAE5C,+CAA+C;AAC/C,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAWT;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4EzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjF;AAED,uCAAuC;AACvC,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA2B7D;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4BAA4B;AAC5B,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,cAAc,CAchB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EAAE,EACzB,MAAM,GAAE,YAAqB,GAC5B,MAAM,CA+BR;AAMD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAU7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,cAAc,GAAG,IAAI,CAgBnF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EAClC,eAAe,GAAE,cAAc,GAAG,IAAW,GAC5C,OAAO,CAwBT"}
|
package/dist/scanner.js
CHANGED
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* (#593).
|
|
8
8
|
*/
|
|
9
9
|
import { formatSarifJson } from "./sarif.js";
|
|
10
|
-
import { formatCsv, formatHtml } from "./exporters.js";
|
|
10
|
+
import { formatCsv, formatHtml, formatMarkdown } from "./exporters.js";
|
|
11
|
+
import { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, } from "./ignore.js";
|
|
12
|
+
export { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, };
|
|
11
13
|
/** Console methods that put their arguments somewhere durable. */
|
|
12
14
|
const CONSOLE_METHODS = ["log", "info", "warn", "error", "debug", "trace", "table", "dir"];
|
|
13
15
|
/**
|
|
@@ -97,7 +99,9 @@ const GENERATED_FILES = [
|
|
|
97
99
|
*/
|
|
98
100
|
export const MAX_SCANNED_BYTES = 512 * 1024;
|
|
99
101
|
/** Whether `path` should be scanned at all. */
|
|
100
|
-
export function shouldScanFile(path, byteLength) {
|
|
102
|
+
export function shouldScanFile(path, byteLength, customIgnores) {
|
|
103
|
+
if (customIgnores && shouldIgnorePath(path, customIgnores))
|
|
104
|
+
return false;
|
|
101
105
|
const lower = path.toLowerCase();
|
|
102
106
|
const basename = lower.split("/").pop() ?? lower;
|
|
103
107
|
if (GENERATED_FILES.some((name) => basename === name.toLowerCase()))
|
|
@@ -279,7 +283,10 @@ export function findSecretLogging(source) {
|
|
|
279
283
|
return violations;
|
|
280
284
|
}
|
|
281
285
|
/** Scan one staged blob. */
|
|
282
|
-
export function scanFile(path, content) {
|
|
286
|
+
export function scanFile(path, content, customIgnores) {
|
|
287
|
+
if (customIgnores && shouldIgnorePath(path, customIgnores)) {
|
|
288
|
+
return { path, violations: [], skipped: "matched .secureflowignore" };
|
|
289
|
+
}
|
|
283
290
|
if (!shouldScanFile(path, Buffer.byteLength(content, "utf-8"))) {
|
|
284
291
|
return { path, violations: [], skipped: "excluded by type or size" };
|
|
285
292
|
}
|
|
@@ -289,7 +296,7 @@ export function scanFile(path, content) {
|
|
|
289
296
|
return { path, violations: findSecretLogging(content) };
|
|
290
297
|
}
|
|
291
298
|
/**
|
|
292
|
-
* Format scan results based on the chosen output format ('text' | 'json' | 'sarif' | 'csv' | 'html').
|
|
299
|
+
* Format scan results based on the chosen output format ('text' | 'json' | 'sarif' | 'csv' | 'html' | 'markdown').
|
|
293
300
|
*/
|
|
294
301
|
export function formatScanResults(results, format = "text") {
|
|
295
302
|
if (format === "json") {
|
|
@@ -304,6 +311,9 @@ export function formatScanResults(results, format = "text") {
|
|
|
304
311
|
if (format === "html") {
|
|
305
312
|
return formatHtml(results);
|
|
306
313
|
}
|
|
314
|
+
if (format === "markdown") {
|
|
315
|
+
return formatMarkdown(results);
|
|
316
|
+
}
|
|
307
317
|
// Default text summary
|
|
308
318
|
let text = "";
|
|
309
319
|
for (const r of results) {
|
|
@@ -315,4 +325,61 @@ export function formatScanResults(results, format = "text") {
|
|
|
315
325
|
}
|
|
316
326
|
return text;
|
|
317
327
|
}
|
|
328
|
+
const SEVERITY_RANK = {
|
|
329
|
+
CRITICAL: 4,
|
|
330
|
+
HIGH: 3,
|
|
331
|
+
MEDIUM: 2,
|
|
332
|
+
LOW: 1,
|
|
333
|
+
NONE: 0,
|
|
334
|
+
};
|
|
335
|
+
export function isValidFailOnSeverity(val) {
|
|
336
|
+
return ["CRITICAL", "HIGH", "MEDIUM", "LOW", "NONE"].includes(val.toUpperCase());
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Parses `--fail-on=<SEVERITY>` or `--fail-on <SEVERITY>` command line argument.
|
|
340
|
+
*/
|
|
341
|
+
export function parseFailOnArg(args = process.argv) {
|
|
342
|
+
for (let i = 0; i < args.length; i++) {
|
|
343
|
+
const arg = args[i];
|
|
344
|
+
if (!arg)
|
|
345
|
+
continue;
|
|
346
|
+
if (arg.startsWith("--fail-on=")) {
|
|
347
|
+
const parts = arg.split("=");
|
|
348
|
+
const val = parts[1]?.toUpperCase();
|
|
349
|
+
if (val && isValidFailOnSeverity(val))
|
|
350
|
+
return val;
|
|
351
|
+
}
|
|
352
|
+
if (arg === "--fail-on" && i + 1 < args.length) {
|
|
353
|
+
const nextArg = args[i + 1];
|
|
354
|
+
const val = nextArg?.toUpperCase();
|
|
355
|
+
if (val && isValidFailOnSeverity(val))
|
|
356
|
+
return val;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Determines whether a scan should return non-zero exit code based on the failOnThreshold.
|
|
363
|
+
*
|
|
364
|
+
* Local secret logging violations are treated as HIGH severity (rank 3).
|
|
365
|
+
*/
|
|
366
|
+
export function shouldFailScan(localViolationCount, aiFindings, failOnThreshold = null) {
|
|
367
|
+
if (failOnThreshold === null) {
|
|
368
|
+
const aiHighOrCritical = aiFindings.filter((f) => f.severity === "HIGH" || f.severity === "CRITICAL").length;
|
|
369
|
+
return localViolationCount > 0 || aiHighOrCritical > 0;
|
|
370
|
+
}
|
|
371
|
+
const thresholdRank = SEVERITY_RANK[failOnThreshold];
|
|
372
|
+
// Local secret-logging violations are treated as HIGH severity (rank 3)
|
|
373
|
+
if (localViolationCount > 0 && SEVERITY_RANK["HIGH"] >= thresholdRank) {
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
for (const finding of aiFindings) {
|
|
377
|
+
const findingSev = finding.severity?.toUpperCase() || "LOW";
|
|
378
|
+
const rank = SEVERITY_RANK[findingSev] ?? 1;
|
|
379
|
+
if (rank >= thresholdRank) {
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
318
385
|
//# sourceMappingURL=scanner.js.map
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|