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