scanoss 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/build/main/cli/commands/scan.js +34 -35
- package/build/main/sdk/Dependencies/LocalDependency/LocalDependency.js +3 -1
- package/build/main/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +49 -15
- package/build/main/sdk/Dependencies/LocalDependency/parsers/pyParser.d.ts +1 -0
- package/build/main/sdk/Dependencies/LocalDependency/parsers/pyParser.js +21 -1
- package/build/main/sdk/Dependencies/LocalDependency/parsers/python/PyProjectToml.js +7 -4
- package/build/main/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
- package/build/main/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
- package/build/main/sdk/scanner/ScanSettingsBuilder.js +51 -3
- package/build/main/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
- package/build/main/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
- package/build/main/sdk/scanner/Scannable/ScannableItem.js +8 -1
- package/build/main/sdk/scanner/Scanner.d.ts +1 -0
- package/build/main/sdk/scanner/Scanner.js +31 -18
- package/build/main/sdk/scanner/ScannerCfg.d.ts +2 -0
- package/build/main/sdk/scanner/ScannerCfg.js +1 -1
- package/build/main/sdk/scanner/ScannerTypes.d.ts +3 -0
- package/build/main/sdk/scanner/ScannerTypes.js +1 -1
- package/build/main/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
- package/build/main/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +3 -2
- package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
- package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +313 -0
- package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
- package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/module/cli/commands/scan.js +32 -33
- package/build/module/sdk/Dependencies/LocalDependency/LocalDependency.js +4 -2
- package/build/module/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +50 -16
- package/build/module/sdk/Dependencies/LocalDependency/parsers/pyParser.d.ts +1 -0
- package/build/module/sdk/Dependencies/LocalDependency/parsers/pyParser.js +19 -1
- package/build/module/sdk/Dependencies/LocalDependency/parsers/python/PyProjectToml.js +7 -4
- package/build/module/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
- package/build/module/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
- package/build/module/sdk/scanner/ScanSettingsBuilder.js +46 -3
- package/build/module/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
- package/build/module/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
- package/build/module/sdk/scanner/Scannable/ScannableItem.js +9 -1
- package/build/module/sdk/scanner/Scanner.d.ts +1 -0
- package/build/module/sdk/scanner/Scanner.js +27 -15
- package/build/module/sdk/scanner/ScannerCfg.d.ts +2 -0
- package/build/module/sdk/scanner/ScannerCfg.js +2 -1
- package/build/module/sdk/scanner/ScannerTypes.d.ts +3 -0
- package/build/module/sdk/scanner/ScannerTypes.js +1 -1
- package/build/module/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
- package/build/module/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +2 -2
- package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
- package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +306 -0
- package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
- package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2025, SCANOSS
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const COMPLETE_DOCSTRING_QUOTE_COUNT = 2;
|
|
5
|
+
const LICENSE_HEADER_MAX_LINES = 50;
|
|
6
|
+
const COMMENT_PATTERNS = {
|
|
7
|
+
c_style: {
|
|
8
|
+
single_line: String.raw `^\s*//.*$`,
|
|
9
|
+
multi_start: String.raw `^\s*/\*`,
|
|
10
|
+
multi_end: String.raw `\*/\s*$`,
|
|
11
|
+
multi_single: String.raw `^\s*/\*.*\*/\s*$`,
|
|
12
|
+
},
|
|
13
|
+
python_style: {
|
|
14
|
+
single_line: String.raw `^\s*#.*$`,
|
|
15
|
+
doc_string_start: String.raw `^\s*"""`,
|
|
16
|
+
doc_string_end: String.raw `"""\s*$`,
|
|
17
|
+
},
|
|
18
|
+
lua_style: {
|
|
19
|
+
single_line: String.raw `^\s*--.*$`,
|
|
20
|
+
multi_start: String.raw `^\s*--\[\[`,
|
|
21
|
+
multi_end: String.raw `\]\]\s*$`,
|
|
22
|
+
},
|
|
23
|
+
html_style: {
|
|
24
|
+
multi_start: String.raw `^\s*<!--`,
|
|
25
|
+
multi_end: String.raw `-->\s*$`,
|
|
26
|
+
multi_single: String.raw `^\s*<!--.*-->\s*$`,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
const IMPORT_PATTERNS = {
|
|
30
|
+
python: [String.raw `^\s*import\s+`, String.raw `^\s*from\s+.*\s+import\s+`],
|
|
31
|
+
javascript: [
|
|
32
|
+
String.raw `^\s*import\s+.*\s+from\s+`,
|
|
33
|
+
String.raw `^\s*import\s+['"]`,
|
|
34
|
+
String.raw `^\s*import\s+type\s+`,
|
|
35
|
+
String.raw `^\s*export\s+\*\s+from\s+`,
|
|
36
|
+
String.raw `^\s*export\s+\{.*\}\s+from\s+`,
|
|
37
|
+
String.raw `^\s*const\s+.*\s*=\s*require\(`,
|
|
38
|
+
String.raw `^\s*var\s+.*\s*=\s*require\(`,
|
|
39
|
+
String.raw `^\s*let\s+.*\s*=\s*require\(`,
|
|
40
|
+
],
|
|
41
|
+
typescript: [
|
|
42
|
+
String.raw `^\s*import\s+`,
|
|
43
|
+
String.raw `^\s*export\s+.*\s+from\s+`,
|
|
44
|
+
String.raw `^\s*import\s+type\s+`,
|
|
45
|
+
String.raw `^\s*import\s+\{.*\}\s+from\s+`,
|
|
46
|
+
],
|
|
47
|
+
java: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
|
|
48
|
+
kotlin: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
|
|
49
|
+
scala: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
|
|
50
|
+
go: [
|
|
51
|
+
String.raw `^\s*import\s+\(`,
|
|
52
|
+
String.raw `^\s*import\s+"`,
|
|
53
|
+
String.raw `^\s*package\s+`,
|
|
54
|
+
String.raw `^\s*"[^"]*"\s*$`,
|
|
55
|
+
String.raw `^\s*[a-zA-Z_][a-zA-Z0-9_]*\s+"[^"]*"\s*$`,
|
|
56
|
+
String.raw `^\s*_\s+"[^"]*"\s*$`,
|
|
57
|
+
],
|
|
58
|
+
rust: [String.raw `^\s*use\s+`, String.raw `^\s*extern\s+crate\s+`, String.raw `^\s*mod\s+`],
|
|
59
|
+
cpp: [
|
|
60
|
+
String.raw `^\s*#include\s+`,
|
|
61
|
+
String.raw `^\s*#pragma\s+`,
|
|
62
|
+
String.raw `^\s*#ifndef\s+.*_H.*`,
|
|
63
|
+
String.raw `^\s*#define\s+.*_H.*`,
|
|
64
|
+
String.raw `^\s*#endif\s+(//.*)?\s*$`,
|
|
65
|
+
],
|
|
66
|
+
csharp: [String.raw `^\s*using\s+`, String.raw `^\s*namespace\s+`],
|
|
67
|
+
php: [
|
|
68
|
+
String.raw `^\s*use\s+`,
|
|
69
|
+
String.raw `^\s*require\s+`,
|
|
70
|
+
String.raw `^\s*require_once\s+`,
|
|
71
|
+
String.raw `^\s*include\s+`,
|
|
72
|
+
String.raw `^\s*include_once\s+`,
|
|
73
|
+
String.raw `^\s*namespace\s+`,
|
|
74
|
+
],
|
|
75
|
+
swift: [String.raw `^\s*import\s+`],
|
|
76
|
+
ruby: [String.raw `^\s*require\s+`, String.raw `^\s*require_relative\s+`, String.raw `^\s*load\s+`],
|
|
77
|
+
perl: [String.raw `^\s*use\s+`, String.raw `^\s*require\s+`],
|
|
78
|
+
r: [String.raw `^\s*library\(`, String.raw `^\s*require\(`, String.raw `^\s*source\(`],
|
|
79
|
+
lua: [String.raw `^\s*require\s+`, String.raw `^\s*local\s+.*\s*=\s*require\(`],
|
|
80
|
+
dart: [String.raw `^\s*import\s+`, String.raw `^\s*export\s+`, String.raw `^\s*part\s+`],
|
|
81
|
+
haskell: [String.raw `^\s*import\s+`, String.raw `^\s*module\s+`],
|
|
82
|
+
elixir: [
|
|
83
|
+
String.raw `^\s*import\s+`,
|
|
84
|
+
String.raw `^\s*alias\s+`,
|
|
85
|
+
String.raw `^\s*require\s+`,
|
|
86
|
+
String.raw `^\s*use\s+`,
|
|
87
|
+
],
|
|
88
|
+
clojure: [
|
|
89
|
+
String.raw `^\s*\(\s*ns\s+`,
|
|
90
|
+
String.raw `^\s*\(\s*require\s+`,
|
|
91
|
+
String.raw `^\s*\(\s*import\s+`,
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
const LICENSE_KEYWORDS = [
|
|
95
|
+
'copyright', 'license', 'licensed', 'all rights reserved',
|
|
96
|
+
'permission', 'redistribution', 'warranty', 'liability',
|
|
97
|
+
'apache', 'mit', 'gpl', 'bsd', 'mozilla', 'author:',
|
|
98
|
+
'spdx-license', 'contributors', 'licensee',
|
|
99
|
+
];
|
|
100
|
+
const EXT_MAP = {
|
|
101
|
+
'.py': 'python', '.js': 'javascript', '.mjs': 'javascript',
|
|
102
|
+
'.cjs': 'javascript', '.ts': 'typescript', '.tsx': 'typescript',
|
|
103
|
+
'.jsx': 'javascript', '.java': 'java', '.kt': 'kotlin',
|
|
104
|
+
'.kts': 'kotlin', '.scala': 'scala', '.sc': 'scala',
|
|
105
|
+
'.go': 'go', '.rs': 'rust', '.cpp': 'cpp', '.cc': 'cpp',
|
|
106
|
+
'.cxx': 'cpp', '.c': 'cpp', '.h': 'cpp', '.hpp': 'cpp',
|
|
107
|
+
'.hxx': 'cpp', '.cs': 'csharp', '.php': 'php', '.swift': 'swift',
|
|
108
|
+
'.rb': 'ruby', '.pl': 'perl', '.pm': 'perl', '.r': 'r', '.R': 'r',
|
|
109
|
+
'.lua': 'lua', '.dart': 'dart', '.hs': 'haskell', '.ex': 'elixir',
|
|
110
|
+
'.exs': 'elixir', '.clj': 'clojure', '.cljs': 'clojure',
|
|
111
|
+
'.m': 'cpp', '.mm': 'cpp', '.sh': 'python', '.bash': 'python',
|
|
112
|
+
'.zsh': 'python', '.fish': 'python',
|
|
113
|
+
};
|
|
114
|
+
function isBlankLine(stripped) {
|
|
115
|
+
return stripped.length === 0;
|
|
116
|
+
}
|
|
117
|
+
function isShebang(stripped) {
|
|
118
|
+
return stripped.startsWith('#!');
|
|
119
|
+
}
|
|
120
|
+
export class HeaderFilter {
|
|
121
|
+
maxLines;
|
|
122
|
+
constructor(skipLimit) {
|
|
123
|
+
this.maxLines = skipLimit != null && skipLimit > 0 ? skipLimit : null;
|
|
124
|
+
}
|
|
125
|
+
filter(file, decodedContents) {
|
|
126
|
+
if (!decodedContents || !file) {
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
const language = this.detectLanguage(file);
|
|
130
|
+
if (!language) {
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
const lines = decodedContents.split(/\r?\n/);
|
|
134
|
+
if (lines.length === 0) {
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
const implementationStart = this.findFirstImplementationLine(lines, language);
|
|
138
|
+
if (implementationStart === null) {
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
let lineOffset = implementationStart - 1;
|
|
142
|
+
if (this.maxLines !== null && this.maxLines > 0 && this.maxLines < lineOffset) {
|
|
143
|
+
lineOffset = this.maxLines;
|
|
144
|
+
}
|
|
145
|
+
return lineOffset;
|
|
146
|
+
}
|
|
147
|
+
detectLanguage(filePath) {
|
|
148
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
149
|
+
if (!ext)
|
|
150
|
+
return null;
|
|
151
|
+
return EXT_MAP[ext] || null;
|
|
152
|
+
}
|
|
153
|
+
getCommentStyle(language) {
|
|
154
|
+
const cStyleLanguages = [
|
|
155
|
+
'cpp', 'java', 'kotlin', 'scala', 'javascript', 'typescript',
|
|
156
|
+
'go', 'rust', 'csharp', 'php', 'swift', 'dart',
|
|
157
|
+
];
|
|
158
|
+
const pythonStyleLanguages = ['python', 'ruby', 'perl', 'r'];
|
|
159
|
+
const luaStyleLanguages = ['lua', 'haskell'];
|
|
160
|
+
if (cStyleLanguages.includes(language))
|
|
161
|
+
return 'c_style';
|
|
162
|
+
if (pythonStyleLanguages.includes(language))
|
|
163
|
+
return 'python_style';
|
|
164
|
+
if (luaStyleLanguages.includes(language))
|
|
165
|
+
return 'lua_style';
|
|
166
|
+
return 'c_style';
|
|
167
|
+
}
|
|
168
|
+
isLicenseHeader(line) {
|
|
169
|
+
const lineLower = line.toLowerCase();
|
|
170
|
+
return LICENSE_KEYWORDS.some(keyword => lineLower.includes(keyword));
|
|
171
|
+
}
|
|
172
|
+
isComment(line, inMultiline, patterns) {
|
|
173
|
+
if (!patterns)
|
|
174
|
+
return [false, inMultiline];
|
|
175
|
+
if (inMultiline) {
|
|
176
|
+
if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
|
|
177
|
+
return [true, false];
|
|
178
|
+
}
|
|
179
|
+
if (patterns.doc_string_end && new RegExp(patterns.doc_string_end).test(line)) {
|
|
180
|
+
return [true, false];
|
|
181
|
+
}
|
|
182
|
+
return [true, true];
|
|
183
|
+
}
|
|
184
|
+
if (patterns.single_line && new RegExp(patterns.single_line).test(line)) {
|
|
185
|
+
return [true, false];
|
|
186
|
+
}
|
|
187
|
+
if (patterns.multi_single && new RegExp(patterns.multi_single).test(line)) {
|
|
188
|
+
return [true, false];
|
|
189
|
+
}
|
|
190
|
+
if (patterns.multi_start && new RegExp(patterns.multi_start).test(line)) {
|
|
191
|
+
if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
|
|
192
|
+
return [true, false];
|
|
193
|
+
}
|
|
194
|
+
return [true, true];
|
|
195
|
+
}
|
|
196
|
+
if (patterns.doc_string_start && line.includes('"""')) {
|
|
197
|
+
const count = (line.match(/"""/g) || []).length;
|
|
198
|
+
if (count === COMPLETE_DOCSTRING_QUOTE_COUNT) {
|
|
199
|
+
return [true, false];
|
|
200
|
+
}
|
|
201
|
+
if (count === 1) {
|
|
202
|
+
return [true, true];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return [false, inMultiline];
|
|
206
|
+
}
|
|
207
|
+
isImport(line, patterns) {
|
|
208
|
+
if (!patterns)
|
|
209
|
+
return false;
|
|
210
|
+
return patterns.some(pattern => new RegExp(pattern).test(line));
|
|
211
|
+
}
|
|
212
|
+
findFirstImplementationLine(lines, language) {
|
|
213
|
+
if (!lines.length || !language)
|
|
214
|
+
return null;
|
|
215
|
+
let inMultilineComment = false;
|
|
216
|
+
let inLicenseSection = false;
|
|
217
|
+
let inImportBlock = false;
|
|
218
|
+
let consecutiveImportsCount = 0;
|
|
219
|
+
const commentStyle = this.getCommentStyle(language);
|
|
220
|
+
const commentPatterns = COMMENT_PATTERNS[commentStyle];
|
|
221
|
+
const importPatterns = IMPORT_PATTERNS[language];
|
|
222
|
+
for (let i = 0; i < lines.length; i++) {
|
|
223
|
+
const lineNumber = i + 1;
|
|
224
|
+
const stripped = lines[i].trim();
|
|
225
|
+
if ((i === 0 && isShebang(stripped)) || isBlankLine(stripped)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const [isAComment, stillInMultiline] = this.isComment(lines[i], inMultilineComment, commentPatterns);
|
|
229
|
+
inMultilineComment = stillInMultiline;
|
|
230
|
+
if (isAComment) {
|
|
231
|
+
if (this.isLicenseHeader(lines[i])) {
|
|
232
|
+
inLicenseSection = true;
|
|
233
|
+
}
|
|
234
|
+
else if (inLicenseSection && lineNumber < LICENSE_HEADER_MAX_LINES) {
|
|
235
|
+
// Continue within license section
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
inLicenseSection = false;
|
|
239
|
+
}
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (!isAComment) {
|
|
243
|
+
inLicenseSection = false;
|
|
244
|
+
}
|
|
245
|
+
// Go import block handling
|
|
246
|
+
if (language === 'go') {
|
|
247
|
+
if (stripped.startsWith('import (')) {
|
|
248
|
+
inImportBlock = true;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (inImportBlock) {
|
|
252
|
+
if (stripped === ')') {
|
|
253
|
+
inImportBlock = false;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (stripped.startsWith('"') ||
|
|
257
|
+
stripped.startsWith('_') ||
|
|
258
|
+
/^[a-zA-Z_][a-zA-Z0-9_]*\s+"/.test(stripped)) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (this.isImport(lines[i], importPatterns)) {
|
|
264
|
+
if (consecutiveImportsCount === 0) {
|
|
265
|
+
// First import detected
|
|
266
|
+
}
|
|
267
|
+
consecutiveImportsCount += 1;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
return lineNumber;
|
|
271
|
+
}
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Strip WFP snippet lines up to and including the line_offset.
|
|
277
|
+
* Inserts a `start_line=<offset>` tag before the first kept snippet line.
|
|
278
|
+
* Preserves non-snippet lines (file=, fh2=, hpsm=, etc.).
|
|
279
|
+
*/
|
|
280
|
+
export function stripLinesUntilOffset(wfp, lineOffset) {
|
|
281
|
+
if (lineOffset <= 0)
|
|
282
|
+
return wfp;
|
|
283
|
+
const lines = wfp.split('\n');
|
|
284
|
+
const filteredLines = [];
|
|
285
|
+
let startLineAdded = false;
|
|
286
|
+
for (const line of lines) {
|
|
287
|
+
const eqIndex = line.indexOf('=');
|
|
288
|
+
if (eqIndex > 0) {
|
|
289
|
+
const prefix = line.substring(0, eqIndex);
|
|
290
|
+
if (/^\d+$/.test(prefix)) {
|
|
291
|
+
const lineNum = parseInt(prefix, 10);
|
|
292
|
+
if (lineNum > lineOffset) {
|
|
293
|
+
if (!startLineAdded) {
|
|
294
|
+
filteredLines.push(`start_line=${lineOffset}`);
|
|
295
|
+
startLineAdded = true;
|
|
296
|
+
}
|
|
297
|
+
filteredLines.push(line);
|
|
298
|
+
}
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
filteredLines.push(line);
|
|
303
|
+
}
|
|
304
|
+
return filteredLines.join('\n');
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGVyRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9zY2FubmVyL1dmcFByb3ZpZGVyL1dmcENhbGN1bGF0b3IvSGVhZGVyRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFFOUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBV3BDLE1BQU0sZ0JBQWdCLEdBQW9DO0lBQ3hELE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFdBQVc7UUFDbEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsU0FBUztRQUNoQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQzlCLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLGtCQUFrQjtLQUMzQztJQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFVBQVU7UUFDakMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQ3JDLGNBQWMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFNBQVM7S0FDcEM7SUFDRCxTQUFTLEVBQUU7UUFDVCxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxXQUFXO1FBQ2xDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFlBQVk7UUFDbkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsVUFBVTtLQUNoQztJQUNELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFVBQVU7UUFDakMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsU0FBUztRQUM5QixZQUFZLEVBQUUs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
|
|
@@ -5,6 +5,7 @@ import { ScannerCfg } from '../../ScannerCfg';
|
|
|
5
5
|
import { ScannerEvents } from '../../ScannerTypes';
|
|
6
6
|
import { FingerprintPackage } from '../FingerprintPackage';
|
|
7
7
|
import { WfpProvider } from '../WfpProvider';
|
|
8
|
+
import { HeaderFilter, stripLinesUntilOffset } from './HeaderFilter';
|
|
8
9
|
const stringWorker = `
|
|
9
10
|
const { parentPort } = require('worker_threads');
|
|
10
11
|
|
|
@@ -500,9 +501,11 @@ export class WfpCalculator extends WfpProvider {
|
|
|
500
501
|
fileList;
|
|
501
502
|
fileListIndex;
|
|
502
503
|
continue;
|
|
504
|
+
headerFilter;
|
|
503
505
|
constructor(scannerCfg = new ScannerCfg()) {
|
|
504
506
|
super();
|
|
505
507
|
this.scannerCfg = scannerCfg;
|
|
508
|
+
this.headerFilter = null;
|
|
506
509
|
}
|
|
507
510
|
init() {
|
|
508
511
|
super.init();
|
|
@@ -513,7 +516,11 @@ export class WfpCalculator extends WfpProvider {
|
|
|
513
516
|
prepareWorker() {
|
|
514
517
|
this.worker = new Worker(stringWorker, { eval: true });
|
|
515
518
|
this.worker.on('message', async (scannableItem) => {
|
|
516
|
-
|
|
519
|
+
let fingerprint = scannableItem.fingerprint;
|
|
520
|
+
if (scannableItem.lineOffset > 0) {
|
|
521
|
+
fingerprint = stripLinesUntilOffset(fingerprint, scannableItem.lineOffset);
|
|
522
|
+
}
|
|
523
|
+
this.fingerprintPacker(fingerprint);
|
|
517
524
|
await this.nextStepMachine();
|
|
518
525
|
});
|
|
519
526
|
}
|
|
@@ -554,6 +561,10 @@ export class WfpCalculator extends WfpProvider {
|
|
|
554
561
|
if (!(this.fileListIndex % this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X))
|
|
555
562
|
this.emit(ScannerEvents.WINNOWING_STATUS, this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X);
|
|
556
563
|
const scannable = new ScannableItem(content, contentSource, this.winnowingMode, this.scannerCfg.WFP_FILE_MAX_SIZE);
|
|
564
|
+
if (this.headerFilter && content.length > 0) {
|
|
565
|
+
const lineOffset = this.headerFilter.filter(path, content.toString('utf-8'));
|
|
566
|
+
scannable.setLineOffset(lineOffset);
|
|
567
|
+
}
|
|
557
568
|
return scannable;
|
|
558
569
|
}
|
|
559
570
|
async readFile(path) {
|
|
@@ -588,6 +599,11 @@ export class WfpCalculator extends WfpProvider {
|
|
|
588
599
|
this.sendLog('[ SCANNER ]: WFP Calculator starting...');
|
|
589
600
|
this.init();
|
|
590
601
|
this.prepareWorker();
|
|
602
|
+
const fileSnippet = this.scannerCfg?.SCANOSS_SETTINGS?.settings?.file_snippet;
|
|
603
|
+
if (fileSnippet?.skip_headers) {
|
|
604
|
+
this.headerFilter = new HeaderFilter(fileSnippet.skip_headers_limit);
|
|
605
|
+
this.sendLog('[ SCANNER ]: Header filter enabled');
|
|
606
|
+
}
|
|
591
607
|
if (params.winnowingMode)
|
|
592
608
|
this.setWinnowingMode(params.winnowingMode);
|
|
593
609
|
if (params.obfuscate)
|
|
@@ -620,4 +636,4 @@ export class WfpCalculator extends WfpProvider {
|
|
|
620
636
|
this.sendFingerprint(fingerprint);
|
|
621
637
|
}
|
|
622
638
|
}
|
|
623
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
639
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQStCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFxQixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|