cycode 1.4.1.dev9__tar.gz → 1.4.1.dev11__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 (87) hide show
  1. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/PKG-INFO +1 -1
  2. cycode-1.4.1.dev11/cycode/__init__.py +1 -0
  3. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/consts.py +3 -0
  4. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/sca_table_printer.py +60 -14
  5. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/pyproject.toml +1 -1
  6. cycode-1.4.1.dev9/cycode/__init__.py +0 -1
  7. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/README.md +0 -0
  8. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/__init__.py +0 -0
  9. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/__init__.py +0 -0
  10. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/auth_command.py +0 -0
  11. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/auth/auth_manager.py +0 -0
  12. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/ci_integrations.py +0 -0
  13. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/code_scanner.py +0 -0
  14. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/configure/__init__.py +0 -0
  15. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/configure/configure_command.py +0 -0
  16. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/ignore/__init__.py +0 -0
  17. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/ignore/ignore_command.py +0 -0
  18. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/__init__.py +0 -0
  19. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/report_command.py +0 -0
  20. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/__init__.py +0 -0
  21. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/common.py +0 -0
  22. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/handle_errors.py +0 -0
  23. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_command.py +0 -0
  24. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_path_command.py +0 -0
  25. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_report_file.py +0 -0
  26. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/commands/report/sbom/sbom_repository_url_command.py +0 -0
  27. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/config.py +0 -0
  28. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/config.yaml +0 -0
  29. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/exceptions/__init__.py +0 -0
  30. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/exceptions/custom_exceptions.py +0 -0
  31. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/__init__.py +0 -0
  32. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/excluder.py +0 -0
  33. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/iac/__init__.py +0 -0
  34. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
  35. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/models/__init__.py +0 -0
  36. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
  37. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/path_documents.py +0 -0
  38. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/repository_documents.py +0 -0
  39. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/__init__.py +0 -0
  40. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
  41. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/base_restore_maven_dependencies.py +0 -0
  42. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
  43. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
  44. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/sca/sca_code_scanner.py +0 -0
  45. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/files_collector/zip_documents.py +0 -0
  46. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/main.py +0 -0
  47. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/models.py +0 -0
  48. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/__init__.py +0 -0
  49. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/console_printer.py +0 -0
  50. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/json_printer.py +0 -0
  51. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/printer_base.py +0 -0
  52. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/__init__.py +0 -0
  53. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table.py +0 -0
  54. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_models.py +0 -0
  55. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_printer.py +0 -0
  56. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/tables/table_printer_base.py +0 -0
  57. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/printers/text_printer.py +0 -0
  58. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/__init__.py +0 -0
  59. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/base_file_manager.py +0 -0
  60. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/config_file_manager.py +0 -0
  61. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/configuration_manager.py +0 -0
  62. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/user_settings/credentials_manager.py +0 -0
  63. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/__init__.py +0 -0
  64. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/enum_utils.py +0 -0
  65. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/get_api_client.py +0 -0
  66. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/path_utils.py +0 -0
  67. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/progress_bar.py +0 -0
  68. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/scan_batch.py +0 -0
  69. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/scan_utils.py +0 -0
  70. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/shell_executor.py +0 -0
  71. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/string_utils.py +0 -0
  72. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/task_timer.py +0 -0
  73. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cli/utils/yaml_utils.py +0 -0
  74. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/__init__.py +0 -0
  75. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/auth_client.py +0 -0
  76. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/client_creator.py +0 -0
  77. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config.py +0 -0
  78. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config.yaml +0 -0
  79. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/config_dev.py +0 -0
  80. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_client.py +0 -0
  81. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_client_base.py +0 -0
  82. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_dev_based_client.py +0 -0
  83. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/cycode_token_based_client.py +0 -0
  84. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/models.py +0 -0
  85. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/report_client.py +0 -0
  86. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/scan_client.py +0 -0
  87. {cycode-1.4.1.dev9 → cycode-1.4.1.dev11}/cycode/cyclient/scan_config_base.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cycode
3
- Version: 1.4.1.dev9
3
+ Version: 1.4.1.dev11
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  Home-page: https://github.com/cycodehq/cycode-cli
6
6
  License: MIT
@@ -0,0 +1 @@
1
+ __version__ = '1.4.1.dev11' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -79,6 +79,8 @@ SCA_CONFIGURATION_SCAN_SUPPORTED_FILES = (
79
79
  'pipfile.lock',
80
80
  'requirements.txt',
81
81
  'setup.py',
82
+ 'mix.exs',
83
+ 'mix.lock',
82
84
  )
83
85
 
84
86
  SCA_EXCLUDED_PATHS = ('node_modules',)
@@ -97,6 +99,7 @@ PROJECT_FILES_BY_ECOSYSTEM_MAP = {
97
99
  'pypi_pipenv': ['Pipfile', 'Pipfile.lock'],
98
100
  'pypi_requirements': ['requirements.txt'],
99
101
  'pypi_setup': ['setup.py'],
102
+ 'hex': ['mix.exs', 'mix.lock'],
100
103
  }
101
104
 
102
105
  COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES = [SECRET_SCAN_TYPE, SCA_SCAN_TYPE]
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Dict, List
4
4
  import click
5
5
 
6
6
  from cycode.cli.consts import LICENSE_COMPLIANCE_POLICY_ID, PACKAGE_VULNERABILITY_POLICY_ID
7
- from cycode.cli.models import Detection
7
+ from cycode.cli.models import Detection, Severity
8
8
  from cycode.cli.printers.tables.table import Table
9
9
  from cycode.cli.printers.tables.table_models import ColumnInfoBuilder, ColumnWidths
10
10
  from cycode.cli.printers.tables.table_printer_base import TablePrinterBase
@@ -19,21 +19,21 @@ column_builder = ColumnInfoBuilder()
19
19
  # Building must have strict order. Represents the order of the columns in the table (from left to right)
20
20
  SEVERITY_COLUMN = column_builder.build(name='Severity')
21
21
  REPOSITORY_COLUMN = column_builder.build(name='Repository')
22
-
23
- FILE_PATH_COLUMN = column_builder.build(name='File Path')
22
+ CODE_PROJECT_COLUMN = column_builder.build(name='Code Project') # File path to manifest file
24
23
  ECOSYSTEM_COLUMN = column_builder.build(name='Ecosystem')
25
- DEPENDENCY_NAME_COLUMN = column_builder.build(name='Dependency Name')
26
- DIRECT_DEPENDENCY_COLUMN = column_builder.build(name='Direct Dependency')
27
- DEVELOPMENT_DEPENDENCY_COLUMN = column_builder.build(name='Development Dependency')
28
- DEPENDENCY_PATHS_COLUMN = column_builder.build(name='Dependency Paths')
29
-
24
+ PACKAGE_COLUMN = column_builder.build(name='Package')
30
25
  CVE_COLUMNS = column_builder.build(name='CVE')
26
+ DEPENDENCY_PATHS_COLUMN = column_builder.build(name='Dependency Paths')
31
27
  UPGRADE_COLUMN = column_builder.build(name='Upgrade')
32
28
  LICENSE_COLUMN = column_builder.build(name='License')
29
+ DIRECT_DEPENDENCY_COLUMN = column_builder.build(name='Direct Dependency')
30
+ DEVELOPMENT_DEPENDENCY_COLUMN = column_builder.build(name='Development Dependency')
31
+
33
32
 
34
33
  COLUMN_WIDTHS_CONFIG: ColumnWidths = {
35
34
  REPOSITORY_COLUMN: 2,
36
- FILE_PATH_COLUMN: 3,
35
+ CODE_PROJECT_COLUMN: 2,
36
+ PACKAGE_COLUMN: 3,
37
37
  CVE_COLUMNS: 5,
38
38
  UPGRADE_COLUMN: 3,
39
39
  LICENSE_COLUMN: 2,
@@ -47,7 +47,7 @@ class ScaTablePrinter(TablePrinterBase):
47
47
  table = self._get_table(policy_id)
48
48
  table.set_cols_width(COLUMN_WIDTHS_CONFIG)
49
49
 
50
- for detection in detections:
50
+ for detection in self._sort_and_group_detections(detections):
51
51
  self._enrich_table_with_values(table, detection)
52
52
 
53
53
  self._print_summary_issues(len(detections), self._get_title(policy_id))
@@ -64,6 +64,52 @@ class ScaTablePrinter(TablePrinterBase):
64
64
 
65
65
  return 'Unknown'
66
66
 
67
+ @staticmethod
68
+ def __group_by(detections: List[Detection], details_field_name: str) -> Dict[str, List[Detection]]:
69
+ grouped = defaultdict(list)
70
+ for detection in detections:
71
+ grouped[detection.detection_details.get(details_field_name)].append(detection)
72
+ return grouped
73
+
74
+ @staticmethod
75
+ def __severity_sort_key(detection: Detection) -> int:
76
+ severity = detection.detection_details.get('advisory_severity')
77
+ return Severity.try_get_value(severity)
78
+
79
+ def _sort_detections_by_severity(self, detections: List[Detection]) -> List[Detection]:
80
+ return sorted(detections, key=self.__severity_sort_key, reverse=True)
81
+
82
+ @staticmethod
83
+ def __package_sort_key(detection: Detection) -> int:
84
+ return detection.detection_details.get('package_name')
85
+
86
+ def _sort_detections_by_package(self, detections: List[Detection]) -> List[Detection]:
87
+ return sorted(detections, key=self.__package_sort_key)
88
+
89
+ def _sort_and_group_detections(self, detections: List[Detection]) -> List[Detection]:
90
+ """Sort detections by severity and group by repository, code project and package name.
91
+
92
+ Note:
93
+ Code Project is path to manifest file.
94
+
95
+ Grouping by code projects also groups by ecosystem.
96
+ Because manifest files are unique per ecosystem.
97
+ """
98
+ result = []
99
+
100
+ # we sort detections by package name to make persist output order
101
+ sorted_detections = self._sort_detections_by_package(detections)
102
+
103
+ grouped_by_repository = self.__group_by(sorted_detections, 'repository_name')
104
+ for repository_group in grouped_by_repository.values():
105
+ grouped_by_code_project = self.__group_by(repository_group, 'file_name')
106
+ for code_project_group in grouped_by_code_project.values():
107
+ grouped_by_package = self.__group_by(code_project_group, 'package_name')
108
+ for package_group in grouped_by_package.values():
109
+ result.extend(self._sort_detections_by_severity(package_group))
110
+
111
+ return result
112
+
67
113
  def _get_table(self, policy_id: str) -> Table:
68
114
  table = Table()
69
115
 
@@ -77,9 +123,9 @@ class ScaTablePrinter(TablePrinterBase):
77
123
  if self._is_git_repository():
78
124
  table.add(REPOSITORY_COLUMN)
79
125
 
80
- table.add(FILE_PATH_COLUMN)
126
+ table.add(CODE_PROJECT_COLUMN)
81
127
  table.add(ECOSYSTEM_COLUMN)
82
- table.add(DEPENDENCY_NAME_COLUMN)
128
+ table.add(PACKAGE_COLUMN)
83
129
  table.add(DIRECT_DEPENDENCY_COLUMN)
84
130
  table.add(DEVELOPMENT_DEPENDENCY_COLUMN)
85
131
  table.add(DEPENDENCY_PATHS_COLUMN)
@@ -93,9 +139,9 @@ class ScaTablePrinter(TablePrinterBase):
93
139
  table.set(SEVERITY_COLUMN, detection_details.get('advisory_severity'))
94
140
  table.set(REPOSITORY_COLUMN, detection_details.get('repository_name'))
95
141
 
96
- table.set(FILE_PATH_COLUMN, detection_details.get('file_name'))
142
+ table.set(CODE_PROJECT_COLUMN, detection_details.get('file_name'))
97
143
  table.set(ECOSYSTEM_COLUMN, detection_details.get('ecosystem'))
98
- table.set(DEPENDENCY_NAME_COLUMN, detection_details.get('package_name'))
144
+ table.set(PACKAGE_COLUMN, detection_details.get('package_name'))
99
145
  table.set(DIRECT_DEPENDENCY_COLUMN, detection_details.get('is_direct_dependency_str'))
100
146
  table.set(DEVELOPMENT_DEPENDENCY_COLUMN, detection_details.get('is_dev_dependency_str'))
101
147
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "cycode"
3
- version = "1.4.1.dev9" # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
3
+ version = "1.4.1.dev11" # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
4
4
  description = "Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning."
5
5
  keywords=["secret-scan", "cycode", "devops", "token", "secret", "security", "cycode", "code"]
6
6
  authors = ["Cycode <support@cycode.com>"]
@@ -1 +0,0 @@
1
- __version__ = '1.4.1.dev9' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
File without changes