conviso-ast 3.0.0__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.
Files changed (128) hide show
  1. conviso_ast-3.0.0.data/scripts/flow_bash_completer.sh +21 -0
  2. conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish +1 -0
  3. conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh +32 -0
  4. conviso_ast-3.0.0.dist-info/METADATA +37 -0
  5. conviso_ast-3.0.0.dist-info/RECORD +128 -0
  6. conviso_ast-3.0.0.dist-info/WHEEL +5 -0
  7. conviso_ast-3.0.0.dist-info/entry_points.txt +3 -0
  8. conviso_ast-3.0.0.dist-info/top_level.txt +1 -0
  9. convisoappsec/__init__.py +0 -0
  10. convisoappsec/common/__init__.py +5 -0
  11. convisoappsec/common/box.py +251 -0
  12. convisoappsec/common/cleaner.py +78 -0
  13. convisoappsec/common/docker.py +399 -0
  14. convisoappsec/common/exceptions.py +8 -0
  15. convisoappsec/common/git_data_parser.py +76 -0
  16. convisoappsec/common/graphql/__init__.py +0 -0
  17. convisoappsec/common/graphql/error_handlers.py +75 -0
  18. convisoappsec/common/graphql/errors.py +16 -0
  19. convisoappsec/common/graphql/low_client.py +51 -0
  20. convisoappsec/common/retry_handler.py +40 -0
  21. convisoappsec/common/strings.py +8 -0
  22. convisoappsec/flow/__init__.py +3 -0
  23. convisoappsec/flow/api.py +104 -0
  24. convisoappsec/flow/cleaner.py +118 -0
  25. convisoappsec/flow/graphql_api/__init__.py +0 -0
  26. convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  27. convisoappsec/flow/graphql_api/beta/client.py +18 -0
  28. convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  29. convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  30. convisoappsec/flow/graphql_api/beta/models/issues/container.py +72 -0
  31. convisoappsec/flow/graphql_api/beta/models/issues/iac.py +6 -0
  32. convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +13 -0
  33. convisoappsec/flow/graphql_api/beta/models/issues/sast.py +53 -0
  34. convisoappsec/flow/graphql_api/beta/models/issues/sca.py +78 -0
  35. convisoappsec/flow/graphql_api/beta/resources_api.py +142 -0
  36. convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  37. convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +61 -0
  38. convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  39. convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  40. convisoappsec/flow/graphql_api/v1/client.py +46 -0
  41. convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  42. convisoappsec/flow/graphql_api/v1/models/asset.py +14 -0
  43. convisoappsec/flow/graphql_api/v1/models/issues.py +16 -0
  44. convisoappsec/flow/graphql_api/v1/models/project.py +35 -0
  45. convisoappsec/flow/graphql_api/v1/resources_api.py +489 -0
  46. convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  47. convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +212 -0
  48. convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +180 -0
  49. convisoappsec/flow/source_code_scanner/__init__.py +9 -0
  50. convisoappsec/flow/source_code_scanner/exceptions.py +2 -0
  51. convisoappsec/flow/source_code_scanner/scc.py +68 -0
  52. convisoappsec/flow/source_code_scanner/source_code_scanner.py +177 -0
  53. convisoappsec/flow/util/__init__.py +7 -0
  54. convisoappsec/flow/util/ci_provider.py +99 -0
  55. convisoappsec/flow/util/metrics.py +16 -0
  56. convisoappsec/flow/util/source_code_compressor.py +22 -0
  57. convisoappsec/flow/version_control_system_adapter.py +528 -0
  58. convisoappsec/flow/version_searchers/__init__.py +9 -0
  59. convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +85 -0
  60. convisoappsec/flow/version_searchers/timebased_version_seacher.py +39 -0
  61. convisoappsec/flow/version_searchers/version_searcher_result.py +33 -0
  62. convisoappsec/flow/versioning_style/__init__.py +0 -0
  63. convisoappsec/flow/versioning_style/semantic_versioning.py +44 -0
  64. convisoappsec/flowcli/__init__.py +3 -0
  65. convisoappsec/flowcli/__main__.py +4 -0
  66. convisoappsec/flowcli/assets/__init__.py +4 -0
  67. convisoappsec/flowcli/assets/create.py +88 -0
  68. convisoappsec/flowcli/assets/entrypoint.py +20 -0
  69. convisoappsec/flowcli/assets/ls.py +63 -0
  70. convisoappsec/flowcli/ast/__init__.py +3 -0
  71. convisoappsec/flowcli/ast/entrypoint.py +427 -0
  72. convisoappsec/flowcli/common.py +175 -0
  73. convisoappsec/flowcli/companies/__init__.py +0 -0
  74. convisoappsec/flowcli/companies/ls.py +25 -0
  75. convisoappsec/flowcli/container/__init__.py +3 -0
  76. convisoappsec/flowcli/container/entrypoint.py +17 -0
  77. convisoappsec/flowcli/container/run.py +306 -0
  78. convisoappsec/flowcli/context.py +49 -0
  79. convisoappsec/flowcli/deploy/__init__.py +0 -0
  80. convisoappsec/flowcli/deploy/create/__init__.py +4 -0
  81. convisoappsec/flowcli/deploy/create/context.py +12 -0
  82. convisoappsec/flowcli/deploy/create/entrypoint.py +31 -0
  83. convisoappsec/flowcli/deploy/create/with_/__init__.py +3 -0
  84. convisoappsec/flowcli/deploy/create/with_/entrypoint.py +20 -0
  85. convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +4 -0
  86. convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +11 -0
  87. convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +30 -0
  88. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +4 -0
  89. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +21 -0
  90. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +84 -0
  91. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +115 -0
  92. convisoappsec/flowcli/deploy/create/with_/values.py +133 -0
  93. convisoappsec/flowcli/entrypoint.py +103 -0
  94. convisoappsec/flowcli/environment_checker.py +45 -0
  95. convisoappsec/flowcli/findings/__init__.py +4 -0
  96. convisoappsec/flowcli/findings/create/__init__.py +4 -0
  97. convisoappsec/flowcli/findings/create/entrypoint.py +18 -0
  98. convisoappsec/flowcli/findings/create/with_/__init__.py +3 -0
  99. convisoappsec/flowcli/findings/create/with_/entrypoint.py +19 -0
  100. convisoappsec/flowcli/findings/create/with_/version_tracker.py +93 -0
  101. convisoappsec/flowcli/findings/entrypoint.py +19 -0
  102. convisoappsec/flowcli/findings/import_sarif/__init__.py +4 -0
  103. convisoappsec/flowcli/findings/import_sarif/entrypoint.py +430 -0
  104. convisoappsec/flowcli/help_option.py +18 -0
  105. convisoappsec/flowcli/iac/__init__.py +3 -0
  106. convisoappsec/flowcli/iac/entrypoint.py +17 -0
  107. convisoappsec/flowcli/iac/run.py +328 -0
  108. convisoappsec/flowcli/requirements_verifier.py +132 -0
  109. convisoappsec/flowcli/sast/__init__.py +3 -0
  110. convisoappsec/flowcli/sast/entrypoint.py +17 -0
  111. convisoappsec/flowcli/sast/run.py +485 -0
  112. convisoappsec/flowcli/sbom/__init__.py +3 -0
  113. convisoappsec/flowcli/sbom/entrypoint.py +17 -0
  114. convisoappsec/flowcli/sbom/generate.py +235 -0
  115. convisoappsec/flowcli/sca/__init__.py +3 -0
  116. convisoappsec/flowcli/sca/entrypoint.py +17 -0
  117. convisoappsec/flowcli/sca/run.py +479 -0
  118. convisoappsec/flowcli/vulnerability/__init__.py +3 -0
  119. convisoappsec/flowcli/vulnerability/assert_security_rules.py +201 -0
  120. convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +175 -0
  121. convisoappsec/flowcli/vulnerability/entrypoint.py +18 -0
  122. convisoappsec/flowcli/vulnerability/rules_schema.json +53 -0
  123. convisoappsec/flowcli/vulnerability/run.py +487 -0
  124. convisoappsec/logger.py +29 -0
  125. convisoappsec/sast/__init__.py +0 -0
  126. convisoappsec/sast/decision.py +45 -0
  127. convisoappsec/sast/sastbox.py +296 -0
  128. convisoappsec/version.py +1 -0
@@ -0,0 +1,235 @@
1
+ import shutil
2
+ import click
3
+ import subprocess
4
+ import tempfile
5
+ import os
6
+ from convisoappsec.flowcli.context import pass_flow_context
7
+ from datetime import datetime
8
+ from convisoappsec.flowcli.requirements_verifier import RequirementsVerifier
9
+ from convisoappsec.flowcli import help_option
10
+ from convisoappsec.flowcli.common import asset_id_option
11
+
12
+
13
+ @click.command()
14
+ @asset_id_option(required=False)
15
+ @click.option(
16
+ '-r',
17
+ '--repository-dir',
18
+ default=".",
19
+ show_default=True,
20
+ type=click.Path(
21
+ exists=True,
22
+ resolve_path=True,
23
+ ),
24
+ required=False,
25
+ help="The source code repository directory.",
26
+ )
27
+ @click.option(
28
+ "--send-to-flow/--no-send-to-flow",
29
+ default=True,
30
+ show_default=True,
31
+ required=False,
32
+ help="""Enable or disable the ability of send analysis result
33
+ reports to flow.""",
34
+ hidden=True
35
+ )
36
+ @click.option(
37
+ "--custom-sca-tags",
38
+ hidden=True,
39
+ required=False,
40
+ multiple=True,
41
+ type=(str, str),
42
+ help="""It should be passed as <repository_name> <image_tag>. It accepts multiple values"""
43
+ )
44
+ @click.option(
45
+ "--scanner-timeout",
46
+ hidden=True,
47
+ required=False,
48
+ default=7200,
49
+ type=int,
50
+ help="Set timeout for each scanner"
51
+ )
52
+ @click.option(
53
+ "--parallel-workers",
54
+ hidden=True,
55
+ required=False,
56
+ default=2,
57
+ type=int,
58
+ help="Set max parallel workers"
59
+ )
60
+ @click.option(
61
+ "--deploy-id",
62
+ default=None,
63
+ required=False,
64
+ hidden=True,
65
+ envvar=("CONVISO_DEPLOY_ID", "FLOW_DEPLOY_ID")
66
+ )
67
+ @click.option(
68
+ '--experimental',
69
+ default=False,
70
+ is_flag=True,
71
+ hidden=True,
72
+ help="Enable experimental features.",
73
+ )
74
+ @click.option(
75
+ "--company-id",
76
+ required=False,
77
+ envvar=("CONVISO_COMPANY_ID", "FLOW_COMPANY_ID"),
78
+ help="Company ID on Conviso Platform",
79
+ )
80
+ @click.option(
81
+ '--asset-name',
82
+ required=False,
83
+ envvar=("CONVISO_ASSET_NAME", "FLOW_ASSET_NAME"),
84
+ help="Provides a asset name.",
85
+ )
86
+ @click.option(
87
+ '--vulnerability-auto-close',
88
+ default=False,
89
+ is_flag=True,
90
+ hidden=True,
91
+ help="Enable auto fixing vulnerabilities on cp.",
92
+ )
93
+ @click.option(
94
+ '--from-ast',
95
+ default=False,
96
+ is_flag=True,
97
+ hidden=True,
98
+ help="Internal use only.",
99
+ )
100
+ @click.option(
101
+ '--control-sync-status-id',
102
+ required=False,
103
+ hidden=True,
104
+ help="Control sync status id.",
105
+ )
106
+ @help_option
107
+ @pass_flow_context
108
+ @click.pass_context
109
+ def generate(context, flow_context, asset_id, company_id, repository_dir, send_to_flow, custom_sca_tags,
110
+ scanner_timeout, parallel_workers, deploy_id, experimental, asset_name, vulnerability_auto_close,
111
+ from_ast, control_sync_status_id):
112
+ # Prepare context if not coming from AST
113
+ if not from_ast:
114
+ try:
115
+ prepared_context = RequirementsVerifier.prepare_context(context)
116
+ except Exception as e:
117
+ log_func(f"⚠️ Error preparing context: {e}. Exiting.")
118
+ return
119
+
120
+ # Copy parameters from locals or prepared_context
121
+ params_to_copy = [
122
+ 'asset_id', 'company_id', 'repository_dir', 'send_to_flow',
123
+ 'deploy_id', 'custom_sca_tags', 'scanner_timeout', 'parallel_workers',
124
+ 'experimental', 'asset_name', 'vulnerability_auto_close'
125
+ ]
126
+ for param_name in params_to_copy:
127
+ context.params[param_name] = (
128
+ locals()[param_name] or prepared_context.params[param_name]
129
+ )
130
+
131
+ # Generate SBOM file
132
+ log_func("💬 Generating SBOM file...")
133
+ try:
134
+ asset_name = context.params['asset_name']
135
+ temp_dir = tempfile.gettempdir()
136
+ timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
137
+ sanitized_asset_name = (asset_name or "").replace(" ", "_").replace("(", "").replace(")", "")
138
+ file_name = os.path.join(temp_dir, f"sbom_{sanitized_asset_name}_{timestamp}.json")
139
+
140
+ exclude_patterns = [
141
+ "**/.github/**",
142
+ "**/node_modules/**",
143
+ "**/target/**",
144
+ "**/vendor/**",
145
+ "**/build/**",
146
+ "**/dist/**",
147
+
148
+ "**/test/**",
149
+ "**/tests/**",
150
+ "**/__pycache__/**",
151
+
152
+ "**/*.dll",
153
+ "**/*.exe",
154
+ "**/*.so"
155
+ ]
156
+
157
+ exclude_string = ",".join(exclude_patterns)
158
+ command = f'cdxgen -o {file_name} --exclude "{exclude_string}"'
159
+
160
+ catalogers = [
161
+ '-github-actions',
162
+ '-python-installed-package-cataloger',
163
+ '-sbom-cataloger',
164
+ '-file-content-cataloger',
165
+ '-file-digest-cataloger',
166
+ '-file-executable-cataloger',
167
+ '-file-metadata-cataloger'
168
+ ]
169
+
170
+ try:
171
+ if command_exists('cdxgen'):
172
+ subprocess.run(command, shell=True, check=True, capture_output=True)
173
+ else:
174
+ raise FileNotFoundError("cdxgen not found")
175
+
176
+ except (subprocess.CalledProcessError, FileNotFoundError) as e:
177
+ print(f"[!] cdxgen failed ({e}), falling back to syft...")
178
+ subprocess.run(
179
+ "curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b conviso/",
180
+ shell=True,
181
+ stdout=subprocess.DEVNULL,
182
+ stderr=subprocess.DEVNULL
183
+ )
184
+ command = [f"./conviso/syft scan {repository_dir} -o cyclonedx-json={file_name} "
185
+ f"--select-catalogers '{','.join(catalogers)}'"]
186
+
187
+ subprocess.run(command, shell=True, check=True, capture_output=True)
188
+
189
+ directory = 'conviso/'
190
+ if os.path.isdir(directory):
191
+ shutil.rmtree(directory)
192
+
193
+ log_func("✅ SBOM file generated successfully!")
194
+ except subprocess.CalledProcessError as error:
195
+ log_func(f"⚠️ Error generating SBOM file: {error}.")
196
+ return
197
+ except Exception as e:
198
+ log_func(f"⚠️ Unexpected error during SBOM generation: {e}")
199
+ return
200
+
201
+ # Ensure asset_id and company_id is available
202
+ asset_id = asset_id or context.params.get('asset_id')
203
+ company_id = company_id or context.params.get('company_id')
204
+
205
+ if not asset_id:
206
+ log_func(f"⚠️ Missing asset_id. Unable to send SBOM.")
207
+ return
208
+
209
+ # Send SBOM file to CSC (Conviso Platform)
210
+ try:
211
+ send_sbom_file_to_csc(company_id=company_id, asset_id=asset_id, file=file_name)
212
+ except Exception as e:
213
+ log_func(f"⚠️ Error sending SBOM file to Conviso: {e}")
214
+ return
215
+
216
+
217
+ @pass_flow_context
218
+ def send_sbom_file_to_csc(flow_context, company_id, asset_id, file):
219
+ try:
220
+ conviso_api = flow_context.create_conviso_graphql_client()
221
+ api_key = flow_context.key
222
+
223
+ log_func("💬 Sending SBOM to the Conviso Platform...")
224
+ conviso_api.sbom.send_sbom_file(company_id=company_id, asset_id=asset_id, file_path=file, api_key=api_key)
225
+ log_func("✅ SBOM file sent successfully!")
226
+ except Exception as e:
227
+ log_func(f"⚠️ Failed to send SBOM file: {e}")
228
+
229
+
230
+ def command_exists(command):
231
+ return shutil.which(command) is not None
232
+
233
+
234
+ def log_func(msg, new_line=True):
235
+ click.echo(click.style(msg), nl=new_line, err=True)
@@ -0,0 +1,3 @@
1
+ from .entrypoint import sca
2
+
3
+ __all__ = ['sca']
@@ -0,0 +1,17 @@
1
+ import click
2
+
3
+ from convisoappsec.flowcli import help_option
4
+ from .run import run
5
+
6
+
7
+ @click.group()
8
+ @help_option
9
+ def sca():
10
+ pass
11
+
12
+
13
+ sca.add_command(run)
14
+
15
+ sca.epilog = '''
16
+ Run flow sca COMMAND --help for more information on a command.
17
+ '''