scanoss 1.17.3__tar.gz → 1.17.5__tar.gz

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.
Files changed (73) hide show
  1. {scanoss-1.17.3/src/scanoss.egg-info → scanoss-1.17.5}/PKG-INFO +1 -1
  2. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/__init__.py +1 -1
  3. scanoss-1.17.5/src/scanoss/data/build_date.txt +1 -0
  4. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanner.py +59 -47
  5. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/winnowing.py +9 -4
  6. {scanoss-1.17.3 → scanoss-1.17.5/src/scanoss.egg-info}/PKG-INFO +1 -1
  7. scanoss-1.17.3/src/scanoss/data/build_date.txt +0 -1
  8. {scanoss-1.17.3 → scanoss-1.17.5}/LICENSE +0 -0
  9. {scanoss-1.17.3 → scanoss-1.17.5}/PACKAGE.md +0 -0
  10. {scanoss-1.17.3 → scanoss-1.17.5}/README.md +0 -0
  11. {scanoss-1.17.3 → scanoss-1.17.5}/pyproject.toml +0 -0
  12. {scanoss-1.17.3 → scanoss-1.17.5}/setup.cfg +0 -0
  13. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/__init__.py +0 -0
  14. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/options/__init__.py +0 -0
  15. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/options/annotations_pb2.py +0 -0
  16. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/options/annotations_pb2_grpc.py +0 -0
  17. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/options/openapiv2_pb2.py +0 -0
  18. {scanoss-1.17.3 → scanoss-1.17.5}/src/protoc_gen_swagger/options/openapiv2_pb2_grpc.py +0 -0
  19. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/__init__.py +0 -0
  20. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/common/__init__.py +0 -0
  21. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/common/v2/__init__.py +0 -0
  22. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/common/v2/scanoss_common_pb2.py +0 -0
  23. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/common/v2/scanoss_common_pb2_grpc.py +0 -0
  24. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/components/__init__.py +0 -0
  25. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/components/v2/__init__.py +0 -0
  26. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/components/v2/scanoss_components_pb2.py +0 -0
  27. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/components/v2/scanoss_components_pb2_grpc.py +0 -0
  28. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py +0 -0
  29. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py +0 -0
  30. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/dependencies/__init__.py +0 -0
  31. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/dependencies/v2/__init__.py +0 -0
  32. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py +0 -0
  33. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py +0 -0
  34. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/scanning/__init__.py +0 -0
  35. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/scanning/v2/__init__.py +0 -0
  36. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/scanning/v2/scanoss_scanning_pb2.py +0 -0
  37. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py +0 -0
  38. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/semgrep/__init__.py +0 -0
  39. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/semgrep/v2/__init__.py +0 -0
  40. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py +0 -0
  41. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py +0 -0
  42. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/vulnerabilities/__init__.py +0 -0
  43. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/vulnerabilities/v2/__init__.py +0 -0
  44. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py +0 -0
  45. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py +0 -0
  46. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/cli.py +0 -0
  47. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/components.py +0 -0
  48. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/csvoutput.py +0 -0
  49. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/cyclonedx.py +0 -0
  50. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/data/spdx-exceptions.json +0 -0
  51. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/data/spdx-licenses.json +0 -0
  52. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/filecount.py +0 -0
  53. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/inspection/__init__.py +0 -0
  54. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/inspection/copyleft.py +0 -0
  55. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/inspection/policy_check.py +0 -0
  56. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/inspection/undeclared_component.py +0 -0
  57. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/inspection/utils/license_utils.py +0 -0
  58. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/results.py +0 -0
  59. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scancodedeps.py +0 -0
  60. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanoss_settings.py +0 -0
  61. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanossapi.py +0 -0
  62. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanossbase.py +0 -0
  63. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanossgrpc.py +0 -0
  64. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scanpostprocessor.py +0 -0
  65. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/scantype.py +0 -0
  66. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/spdxlite.py +0 -0
  67. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/threadeddependencies.py +0 -0
  68. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss/threadedscanning.py +0 -0
  69. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss.egg-info/SOURCES.txt +0 -0
  70. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss.egg-info/dependency_links.txt +0 -0
  71. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss.egg-info/entry_points.txt +0 -0
  72. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss.egg-info/requires.txt +0 -0
  73. {scanoss-1.17.3 → scanoss-1.17.5}/src/scanoss.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scanoss
3
- Version: 1.17.3
3
+ Version: 1.17.5
4
4
  Summary: Simple Python library to leverage the SCANOSS APIs
5
5
  Home-page: https://scanoss.com
6
6
  Author: SCANOSS
@@ -22,4 +22,4 @@
22
22
  THE SOFTWARE.
23
23
  """
24
24
 
25
- __version__ = "1.17.3"
25
+ __version__ = '1.17.5'
@@ -0,0 +1 @@
1
+ date: 20241112100104, utime: 1731405664
@@ -25,6 +25,7 @@ import json
25
25
  import os
26
26
  import sys
27
27
  import datetime
28
+ from typing import Any, Dict, List, Optional
28
29
  import importlib_resources
29
30
 
30
31
  from progress.bar import Bar
@@ -490,66 +491,41 @@ class Scanner(ScanossBase):
490
491
  success = False
491
492
  return success
492
493
 
493
- def __finish_scan_threaded(self, file_map: dict = None) -> bool:
494
- """
495
- Wait for the threaded scans to complete
496
- :param file_map: mapping of obfuscated files back into originals
497
- :return: True if successful, False otherwise
494
+ def __finish_scan_threaded(self, file_map: Optional[Dict[Any, Any]] = None) -> bool:
495
+ """Wait for the threaded scan to complete and process the results
496
+
497
+ Args:
498
+ file_map: Mapping of obfuscated files back to originals
499
+
500
+ Returns:
501
+ bool: True if successful, False otherwise
502
+
503
+ Raises:
504
+ ValueError: If output format is invalid
498
505
  """
499
- success = True
500
- responses = None
506
+ success: bool = True
507
+ scan_responses = None
501
508
  dep_responses = None
502
509
  if self.is_file_or_snippet_scan():
503
510
  if not self.threaded_scan.complete(): # Wait for the scans to complete
504
511
  self.print_stderr(f'Warning: Scanning analysis ran into some trouble.')
505
512
  success = False
506
513
  self.threaded_scan.complete_bar()
507
- responses = self.threaded_scan.responses
514
+ scan_responses = self.threaded_scan.responses
508
515
  if self.is_dependency_scan():
509
516
  self.print_msg('Retrieving dependency data...')
510
517
  if not self.threaded_deps.complete():
511
- self.print_stderr(f'Warning: Dependency analysis ran into some trouble.')
518
+ self.print_stderr(
519
+ f'Warning: Dependency analysis ran into some trouble.'
520
+ )
512
521
  success = False
513
522
  dep_responses = self.threaded_deps.responses
514
- # self.print_stderr(f'Dep Data: {dep_responses}')
515
- # TODO change to dictionary
516
- raw_output = "{\n"
517
- # TODO look into merging the two dictionaries. See https://favtutor.com/blogs/merge-dictionaries-python
518
- if responses or dep_responses:
519
- first = True
520
- if responses:
521
- for scan_resp in responses:
522
- if scan_resp is not None:
523
- for key, value in scan_resp.items():
524
- if file_map: # We have a map for obfuscated files. Check if we can revert it
525
- fm = file_map.get(key)
526
- if fm:
527
- key = fm # Replace the obfuscated filename
528
- if first:
529
- raw_output += " \"%s\":%s" % (key, json.dumps(value, indent=2))
530
- first = False
531
- else:
532
- raw_output += ",\n \"%s\":%s" % (key, json.dumps(value, indent=2))
533
- # End for loop
534
- if dep_responses:
535
- dep_files = dep_responses.get("files")
536
- if dep_files and len(dep_files) > 0:
537
- for dep_file in dep_files:
538
- file = dep_file.pop("file", None)
539
- if file is not None:
540
- if first:
541
- raw_output += " \"%s\":[%s]" % (file, json.dumps(dep_file, indent=2))
542
- first = False
543
- else:
544
- raw_output += ",\n \"%s\":[%s]" % (file, json.dumps(dep_file, indent=2))
545
- # End for loop
546
- raw_output += "\n}"
547
- try:
548
- raw_results = json.loads(raw_output)
549
- except Exception as e:
550
- raise Exception(f'ERROR: Problem decoding parsed json: {e}')
551
523
 
552
- results = self.post_processor.load_results(raw_results).post_process()
524
+ raw_scan_results = self._merge_scan_results(
525
+ scan_responses, dep_responses, file_map
526
+ )
527
+
528
+ results = self.post_processor.load_results(raw_scan_results).post_process()
553
529
 
554
530
  if self.output_format == 'plain':
555
531
  self.__log_result(json.dumps(results, indent=2, sort_keys=True))
@@ -567,6 +543,42 @@ class Scanner(ScanossBase):
567
543
  success = False
568
544
  return success
569
545
 
546
+ def _merge_scan_results(
547
+ self,
548
+ scan_responses: Optional[List],
549
+ dep_responses: Optional[Dict[str,Any]],
550
+ file_map: Optional[Dict[str, Any]],
551
+ ) -> Dict[str, Any]:
552
+ """Merge scan and dependency responses into a single dictionary"""
553
+ results: Dict[str, Any] = {}
554
+
555
+ if scan_responses:
556
+ for response in scan_responses:
557
+ if response is not None:
558
+ if file_map:
559
+ response = self._deobfuscate_filenames(response, file_map)
560
+ results.update(response)
561
+
562
+ dep_files = dep_responses.get("files", None) if dep_responses else None
563
+ if dep_files:
564
+ for dep_file in dep_files:
565
+ file = dep_file.pop("file", None)
566
+ if file:
567
+ results[file] = [dep_file]
568
+
569
+ return results
570
+
571
+ def _deobfuscate_filenames(self, response: dict, file_map: dict) -> dict:
572
+ """Convert obfuscated filenames back to original names"""
573
+ deobfuscated = {}
574
+ for key, value in response.items():
575
+ deobfuscated_name = file_map.get(key, None)
576
+ if deobfuscated_name:
577
+ deobfuscated[deobfuscated_name] = value
578
+ else:
579
+ deobfuscated[key] = value
580
+ return deobfuscated
581
+
570
582
  def scan_file_with_options(self, file: str, deps_file: str = None, file_map: dict = None, dep_scope: SCOPE = None,
571
583
  dep_scope_include: str = None, dep_scope_exclude: str = None) -> bool:
572
584
  """
@@ -29,6 +29,7 @@
29
29
  """
30
30
  import hashlib
31
31
  import pathlib
32
+ import platform
32
33
  import re
33
34
 
34
35
  from crc32c import crc32c
@@ -307,11 +308,15 @@ class Winnowing(ScanossBase):
307
308
  return ''
308
309
  # Print file line
309
310
  content_length = len(contents)
310
- wfp_filename = repr(file).strip("'") # return a utf-8 compatible version of the filename
311
+ original_filename = file
312
+
313
+ if platform.system() == 'Windows':
314
+ original_filename = file.replace('\\', '/')
315
+ wfp_filename = repr(original_filename).strip("'") # return a utf-8 compatible version of the filename
311
316
  if self.obfuscate: # hide the real size of the file and its name, but keep the suffix
312
- wfp_filename = f'{self.ob_count}{pathlib.Path(file).suffix}'
317
+ wfp_filename = f'{self.ob_count}{pathlib.Path(original_filename).suffix}'
313
318
  self.ob_count = self.ob_count + 1
314
- self.file_map[wfp_filename] = file # Save the file name map for later (reverse lookup)
319
+ self.file_map[wfp_filename] = original_filename # Save the file name map for later (reverse lookup)
315
320
 
316
321
  wfp = 'file={0},{1},{2}\n'.format(file_md5, content_length, wfp_filename)
317
322
  # We don't process snippets for binaries, or other uninteresting files, or if we're requested to skip
@@ -464,7 +469,7 @@ class Winnowing(ScanossBase):
464
469
  crc = self.crc8_byte(crc, buffer[index])
465
470
  crc ^= CRC8_MAXIM_DOW_FINAL # Bitwise OR (XOR) of crc in Maxim Dow Final
466
471
  return crc
467
-
472
+
468
473
  #
469
474
  # End of Winnowing Class
470
475
  #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scanoss
3
- Version: 1.17.3
3
+ Version: 1.17.5
4
4
  Summary: Simple Python library to leverage the SCANOSS APIs
5
5
  Home-page: https://scanoss.com
6
6
  Author: SCANOSS
@@ -1 +0,0 @@
1
- date: 20241105131130, utime: 1730812290
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes