scanoss 1.12.2__py3-none-any.whl → 1.43.1__py3-none-any.whl
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.
- protoc_gen_swagger/__init__.py +13 -13
- protoc_gen_swagger/options/__init__.py +13 -13
- protoc_gen_swagger/options/annotations_pb2.py +18 -12
- protoc_gen_swagger/options/annotations_pb2.pyi +48 -0
- protoc_gen_swagger/options/annotations_pb2_grpc.py +20 -0
- protoc_gen_swagger/options/openapiv2_pb2.py +110 -99
- protoc_gen_swagger/options/openapiv2_pb2.pyi +1317 -0
- protoc_gen_swagger/options/openapiv2_pb2_grpc.py +20 -0
- scanoss/__init__.py +18 -18
- scanoss/api/__init__.py +17 -17
- scanoss/api/common/__init__.py +17 -17
- scanoss/api/common/v2/__init__.py +17 -17
- scanoss/api/common/v2/scanoss_common_pb2.py +49 -20
- scanoss/api/common/v2/scanoss_common_pb2_grpc.py +25 -0
- scanoss/api/components/__init__.py +17 -17
- scanoss/api/components/v2/__init__.py +17 -17
- scanoss/api/components/v2/scanoss_components_pb2.py +68 -43
- scanoss/api/components/v2/scanoss_components_pb2_grpc.py +83 -22
- scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py +136 -21
- scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py +766 -13
- scanoss/api/dependencies/__init__.py +17 -17
- scanoss/api/dependencies/v2/__init__.py +17 -17
- scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py +56 -29
- scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py +94 -8
- scanoss/api/geoprovenance/__init__.py +23 -0
- scanoss/api/geoprovenance/v2/__init__.py +23 -0
- scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2.py +92 -0
- scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2_grpc.py +381 -0
- scanoss/api/licenses/__init__.py +23 -0
- scanoss/api/licenses/v2/__init__.py +23 -0
- scanoss/api/licenses/v2/scanoss_licenses_pb2.py +84 -0
- scanoss/api/licenses/v2/scanoss_licenses_pb2_grpc.py +302 -0
- scanoss/api/scanning/__init__.py +17 -17
- scanoss/api/scanning/v2/__init__.py +17 -17
- scanoss/api/scanning/v2/scanoss_scanning_pb2.py +42 -13
- scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py +86 -7
- scanoss/api/semgrep/__init__.py +17 -17
- scanoss/api/semgrep/v2/__init__.py +17 -17
- scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py +50 -23
- scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py +151 -16
- scanoss/api/vulnerabilities/__init__.py +17 -17
- scanoss/api/vulnerabilities/v2/__init__.py +17 -17
- scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py +78 -31
- scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py +282 -18
- scanoss/cli.py +2359 -370
- scanoss/components.py +187 -94
- scanoss/constants.py +22 -0
- scanoss/cryptography.py +308 -0
- scanoss/csvoutput.py +91 -58
- scanoss/cyclonedx.py +221 -63
- scanoss/data/build_date.txt +1 -1
- scanoss/data/osadl-copyleft.json +133 -0
- scanoss/data/scanoss-settings-schema.json +254 -0
- scanoss/delta.py +197 -0
- scanoss/export/__init__.py +23 -0
- scanoss/export/dependency_track.py +227 -0
- scanoss/file_filters.py +582 -0
- scanoss/filecount.py +75 -69
- scanoss/gitlabqualityreport.py +214 -0
- scanoss/header_filter.py +563 -0
- scanoss/inspection/__init__.py +23 -0
- scanoss/inspection/policy_check/__init__.py +0 -0
- scanoss/inspection/policy_check/dependency_track/__init__.py +0 -0
- scanoss/inspection/policy_check/dependency_track/project_violation.py +479 -0
- scanoss/inspection/policy_check/policy_check.py +222 -0
- scanoss/inspection/policy_check/scanoss/__init__.py +0 -0
- scanoss/inspection/policy_check/scanoss/copyleft.py +243 -0
- scanoss/inspection/policy_check/scanoss/undeclared_component.py +309 -0
- scanoss/inspection/summary/__init__.py +0 -0
- scanoss/inspection/summary/component_summary.py +170 -0
- scanoss/inspection/summary/license_summary.py +191 -0
- scanoss/inspection/summary/match_summary.py +341 -0
- scanoss/inspection/utils/file_utils.py +44 -0
- scanoss/inspection/utils/license_utils.py +123 -0
- scanoss/inspection/utils/markdown_utils.py +63 -0
- scanoss/inspection/utils/scan_result_processor.py +417 -0
- scanoss/osadl.py +125 -0
- scanoss/results.py +275 -0
- scanoss/scancodedeps.py +87 -38
- scanoss/scanner.py +431 -539
- scanoss/scanners/__init__.py +23 -0
- scanoss/scanners/container_scanner.py +476 -0
- scanoss/scanners/folder_hasher.py +358 -0
- scanoss/scanners/scanner_config.py +73 -0
- scanoss/scanners/scanner_hfh.py +252 -0
- scanoss/scanoss_settings.py +337 -0
- scanoss/scanossapi.py +140 -101
- scanoss/scanossbase.py +59 -22
- scanoss/scanossgrpc.py +799 -251
- scanoss/scanpostprocessor.py +294 -0
- scanoss/scantype.py +22 -21
- scanoss/services/dependency_track_service.py +132 -0
- scanoss/spdxlite.py +532 -174
- scanoss/threadeddependencies.py +148 -47
- scanoss/threadedscanning.py +53 -37
- scanoss/utils/__init__.py +23 -0
- scanoss/utils/abstract_presenter.py +103 -0
- scanoss/utils/crc64.py +96 -0
- scanoss/utils/file.py +84 -0
- scanoss/utils/scanoss_scan_results_utils.py +41 -0
- scanoss/utils/simhash.py +198 -0
- scanoss/winnowing.py +241 -63
- {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/METADATA +18 -9
- scanoss-1.43.1.dist-info/RECORD +110 -0
- {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/WHEEL +1 -1
- scanoss-1.12.2.dist-info/RECORD +0 -58
- {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/entry_points.txt +0 -0
- {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info/licenses}/LICENSE +0 -0
- {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/top_level.txt +0 -0
scanoss/winnowing.py
CHANGED
|
@@ -1,39 +1,43 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
2
|
+
SPDX-License-Identifier: MIT
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Copyright (c) 2021, SCANOSS
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
|
14
|
+
all copies or substantial portions of the Software.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
+
THE SOFTWARE.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Winnowing Algorithm implementation for SCANOSS.
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
This module implements an adaptation of the original winnowing algorithm by S. Schleimer, D. S. Wilkerson and
|
|
27
|
+
A. Aiken as described in their seminal article which can be found here:
|
|
28
|
+
https://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf
|
|
29
29
|
"""
|
|
30
|
+
|
|
30
31
|
import hashlib
|
|
31
32
|
import pathlib
|
|
33
|
+
import platform
|
|
32
34
|
import re
|
|
35
|
+
from typing import Tuple
|
|
33
36
|
|
|
34
|
-
from crc32c import crc32c
|
|
35
37
|
from binaryornot.check import is_binary
|
|
38
|
+
from crc32c import crc32c
|
|
36
39
|
|
|
40
|
+
from .header_filter import HeaderFilter
|
|
37
41
|
from .scanossbase import ScanossBase
|
|
38
42
|
|
|
39
43
|
# Winnowing configuration. DO NOT CHANGE.
|
|
@@ -54,11 +58,56 @@ MAX_POST_SIZE = 64 * 1024 # 64k Max post size
|
|
|
54
58
|
MIN_FILE_SIZE = 256
|
|
55
59
|
|
|
56
60
|
SKIP_SNIPPET_EXT = { # File extensions to ignore snippets for
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
'.exe',
|
|
62
|
+
'.zip',
|
|
63
|
+
'.tar',
|
|
64
|
+
'.tgz',
|
|
65
|
+
'.gz',
|
|
66
|
+
'.7z',
|
|
67
|
+
'.rar',
|
|
68
|
+
'.jar',
|
|
69
|
+
'.war',
|
|
70
|
+
'.ear',
|
|
71
|
+
'.class',
|
|
72
|
+
'.pyc',
|
|
73
|
+
'.o',
|
|
74
|
+
'.a',
|
|
75
|
+
'.so',
|
|
76
|
+
'.obj',
|
|
77
|
+
'.dll',
|
|
78
|
+
'.lib',
|
|
79
|
+
'.out',
|
|
80
|
+
'.app',
|
|
81
|
+
'.bin',
|
|
82
|
+
'.lst',
|
|
83
|
+
'.dat',
|
|
84
|
+
'.json',
|
|
85
|
+
'.htm',
|
|
86
|
+
'.html',
|
|
87
|
+
'.xml',
|
|
88
|
+
'.md',
|
|
89
|
+
'.txt',
|
|
90
|
+
'.doc',
|
|
91
|
+
'.docx',
|
|
92
|
+
'.xls',
|
|
93
|
+
'.xlsx',
|
|
94
|
+
'.ppt',
|
|
95
|
+
'.pptx',
|
|
96
|
+
'.odt',
|
|
97
|
+
'.ods',
|
|
98
|
+
'.odp',
|
|
99
|
+
'.pages',
|
|
100
|
+
'.key',
|
|
101
|
+
'.numbers',
|
|
102
|
+
'.pdf',
|
|
103
|
+
'.min.js',
|
|
104
|
+
'.mf',
|
|
105
|
+
'.sum',
|
|
106
|
+
'.woff',
|
|
107
|
+
'.woff2',
|
|
108
|
+
'.xsd',
|
|
109
|
+
'.pom',
|
|
110
|
+
'.whl',
|
|
62
111
|
}
|
|
63
112
|
|
|
64
113
|
CRC8_MAXIM_DOW_TABLE_SIZE = 0x100
|
|
@@ -110,11 +159,23 @@ class Winnowing(ScanossBase):
|
|
|
110
159
|
a list of WFP fingerprints with their corresponding line numbers.
|
|
111
160
|
"""
|
|
112
161
|
|
|
113
|
-
def __init__(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
162
|
+
def __init__( # noqa: PLR0913
|
|
163
|
+
self,
|
|
164
|
+
size_limit: bool = False,
|
|
165
|
+
debug: bool = False,
|
|
166
|
+
trace: bool = False,
|
|
167
|
+
quiet: bool = False,
|
|
168
|
+
skip_snippets: bool = False,
|
|
169
|
+
post_size: int = 32,
|
|
170
|
+
all_extensions: bool = False,
|
|
171
|
+
obfuscate: bool = False,
|
|
172
|
+
hpsm: bool = False,
|
|
173
|
+
strip_hpsm_ids=None,
|
|
174
|
+
strip_snippet_ids=None,
|
|
175
|
+
skip_md5_ids=None,
|
|
176
|
+
skip_headers: bool = False,
|
|
177
|
+
skip_headers_limit: int = 0,
|
|
178
|
+
):
|
|
118
179
|
"""
|
|
119
180
|
Instantiate Winnowing class
|
|
120
181
|
Parameters
|
|
@@ -140,6 +201,9 @@ class Winnowing(ScanossBase):
|
|
|
140
201
|
self.strip_hpsm_ids = strip_hpsm_ids
|
|
141
202
|
self.strip_snippet_ids = strip_snippet_ids
|
|
142
203
|
self.hpsm = hpsm
|
|
204
|
+
self.skip_headers = skip_headers
|
|
205
|
+
self.is_windows = platform.system() == 'Windows'
|
|
206
|
+
self.header_filter = HeaderFilter(debug=debug, trace=trace, quiet=quiet, skip_limit=skip_headers_limit)
|
|
143
207
|
if hpsm:
|
|
144
208
|
self.crc8_maxim_dow_table = []
|
|
145
209
|
self.crc8_generate_table()
|
|
@@ -161,11 +225,11 @@ class Winnowing(ScanossBase):
|
|
|
161
225
|
return byte
|
|
162
226
|
if byte >= ASCII_a:
|
|
163
227
|
return byte
|
|
164
|
-
if (byte >=
|
|
228
|
+
if (byte >= ASCII_A) and (byte <= ASCII_Z):
|
|
165
229
|
return byte + 32
|
|
166
230
|
return 0
|
|
167
231
|
|
|
168
|
-
def __skip_snippets(self, file: str, src: str) -> bool:
|
|
232
|
+
def __skip_snippets(self, file: str, src: str) -> bool: # noqa: PLR0911
|
|
169
233
|
"""
|
|
170
234
|
Determine files that are not of interest based on their content or file extension
|
|
171
235
|
Parameters
|
|
@@ -189,12 +253,16 @@ class Winnowing(ScanossBase):
|
|
|
189
253
|
if src_len == 0 or src_len <= MIN_FILE_SIZE: # Ignore empty or files that are too small
|
|
190
254
|
self.print_trace(f'Skipping snippets as the file is too small: {file} - {src_len}')
|
|
191
255
|
return True
|
|
192
|
-
prefix = src[0:(MIN_FILE_SIZE - 1)].lower().strip()
|
|
193
|
-
if len(prefix) > 0 and (prefix[0] ==
|
|
256
|
+
prefix = src[0 : (MIN_FILE_SIZE - 1)].lower().strip()
|
|
257
|
+
if len(prefix) > 0 and (prefix[0] == '{' or prefix[0] == '['): # Ignore json
|
|
194
258
|
self.print_trace(f'Skipping snippets as the file appears to be JSON: {file}')
|
|
195
259
|
return True
|
|
196
|
-
if
|
|
197
|
-
|
|
260
|
+
if (
|
|
261
|
+
prefix.startswith('<?xml')
|
|
262
|
+
or prefix.startswith('<html')
|
|
263
|
+
or prefix.startswith('<ac3d')
|
|
264
|
+
or prefix.startswith('<!doc')
|
|
265
|
+
):
|
|
198
266
|
self.print_trace(f'Skipping snippets as the file appears to be xml/html/binary: {file}')
|
|
199
267
|
return True # Ignore xml & html & ac3d
|
|
200
268
|
index = src.index('\n') if '\n' in src else (src_len - 1) # TODO still necessary if we have a binary check?
|
|
@@ -257,11 +325,12 @@ class Winnowing(ScanossBase):
|
|
|
257
325
|
elif hpsm_id_len % 2 == 1:
|
|
258
326
|
hpsm_id_len = hpsm_id_len + 1
|
|
259
327
|
|
|
260
|
-
to_remove = hpsm[hpsm_id_index:hpsm_id_index + hpsm_id_len]
|
|
328
|
+
to_remove = hpsm[hpsm_id_index : hpsm_id_index + hpsm_id_len]
|
|
261
329
|
self.print_debug(f'HPSM ID {to_remove} to replace')
|
|
262
330
|
# Calculate the XOR of each byte to produce the correct ignore sequence.
|
|
263
331
|
replacement = ''.join(
|
|
264
|
-
[format(int(to_remove[i:i + 2], 16) ^ 0xFF, '02x') for i in range(0, len(to_remove), 2)]
|
|
332
|
+
[format(int(to_remove[i : i + 2], 16) ^ 0xFF, '02x') for i in range(0, len(to_remove), 2)]
|
|
333
|
+
)
|
|
265
334
|
|
|
266
335
|
self.print_debug(f'HPSM ID replacement {replacement}')
|
|
267
336
|
# Overwrite HPSM bytes to be removed.
|
|
@@ -289,7 +358,96 @@ class Winnowing(ScanossBase):
|
|
|
289
358
|
self.print_debug(f'Stripped snippet ids from {file}')
|
|
290
359
|
return wfp
|
|
291
360
|
|
|
292
|
-
def
|
|
361
|
+
def __strip_lines_until_offset(self, file: str, wfp: str, line_offset: int) -> str:
|
|
362
|
+
"""
|
|
363
|
+
Strip lines from the WFP up to and including the line_offset
|
|
364
|
+
|
|
365
|
+
:param file: name of fingerprinted file
|
|
366
|
+
:param wfp: WFP to clean
|
|
367
|
+
:param line_offset: line number offset to strip up to
|
|
368
|
+
:return: updated WFP
|
|
369
|
+
"""
|
|
370
|
+
# No offset specified, return original WFP
|
|
371
|
+
if line_offset <= 0:
|
|
372
|
+
return wfp
|
|
373
|
+
lines = wfp.split('\n')
|
|
374
|
+
filtered_lines = []
|
|
375
|
+
start_line_added = False
|
|
376
|
+
for line in lines:
|
|
377
|
+
# Check if a line contains snippet data (format: line_number=hash,hash,...)
|
|
378
|
+
line_details = line.split('=')
|
|
379
|
+
if line_details[0].isdigit():
|
|
380
|
+
try:
|
|
381
|
+
line_num = int(line_details[0])
|
|
382
|
+
# Keep lines that are after the offset
|
|
383
|
+
# (line_offset is the last line previous to real code)
|
|
384
|
+
if line_num > line_offset:
|
|
385
|
+
# Add the start_line tag before the first snippet line
|
|
386
|
+
if not start_line_added:
|
|
387
|
+
filtered_lines.append(f'start_line={line_offset}')
|
|
388
|
+
start_line_added = True
|
|
389
|
+
filtered_lines.append(line)
|
|
390
|
+
except (ValueError, IndexError) as e:
|
|
391
|
+
self.print_stderr(f'Error decoding line number from line {line} in {file}: {e}')
|
|
392
|
+
# Keep non-snippet lines (like file=, hpsm=, etc.)
|
|
393
|
+
filtered_lines.append(line)
|
|
394
|
+
else:
|
|
395
|
+
# Keep non-snippet lines (like file=, hpsm=, etc.)
|
|
396
|
+
filtered_lines.append(line)
|
|
397
|
+
# End for loop comment
|
|
398
|
+
wfp = '\n'.join(filtered_lines)
|
|
399
|
+
if start_line_added:
|
|
400
|
+
self.print_debug(f'Stripped lines up to offset {line_offset} from {file}')
|
|
401
|
+
return wfp
|
|
402
|
+
|
|
403
|
+
def __detect_line_endings(self, contents: bytes) -> Tuple[bool, bool, bool]:
|
|
404
|
+
"""Detect the types of line endings present in file contents.
|
|
405
|
+
|
|
406
|
+
Args:
|
|
407
|
+
contents: File contents as bytes.
|
|
408
|
+
|
|
409
|
+
Returns:
|
|
410
|
+
Tuple of (has_crlf, has_lf_only, has_cr_only, has_mixed) indicating which line ending types are present.
|
|
411
|
+
"""
|
|
412
|
+
if not contents:
|
|
413
|
+
self.print_debug('Warning: No file contents provided')
|
|
414
|
+
has_crlf = b'\r\n' in contents
|
|
415
|
+
# For LF detection, we need to find LF that's not part of CRLF
|
|
416
|
+
content_without_crlf = contents.replace(b'\r\n', b'')
|
|
417
|
+
has_standalone_lf = b'\n' in content_without_crlf
|
|
418
|
+
# For CR detection, we need to find CR that's not part of CRLF
|
|
419
|
+
has_standalone_cr = b'\r' in content_without_crlf
|
|
420
|
+
return has_crlf, has_standalone_lf, has_standalone_cr
|
|
421
|
+
|
|
422
|
+
def __calculate_opposite_line_ending_hash(self, contents: bytes):
|
|
423
|
+
"""Calculate hash for contents with opposite line endings.
|
|
424
|
+
|
|
425
|
+
If the file is primarily Unix (LF), calculates Windows (CRLF) hash.
|
|
426
|
+
If the file is primarily Windows (CRLF), calculates Unix (LF) hash.
|
|
427
|
+
|
|
428
|
+
Args:
|
|
429
|
+
contents: File contents as bytes.
|
|
430
|
+
|
|
431
|
+
Returns:
|
|
432
|
+
Hash with opposite line endings as hex string, or None if no line endings detected.
|
|
433
|
+
"""
|
|
434
|
+
has_crlf, has_standalone_lf, has_standalone_cr = self.__detect_line_endings(contents)
|
|
435
|
+
if not has_crlf and not has_standalone_lf and not has_standalone_cr:
|
|
436
|
+
self.print_debug('No line endings detected in file contents')
|
|
437
|
+
return None
|
|
438
|
+
# Normalise all line endings to LF first
|
|
439
|
+
normalized = contents.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
|
|
440
|
+
# Determine the dominant line ending type
|
|
441
|
+
if has_crlf and not has_standalone_lf and not has_standalone_cr:
|
|
442
|
+
# File is Windows (CRLF) - produce Unix (LF) hash
|
|
443
|
+
opposite_contents = normalized
|
|
444
|
+
else:
|
|
445
|
+
# File is Unix (LF/CR) or mixed - produce Windows (CRLF) hash
|
|
446
|
+
opposite_contents = normalized.replace(b'\n', b'\r\n')
|
|
447
|
+
# Return the MD5 hash of the opposite contents
|
|
448
|
+
return hashlib.md5(opposite_contents).hexdigest()
|
|
449
|
+
|
|
450
|
+
def wfp_for_contents(self, file: str, bin_file: bool, contents: bytes) -> str: # noqa: PLR0912, PLR0915
|
|
293
451
|
"""
|
|
294
452
|
Generate a Winnowing fingerprint (WFP) for the given file contents
|
|
295
453
|
Parameters
|
|
@@ -307,17 +465,27 @@ class Winnowing(ScanossBase):
|
|
|
307
465
|
return ''
|
|
308
466
|
# Print file line
|
|
309
467
|
content_length = len(contents)
|
|
310
|
-
|
|
311
|
-
if self.
|
|
312
|
-
|
|
468
|
+
original_filename = file
|
|
469
|
+
if self.is_windows:
|
|
470
|
+
original_filename = file.replace('\\', '/')
|
|
471
|
+
wfp_filename = repr(original_filename).strip("'") # return a utf-8 compatible version of the filename
|
|
472
|
+
# hide the real size of the file and its name but keep the suffix
|
|
473
|
+
if self.obfuscate:
|
|
474
|
+
wfp_filename = f'{self.ob_count}{pathlib.Path(original_filename).suffix}'
|
|
313
475
|
self.ob_count = self.ob_count + 1
|
|
314
|
-
self.file_map[wfp_filename] =
|
|
315
|
-
|
|
476
|
+
self.file_map[wfp_filename] = original_filename # Save the file name map for later (reverse lookup)
|
|
477
|
+
# Construct the WFP header
|
|
316
478
|
wfp = 'file={0},{1},{2}\n'.format(file_md5, content_length, wfp_filename)
|
|
479
|
+
# Add the opposite line ending hash based on line ending analysis
|
|
480
|
+
if not bin_file:
|
|
481
|
+
opposite_hash = self.__calculate_opposite_line_ending_hash(contents)
|
|
482
|
+
if opposite_hash is not None:
|
|
483
|
+
wfp += f'fh2={opposite_hash}\n'
|
|
317
484
|
# We don't process snippets for binaries, or other uninteresting files, or if we're requested to skip
|
|
318
|
-
|
|
485
|
+
decoded_contents = contents.decode('utf-8', 'ignore')
|
|
486
|
+
if bin_file or self.skip_snippets or self.__skip_snippets(file, decoded_contents):
|
|
319
487
|
return wfp
|
|
320
|
-
# Add HPSM
|
|
488
|
+
# Add HPSM (calculated from original contents, not filtered)
|
|
321
489
|
if self.hpsm:
|
|
322
490
|
hpsm = self.__strip_hpsm(file, self.calc_hpsm(contents))
|
|
323
491
|
if len(hpsm) > 0:
|
|
@@ -325,7 +493,7 @@ class Winnowing(ScanossBase):
|
|
|
325
493
|
# Initialize variables
|
|
326
494
|
gram = ''
|
|
327
495
|
window = []
|
|
328
|
-
line = 1
|
|
496
|
+
line = 1 # Line counter for WFP generation
|
|
329
497
|
last_hash = MAX_CRC32
|
|
330
498
|
last_line = 0
|
|
331
499
|
output = ''
|
|
@@ -356,14 +524,16 @@ class Winnowing(ScanossBase):
|
|
|
356
524
|
crc_hex = '{:08x}'.format(crc)
|
|
357
525
|
if last_line != line:
|
|
358
526
|
if output != '':
|
|
359
|
-
if
|
|
360
|
-
|
|
361
|
-
|
|
527
|
+
if (
|
|
528
|
+
self.size_limit
|
|
529
|
+
and (len(wfp.encode('utf-8')) + len(output.encode('utf-8')))
|
|
530
|
+
> self.max_post_size
|
|
531
|
+
):
|
|
362
532
|
self.print_debug(f'Truncating WFP ({self.max_post_size} limit) for: {file}')
|
|
363
533
|
output = ''
|
|
364
534
|
break # Stop collecting snippets as it's over 64k
|
|
365
535
|
wfp += output + '\n'
|
|
366
|
-
output =
|
|
536
|
+
output = '%d=%s' % (line, crc_hex)
|
|
367
537
|
else:
|
|
368
538
|
output += ',' + crc_hex
|
|
369
539
|
|
|
@@ -374,16 +544,23 @@ class Winnowing(ScanossBase):
|
|
|
374
544
|
# Shift gram
|
|
375
545
|
gram = gram[1:]
|
|
376
546
|
if output != '':
|
|
377
|
-
if not self.size_limit or (len(wfp.encode(
|
|
547
|
+
if not self.size_limit or (len(wfp.encode('utf-8')) + len(output.encode('utf-8'))) < self.max_post_size:
|
|
378
548
|
wfp += output + '\n'
|
|
379
549
|
else:
|
|
380
550
|
self.print_debug(f'Warning: skipping output in WFP for {file} - "{output}"')
|
|
381
|
-
|
|
551
|
+
# Warn if we don't have any WFP content
|
|
382
552
|
if wfp is None or wfp == '':
|
|
383
553
|
self.print_stderr(f'Warning: No WFP content data for {file}')
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
554
|
+
else:
|
|
555
|
+
# Apply line filter to remove headers, comments, and imports from the beginning (if enabled)
|
|
556
|
+
if self.skip_headers:
|
|
557
|
+
line_offset = self.header_filter.filter(file, decoded_contents)
|
|
558
|
+
if line_offset > 0:
|
|
559
|
+
wfp = self.__strip_lines_until_offset(file, wfp, line_offset)
|
|
560
|
+
# Strip snippet IDs from the WFP (if enabled)
|
|
561
|
+
if self.strip_snippet_ids:
|
|
562
|
+
wfp = self.__strip_snippets(file, wfp)
|
|
563
|
+
# Return the WFP contents
|
|
387
564
|
return wfp
|
|
388
565
|
|
|
389
566
|
def calc_hpsm(self, content):
|
|
@@ -398,13 +575,13 @@ class Winnowing(ScanossBase):
|
|
|
398
575
|
last_line = 0
|
|
399
576
|
for i, byte in enumerate(content):
|
|
400
577
|
c = byte
|
|
401
|
-
if c == ASCII_LF:
|
|
402
|
-
if
|
|
578
|
+
if c == ASCII_LF: # When there is a new line
|
|
579
|
+
if list_normalized:
|
|
403
580
|
crc_lines.append(self.crc8_buffer(list_normalized))
|
|
404
581
|
list_normalized = []
|
|
405
|
-
elif last_line+1 == i:
|
|
582
|
+
elif last_line + 1 == i:
|
|
406
583
|
crc_lines.append(0xFF)
|
|
407
|
-
elif i-last_line > 1:
|
|
584
|
+
elif i - last_line > 1:
|
|
408
585
|
crc_lines.append(0x00)
|
|
409
586
|
last_line = i
|
|
410
587
|
else:
|
|
@@ -464,7 +641,8 @@ class Winnowing(ScanossBase):
|
|
|
464
641
|
crc = self.crc8_byte(crc, buffer[index])
|
|
465
642
|
crc ^= CRC8_MAXIM_DOW_FINAL # Bitwise OR (XOR) of crc in Maxim Dow Final
|
|
466
643
|
return crc
|
|
467
|
-
|
|
644
|
+
|
|
645
|
+
|
|
468
646
|
#
|
|
469
647
|
# End of Winnowing Class
|
|
470
648
|
#
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: scanoss
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.43.1
|
|
4
4
|
Summary: Simple Python library to leverage the SCANOSS APIs
|
|
5
5
|
Home-page: https://scanoss.com
|
|
6
6
|
Author: SCANOSS
|
|
@@ -13,20 +13,29 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
14
|
Classifier: Development Status :: 5 - Production/Stable
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Requires-Python: >=3.
|
|
16
|
+
Requires-Python: >=3.9
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
19
|
Requires-Dist: requests
|
|
20
|
-
Requires-Dist: crc32c
|
|
20
|
+
Requires-Dist: crc32c>=2.2
|
|
21
21
|
Requires-Dist: binaryornot
|
|
22
22
|
Requires-Dist: progress
|
|
23
|
-
Requires-Dist: grpcio
|
|
24
|
-
Requires-Dist: protobuf
|
|
23
|
+
Requires-Dist: grpcio>=1.73.1
|
|
24
|
+
Requires-Dist: protobuf>=6.3.1
|
|
25
|
+
Requires-Dist: protoc-gen-openapiv2
|
|
25
26
|
Requires-Dist: pypac
|
|
26
27
|
Requires-Dist: pyOpenSSL
|
|
27
28
|
Requires-Dist: google-api-core
|
|
28
|
-
|
|
29
|
-
Requires-Dist:
|
|
29
|
+
Requires-Dist: importlib_resources
|
|
30
|
+
Requires-Dist: packageurl-python
|
|
31
|
+
Requires-Dist: pathspec
|
|
32
|
+
Requires-Dist: jsonschema
|
|
33
|
+
Requires-Dist: crc
|
|
34
|
+
Requires-Dist: protoc-gen-openapiv2
|
|
35
|
+
Requires-Dist: cyclonedx-python-lib[validation]
|
|
36
|
+
Provides-Extra: fast-winnowing
|
|
37
|
+
Requires-Dist: scanoss_winnowing>=0.5.0; extra == "fast-winnowing"
|
|
38
|
+
Dynamic: license-file
|
|
30
39
|
|
|
31
40
|
# SCANOSS Python Package
|
|
32
41
|
The SCANOSS python package provides a simple easy to consume library for interacting with SCANOSS APIs/Engine.
|
|
@@ -168,7 +177,7 @@ if __name__ == "__main__":
|
|
|
168
177
|
```
|
|
169
178
|
|
|
170
179
|
## Requirements
|
|
171
|
-
Python 3.
|
|
180
|
+
Python 3.9 or higher.
|
|
172
181
|
|
|
173
182
|
## Source code
|
|
174
183
|
The source for this package can be found [here](https://github.com/scanoss/scanoss.py).
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
protoc_gen_swagger/__init__.py,sha256=WIZ8oAZVdZQxoQSsQDnOlVPKAYGBYza4gGHI6t7DACM,802
|
|
2
|
+
protoc_gen_swagger/options/__init__.py,sha256=WIZ8oAZVdZQxoQSsQDnOlVPKAYGBYza4gGHI6t7DACM,802
|
|
3
|
+
protoc_gen_swagger/options/annotations_pb2.py,sha256=EGK2vx7EPxFrNI3_kOYQTxFZiZqdhWMLu1AVxPhmf6c,2434
|
|
4
|
+
protoc_gen_swagger/options/annotations_pb2.pyi,sha256=DETCxnwInbkywttMsUugA3kqFajzhwgUXaccLNezekk,2490
|
|
5
|
+
protoc_gen_swagger/options/annotations_pb2_grpc.py,sha256=KZOW9Ciio-f9iL42FuLFnSVKAuoilgwMuZ_DcCIZ0jY,919
|
|
6
|
+
protoc_gen_swagger/options/openapiv2_pb2.py,sha256=w0xDs63uyrWGgzRaQZXfJpfI7Jpyvh-i9ay_uzOR-aM,16475
|
|
7
|
+
protoc_gen_swagger/options/openapiv2_pb2.pyi,sha256=hYOV6uQ2yqhP89042_V3GuAsvoBBiXf5CGuYmnFnfv4,54665
|
|
8
|
+
protoc_gen_swagger/options/openapiv2_pb2_grpc.py,sha256=sje9Nh3yE7CHCUWZwtjTgwsKB4GvyGz5vOrGTnRXJfc,917
|
|
9
|
+
scanoss/__init__.py,sha256=lwPI4-clDHq4wUHNYOI6cksqekMeupq-O8d0iRfUd_A,1146
|
|
10
|
+
scanoss/cli.py,sha256=27gumZDiD5ui5ICmmaIaf8OM8LlAWZ2rlI4LC7DFvUU,104579
|
|
11
|
+
scanoss/components.py,sha256=NFyt_w3aoMotr_ZaFU-ng00_89sruc0kgY7ERnJXkmM,15891
|
|
12
|
+
scanoss/constants.py,sha256=vurzLNIfP_dnRMwOdZsUWvr5XAVuGoj98XZ0yjXNOjQ,632
|
|
13
|
+
scanoss/cryptography.py,sha256=lOoD_dW16ARQxYiYyb5R8S7gx0FqWIsnGkKfsB0nGaU,10627
|
|
14
|
+
scanoss/csvoutput.py,sha256=3wdXPeIqZG84bCtXFh8fMZO3XodekeSx6RZXoOhZMFc,10551
|
|
15
|
+
scanoss/cyclonedx.py,sha256=mHeX66yQCk41N3YCIzKy_fI7fLqQnetYPFRIzUKy_M4,18416
|
|
16
|
+
scanoss/delta.py,sha256=slmgnD7SsUOmfSE2zb0zdRAGo-JcjPJAtxyzuCSzO3I,9455
|
|
17
|
+
scanoss/file_filters.py,sha256=QcLqunaBKQIafjNZ9_Snh9quBX5_-fsTusVmxwjC1q8,18511
|
|
18
|
+
scanoss/filecount.py,sha256=icWaKN_xapMrH3ZZ-D3nldx7hWiguIOjoKg4gCeKDOM,6678
|
|
19
|
+
scanoss/gitlabqualityreport.py,sha256=_VG0Xoh8wYF3lsXGJvjoj-Ty58OS_-H1Domiq9OpQEo,8830
|
|
20
|
+
scanoss/header_filter.py,sha256=-Dqore9coROLMWWw9yP3nz8dpCB7jYAVm842hoRTmeE,21879
|
|
21
|
+
scanoss/osadl.py,sha256=VWalcHpshWxtRDGje2cK32SfFeSBAO62knfSW9pyYqc,4558
|
|
22
|
+
scanoss/results.py,sha256=47ZXXuU2sDjYa5vhtbWTmikit9jHhA0rsYKwkvZFI5w,9252
|
|
23
|
+
scanoss/scancodedeps.py,sha256=JbpoGW1POtPMmowzfwa4oh8sSBeeQCqaW9onvc4UFYM,11517
|
|
24
|
+
scanoss/scanner.py,sha256=3dkkNwi4KSHeBMk0Pmjf3WJ6SA28-om2iGxuDsqnfGg,39778
|
|
25
|
+
scanoss/scanoss_settings.py,sha256=W8uFQ6uRIqtE-DXXA56bO8I4GsbJ-aA1c84hQ_qBel4,12161
|
|
26
|
+
scanoss/scanossapi.py,sha256=O1ZNH9Kt8JzhLVBxfOSmJdEwSJTDP-rA54DulYdE8e4,13243
|
|
27
|
+
scanoss/scanossbase.py,sha256=tKlHPAi50ZarGaPXsNi1XrowQBynsSqSSst-NuG2ScI,3163
|
|
28
|
+
scanoss/scanossgrpc.py,sha256=9UuVPUjBLUhqim_tSntyoRZW-OAtiz5iP_VjjNr5RPY,41715
|
|
29
|
+
scanoss/scanpostprocessor.py,sha256=-JsThlxrU70r92GHykTMERnicdd-6jmwNsE4PH0MN2o,11063
|
|
30
|
+
scanoss/scantype.py,sha256=gFmyVmKQpHWogN2iCmMj032e_sZo4T92xS3_EH5B3Tc,1310
|
|
31
|
+
scanoss/spdxlite.py,sha256=4JMxmyNmvcL6fjScihk8toWfSuQ-Pj1gzaT3SIn1fXA,29425
|
|
32
|
+
scanoss/threadeddependencies.py,sha256=aN8E43iKS1pWJLJP3xCle5ewlfR5DE2-ljUzI_29Xwk,9851
|
|
33
|
+
scanoss/threadedscanning.py,sha256=Y-OYamD3xJvFiqwCn5y_4QD5gk_rJ5xs2jI1DxNtJlc,9661
|
|
34
|
+
scanoss/winnowing.py,sha256=py4gFKVHI5ZsLNyQIvNtnO6k3tBbvEXYNw24yuMgoTc,24751
|
|
35
|
+
scanoss/api/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
36
|
+
scanoss/api/common/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
37
|
+
scanoss/api/common/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
38
|
+
scanoss/api/common/v2/scanoss_common_pb2.py,sha256=uF1xIFu9o_srr8fZWkIOtdInbDk-duesJKyFKPznTRU,4646
|
|
39
|
+
scanoss/api/common/v2/scanoss_common_pb2_grpc.py,sha256=YMOEV6H5rFsx05X1ZfTh7rbOl0ThP6_F5QIal2hJkhI,1031
|
|
40
|
+
scanoss/api/components/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
41
|
+
scanoss/api/components/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
42
|
+
scanoss/api/components/v2/scanoss_components_pb2.py,sha256=godS4LyRzJCpUkGgOK2KTdmNs8RM-7CvAL5iHTiouNI,12775
|
|
43
|
+
scanoss/api/components/v2/scanoss_components_pb2_grpc.py,sha256=OZA9S0JTnrc3EBDKZ-Rvbcthwr6hCapDZKj16Rxzs3A,10225
|
|
44
|
+
scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py,sha256=LuO7duf1cOlX96JmIRnONpiCcJcbmX8_xOkkW_1j8S4,28971
|
|
45
|
+
scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py,sha256=1BAsN2d6ypZdbdoCDlwVJhwv49HHT2ov0DPkSgrLKGo,41260
|
|
46
|
+
scanoss/api/dependencies/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
47
|
+
scanoss/api/dependencies/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
48
|
+
scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py,sha256=fLfFdcH1oeUwsdkr4ujFRh-CQ3_b4gob_qftxNUzCso,10153
|
|
49
|
+
scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py,sha256=eMtHXvKYure23zzsvJB2bz9ML7mNdbE5OOOGVB04FBc,8315
|
|
50
|
+
scanoss/api/geoprovenance/__init__.py,sha256=KlDD87JmyZP-10T-fuJo0_v2zt1gxWfTgs70wjky9xg,1139
|
|
51
|
+
scanoss/api/geoprovenance/v2/__init__.py,sha256=KlDD87JmyZP-10T-fuJo0_v2zt1gxWfTgs70wjky9xg,1139
|
|
52
|
+
scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2.py,sha256=z7uIFxo77eY_2oQHyM1jLtSSFXqqmkCAdfvlfjzoM8E,14252
|
|
53
|
+
scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2_grpc.py,sha256=hs0WAHoLCLbnfVUkvyh5QAwfRMnrwpAlQOx0Azfe_ws,18234
|
|
54
|
+
scanoss/api/licenses/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
|
|
55
|
+
scanoss/api/licenses/v2/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
|
|
56
|
+
scanoss/api/licenses/v2/scanoss_licenses_pb2.py,sha256=YjEtJyJIfo-7RDz5W3sdF8BPhaSIu1Wt7kidUaYng0E,12139
|
|
57
|
+
scanoss/api/licenses/v2/scanoss_licenses_pb2_grpc.py,sha256=SHu4I44tYho6uYq0TuNHHWk_58nRd2sadxypwj5gGyM,13288
|
|
58
|
+
scanoss/api/scanning/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
59
|
+
scanoss/api/scanning/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
|
|
60
|
+
scanoss/api/scanning/v2/scanoss_scanning_pb2.py,sha256=npvLPyJ1CzWSK3m-Qvk9loN94bsQXj0FdjY4H9Je1-4,6000
|
|
61
|
+
scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py,sha256=fP_cz41eUKuSHCpRzCwvi8nJzrZmqV7efTM9kGnG1_Y,5869
|
|
62
|
+
scanoss/api/semgrep/__init__.py,sha256=UAhvL2dFNZsG4g3I8HCauwQK6e0QoEFhMGqZ_9GgGhI,1122
|
|
63
|
+
scanoss/api/semgrep/v2/__init__.py,sha256=UAhvL2dFNZsG4g3I8HCauwQK6e0QoEFhMGqZ_9GgGhI,1122
|
|
64
|
+
scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py,sha256=agTsO1MvoDD-loeF_BJSMwAdlTtGs7xQZ8pAjmjF28g,9200
|
|
65
|
+
scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py,sha256=NUejrEnb3fLfh0z22SxEghPEkelB_SAlF_pYEYlgdk0,10620
|
|
66
|
+
scanoss/api/vulnerabilities/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSCHhIDMJT4r0,1122
|
|
67
|
+
scanoss/api/vulnerabilities/v2/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSCHhIDMJT4r0,1122
|
|
68
|
+
scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py,sha256=pmm0MSiXkdf8e4rCIIDRcsNRixR2vGvD1Xak4l-wdwI,16550
|
|
69
|
+
scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py,sha256=BNxT5kUKQ-mgtOt5QYBM1Qrg5LNDqSpWKpfEZquIlsM,19127
|
|
70
|
+
scanoss/data/build_date.txt,sha256=iGs8QX_FYWZn7LBC-nwnjX8Ul1Sb9cklgACl5eIHb2Q,40
|
|
71
|
+
scanoss/data/osadl-copyleft.json,sha256=O9b2XAfpjQY0TL0fYzO6kwMcp5IwQbF6f_YWbB10MhQ,4761
|
|
72
|
+
scanoss/data/scanoss-settings-schema.json,sha256=ClkRYAkjAN0Sk704G8BE_Ok006oQ6YnIGmX84CF8h9w,8798
|
|
73
|
+
scanoss/data/spdx-exceptions.json,sha256=s7UTYxC7jqQXr11YBlIWYCNwN6lRDFTR33Y8rpN_dA4,17953
|
|
74
|
+
scanoss/data/spdx-licenses.json,sha256=A6Z0q82gaTLtnopBfzeIVZjJFxkdRW1g2TuumQc-lII,228794
|
|
75
|
+
scanoss/export/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
|
|
76
|
+
scanoss/export/dependency_track.py,sha256=A_xQH6_r9xL_fth1Wr770GCTRFVyn7XcUPfVUsXp4-w,9271
|
|
77
|
+
scanoss/inspection/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
|
|
78
|
+
scanoss/inspection/policy_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
79
|
+
scanoss/inspection/policy_check/policy_check.py,sha256=nMb5ogRDntYMebm3xrIBde2GqNuzOCAsawyldEtfWkA,8365
|
|
80
|
+
scanoss/inspection/policy_check/dependency_track/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
|
+
scanoss/inspection/policy_check/dependency_track/project_violation.py,sha256=elc35kWffWxOoF8YMi50hK_obtc1Xa8E3dwUnz7WXcA,20713
|
|
82
|
+
scanoss/inspection/policy_check/scanoss/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
|
+
scanoss/inspection/policy_check/scanoss/copyleft.py,sha256=ykTU4ZfK0V3iIboE8D5boJ4PlqQz6aqJoc4pvbEsVhQ,9659
|
|
84
|
+
scanoss/inspection/policy_check/scanoss/undeclared_component.py,sha256=ZkqPbfFzUHNEde-iVRWUSpkNKMTW_rOZQqG0y94MtUU,11673
|
|
85
|
+
scanoss/inspection/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
|
+
scanoss/inspection/summary/component_summary.py,sha256=ZaQzvZBQDFtow43UC9bij5NCTHjY_QAEqIUyRp3KtWk,7308
|
|
87
|
+
scanoss/inspection/summary/license_summary.py,sha256=BC_REu2e4PkMHp0ttvSdf6yRW3MvFc623fT6_Ze_TQA,7958
|
|
88
|
+
scanoss/inspection/summary/match_summary.py,sha256=GdjIV7ws7fanQTVdBigYGx3683KPL6e6HO4wuXTKq9g,13812
|
|
89
|
+
scanoss/inspection/utils/file_utils.py,sha256=b-xTH6FSyPpl3EPZ9WzK0c4734yE9mAexT1_YLLqymE,1641
|
|
90
|
+
scanoss/inspection/utils/license_utils.py,sha256=7jjtNcQPL_QNHY22drQqh7D7Pskq_AvAY1rLHAJWAhI,4809
|
|
91
|
+
scanoss/inspection/utils/markdown_utils.py,sha256=zkFs48TM-NR6nUHYOyQmHCwV82_fUsks5UB4BmyGifU,2446
|
|
92
|
+
scanoss/inspection/utils/scan_result_processor.py,sha256=zSPSWDBTqwRrF-pE6YaXi7tTYS4t1Qw_YIqw3hWvkW8,17736
|
|
93
|
+
scanoss/scanners/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
|
|
94
|
+
scanoss/scanners/container_scanner.py,sha256=fOrb64owrstX7LnTuxiIan059YgLeKXeBS6g2QaCyq0,16346
|
|
95
|
+
scanoss/scanners/folder_hasher.py,sha256=UzOmtYTLMqeL3Jf4CpvT-L4qaPNCy9-7xV0BwYhAuRc,12973
|
|
96
|
+
scanoss/scanners/scanner_config.py,sha256=egG7cw3S2akU-D9M1aLE5jLrfz_c8e7_DIotMnnpM84,2601
|
|
97
|
+
scanoss/scanners/scanner_hfh.py,sha256=gn2DnWD0J1_EPAKm5Zmu6ZjbGBPPSdz0YjqcPESPE-c,9512
|
|
98
|
+
scanoss/services/dependency_track_service.py,sha256=JIpqev4I-x_ZajMxD5W2Y3OAUvEJ_4nstzAPV90vfP8,5070
|
|
99
|
+
scanoss/utils/__init__.py,sha256=0hjb5ktavp7utJzFhGMPImPaZiHWgilM2HwvTp5lXJE,1122
|
|
100
|
+
scanoss/utils/abstract_presenter.py,sha256=teiDTxBj5jBMCk2T8i4l1BJPf_u4zBLWrtCTFHSSECM,3148
|
|
101
|
+
scanoss/utils/crc64.py,sha256=TMrwQimSdE6imhFOUL7oAG6Kxu-8qMpGWMuMg8QpSVs,3169
|
|
102
|
+
scanoss/utils/file.py,sha256=62cA9a17TU9ZvfA3FY5HY4-QOajJeSrc8S6xLA_f-3M,2980
|
|
103
|
+
scanoss/utils/scanoss_scan_results_utils.py,sha256=ho9-DKefHFJlVZkw4gXOmMI-mgPIbV9Y2ftkI83fC1k,1727
|
|
104
|
+
scanoss/utils/simhash.py,sha256=6iu8DOcecPAY36SZjCOzrrLMT9oIE7-gI6QuYwUQ7B0,5793
|
|
105
|
+
scanoss-1.43.1.dist-info/licenses/LICENSE,sha256=LLUaXoiyOroIbr5ubAyrxBOwSRLTm35ETO2FmLpy8QQ,1074
|
|
106
|
+
scanoss-1.43.1.dist-info/METADATA,sha256=DNoaMcUBfFRxK_HK8jRU_kGY-Beh-FGK314qzEUqhT4,6181
|
|
107
|
+
scanoss-1.43.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
108
|
+
scanoss-1.43.1.dist-info/entry_points.txt,sha256=Uy28xnaDL5KQ7V77sZD5VLDXPNxYYzSr5tsqtiXVzAs,48
|
|
109
|
+
scanoss-1.43.1.dist-info/top_level.txt,sha256=V11PrQ6Pnrc-nDF9xnisnJ8e6-i7HqSIKVNqduRWcL8,27
|
|
110
|
+
scanoss-1.43.1.dist-info/RECORD,,
|