conviso-cli 2.7.5__py3-none-any.whl → 2.7.7rc0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-cli
3
- Version: 2.7.5
3
+ Version: 2.7.7rc0
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
@@ -1,9 +1,9 @@
1
- conviso_cli-2.7.5.data/scripts/flow_bash_completer.sh,sha256=9q3HPuXq_FCUUV3IFGcOefsOLhPWatUkLY7txiBM7Uo,624
2
- conviso_cli-2.7.5.data/scripts/flow_fish_completer.fish,sha256=-wiuarawDJkms5N-rh99brIOzhy-ktsM1mi1ohQ3Mtg,147
3
- conviso_cli-2.7.5.data/scripts/flow_zsh_completer.sh,sha256=cAtTDGUs5sY4NAA7AjscmLWj0dbNZ9iZhLP6BTz6dEQ,844
1
+ conviso_cli-2.7.7rc0.data/scripts/flow_bash_completer.sh,sha256=9q3HPuXq_FCUUV3IFGcOefsOLhPWatUkLY7txiBM7Uo,624
2
+ conviso_cli-2.7.7rc0.data/scripts/flow_fish_completer.fish,sha256=-wiuarawDJkms5N-rh99brIOzhy-ktsM1mi1ohQ3Mtg,147
3
+ conviso_cli-2.7.7rc0.data/scripts/flow_zsh_completer.sh,sha256=cAtTDGUs5sY4NAA7AjscmLWj0dbNZ9iZhLP6BTz6dEQ,844
4
4
  convisoappsec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  convisoappsec/logger.py,sha256=aTNebqOau9nEadBySMTXtnbGkOkJ_q2kyFlX1mzizeg,1132
6
- convisoappsec/version.py,sha256=QEhHk7rIZjtv27FCBxLyNREA0fJeFCe9Yo7tvWc3xn0,22
6
+ convisoappsec/version.py,sha256=St8S_YhrpnoUcQiwYuaMF9JuGvfQKqPNtIsj9dWcRQ4,27
7
7
  convisoappsec/common/__init__.py,sha256=QN7tV2C_jhTiWUrJHv2jbeq6ae3MssgLUWpQZwe8O2s,105
8
8
  convisoappsec/common/box.py,sha256=WTtPF3YWxkcdblPmFTzrzQlPPPUwVsDt2zoi6xFMy1U,7561
9
9
  convisoappsec/common/cleaner.py,sha256=Iy8BWCXj_v51oovcYzI_uhaJzLL-fCUyDxrbBglfwEs,2680
@@ -23,7 +23,7 @@ convisoappsec/flow/version_control_system_adapter.py,sha256=glkG2pEIPSwBEFAZPHlq
23
23
  convisoappsec/flow/graphql_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  convisoappsec/flow/graphql_api/beta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  convisoappsec/flow/graphql_api/beta/client.py,sha256=PPisDsUjFriDCT2EpHNPvw7bD_qYwGArFErsWbpBgIk,502
26
- convisoappsec/flow/graphql_api/beta/resources_api.py,sha256=BKGVamCObXMxgK2ZVJLpUigwX7TNCBWyG9Mpti550wU,4339
26
+ convisoappsec/flow/graphql_api/beta/resources_api.py,sha256=lCJSFNJrHqO-OyLgNPTPaY7QdwQg9xWN5SZbPREStSs,4344
27
27
  convisoappsec/flow/graphql_api/beta/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  convisoappsec/flow/graphql_api/beta/models/issues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  convisoappsec/flow/graphql_api/beta/models/issues/container.py,sha256=-XJ5aA1ixd-QT-yNJwNdwxds_CkakEQDQxwbxFDiTj8,2392
@@ -35,15 +35,15 @@ convisoappsec/flow/graphql_api/beta/schemas/__init__.py,sha256=47DEQpj8HBSa-_TIm
35
35
  convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py,sha256=zD9sJLO23bpMJn3NTY8C0_UAYEsnezKbldant_VQxoA,1119
36
36
  convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  convisoappsec/flow/graphql_api/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- convisoappsec/flow/graphql_api/v1/client.py,sha256=bhtpYRWFiW8bvxScUwYKv7HamWAqNx_uckFDmrP42Po,1197
39
- convisoappsec/flow/graphql_api/v1/resources_api.py,sha256=aW3B9rxcX6tnduiwLiuZrDkV1UQPCj9PU5dyfZCKzIE,14887
38
+ convisoappsec/flow/graphql_api/v1/client.py,sha256=IzmDdBdy5fSZzKqm1Ic9xEnI16WuDuyOcnm7wJ-NV3c,1308
39
+ convisoappsec/flow/graphql_api/v1/resources_api.py,sha256=c8ujiXcUjZlk3vJSaMRIIvEOGe4kxXln01qRZYksxCg,15632
40
40
  convisoappsec/flow/graphql_api/v1/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  convisoappsec/flow/graphql_api/v1/models/asset.py,sha256=rhHgQKXaRheksCSc8neMWQwd-cKB-noPpeO423nKFUQ,430
42
42
  convisoappsec/flow/graphql_api/v1/models/issues.py,sha256=ZAM_aPwj20I7cApX1leCDVI8cX5LhcKAY1vkesNI_Ak,511
43
43
  convisoappsec/flow/graphql_api/v1/models/project.py,sha256=CDZlufsT-_iQIOgpOPAtdmcv0JvHWFd6TjcDIAj6w7c,972
44
44
  convisoappsec/flow/graphql_api/v1/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py,sha256=R9LgniQyj694h1MD7cn1-HJRDjI4PLiOrCmsqjp16ho,3251
46
- convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py,sha256=2jAgzA-8te6HyyV8RVAx0BnLDeZhFulZynbxm5JR8Sc,2713
46
+ convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py,sha256=ip5JO_EdDPzyjifHXfjlJTlpPs901QN-T8_Oo5DMtbE,3025
47
47
  convisoappsec/flow/util/__init__.py,sha256=32E3AbPrBf0stKOzCIvz7BeWtBjAScIt7FNyERjN-p4,99
48
48
  convisoappsec/flow/util/ci_provider.py,sha256=VYDESwNFbtrRcWDtTEb8tYDN5qbnLksmQI_ntsciJ4I,2093
49
49
  convisoappsec/flow/util/source_code_compressor.py,sha256=b2iA8Exf8wVbxR1mnvwTbruDjdpYyVloUmSlyYLSJQU,508
@@ -99,29 +99,29 @@ convisoappsec/flowcli/findings/import_sarif/entrypoint.py,sha256=MIHi9ZWU2Jn2o7o
99
99
  convisoappsec/flowcli/iac/__init__.py,sha256=a3IZzSKpm987fMEliTECDeXO_Eduk7eg-aQzmaWvUXQ,47
100
100
  convisoappsec/flowcli/iac/dry_run.py,sha256=xvC0Wb2Sxl37yEjFaFMGcRvLJ4Q8evrNQoUXuahHtCg,2990
101
101
  convisoappsec/flowcli/iac/entrypoint.py,sha256=WMlSwHd7cLxhUfy643OquQhUHEy4yNf7s0K5bkrXYno,295
102
- convisoappsec/flowcli/iac/run.py,sha256=q-bndWtZb9xYE9U_4aMHcZ3WtgHyXQBqUkjHTk-hdwI,11071
102
+ convisoappsec/flowcli/iac/run.py,sha256=H3zEYK1tRjt9unIUGWiiZ540YjcLAxdJrbX1QK7y_us,11199
103
103
  convisoappsec/flowcli/sast/__init__.py,sha256=S4O78eZGhgpT2lZY3GSUIUTQJB5a62uAVirEqbf4EQY,49
104
104
  convisoappsec/flowcli/sast/dry_run.py,sha256=lUi9LCfBlBjcAYm4v_Etl3raPZcTHVr5fVxGnB1eVSM,5787
105
105
  convisoappsec/flowcli/sast/entrypoint.py,sha256=XMu8WpZNwSujWOwbHUThk3JK_WtRWHau9kYD2ttjULY,300
106
106
  convisoappsec/flowcli/sast/run.py,sha256=7uX6K1VLASU8RnoCKNYIIqXSsNkF4JQ8OKhAG2CKjuI,16353
107
107
  convisoappsec/flowcli/sbom/__init__.py,sha256=qzwiPWniK41Y41XvJJhxtRZguHrSSenb57lhy64KnSc,49
108
108
  convisoappsec/flowcli/sbom/entrypoint.py,sha256=ax2WL5BtCu24NeZYe6zzCVZ2ujlviXkvtY7PZihlz3s,263
109
- convisoappsec/flowcli/sbom/generate.py,sha256=Oke4JX4vARqpsMlGC2cPye_LMapIMRDyZv2W14hoD8g,7170
109
+ convisoappsec/flowcli/sbom/generate.py,sha256=YEhl4fVRXRscSApTMkTynyka3ygsVgJD7vhUHipUp18,7190
110
110
  convisoappsec/flowcli/sca/__init__.py,sha256=xnVoxwbpe4LrEemmWJ6svr3zdpo9S4kEIvM4HVRsLX8,47
111
111
  convisoappsec/flowcli/sca/dry_run.py,sha256=fZ_tgc1k8Mn1JMznFWyi_CExR-gpLHLHwQ2erNldnHY,3438
112
112
  convisoappsec/flowcli/sca/entrypoint.py,sha256=yEAANSG2fcD3HctUWebhx_win3CW-1Q2CO1i-ZIBUCk,295
113
113
  convisoappsec/flowcli/sca/run.py,sha256=FWnTHgMgnIRvJSpMIkFcb6YMtvWEjEpKJyXEkjAZpA4,16725
114
114
  convisoappsec/flowcli/vulnerability/__init__.py,sha256=c18E0J1KfZBBqpv8XGxF5dv7dxCDquFkjGkdnvFDSYI,67
115
- convisoappsec/flowcli/vulnerability/assert_security_rules.py,sha256=j7VcondMeZSRxWz118aWS9qUSGdvsq4Mg-_9UXp8Dyw,6075
116
- convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py,sha256=EkJhbUm1DTP14mIg_ZC4SKFSlvTtfPpSpNAMWPkwrsc,6897
115
+ convisoappsec/flowcli/vulnerability/assert_security_rules.py,sha256=y_56aAfcuzt8nfMTXl5i8MLE6oqMrAK0UGk-gY6el7I,8154
116
+ convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py,sha256=Xos_7MHg2X1ZYcW0CKFsKWw5hZ7rVj5l_6aRcIVyytk,6952
117
117
  convisoappsec/flowcli/vulnerability/entrypoint.py,sha256=WsQkEJSbb9CwPm_deUtata9omEYYcaZnssYKTAybtjA,386
118
118
  convisoappsec/flowcli/vulnerability/rules_schema.json,sha256=OBkj9RMXltGoJYsyPqOsrJDfcyrQDlQHk9b5i9rMhoc,948
119
119
  convisoappsec/flowcli/vulnerability/run.py,sha256=6flmvr55cKxj-duX3w4PAFwJgC5AJ0NYJ9Zk3FZHFII,17144
120
120
  convisoappsec/sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
121
  convisoappsec/sast/decision.py,sha256=d7dcNr9yZMzyccpFS_peAmDo0ZtfsE1qXDdYrvCux2U,1025
122
122
  convisoappsec/sast/sastbox.py,sha256=hXZLiYh_F3f6yd1ydPYVOMKg-tNOQOZiBvKmWyedagI,11031
123
- conviso_cli-2.7.5.dist-info/METADATA,sha256=uFke607R2BjTbEjXfQ0DRSf9uUfVQgj9vaxDLenbqDk,2370
124
- conviso_cli-2.7.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
125
- conviso_cli-2.7.5.dist-info/entry_points.txt,sha256=0IvamweR_V0uG4O5Fo9NpVHTHfpZRwUE9kn7KEVZ668,109
126
- conviso_cli-2.7.5.dist-info/top_level.txt,sha256=ju5r0RSCF1HA7m9JOG10jrQS4SnqQEJzl6-YMCxbSl4,14
127
- conviso_cli-2.7.5.dist-info/RECORD,,
123
+ conviso_cli-2.7.7rc0.dist-info/METADATA,sha256=cXEOIH0XuXpr6BR7m2MgEQyevoTWn8q_grjbhBhHP48,2373
124
+ conviso_cli-2.7.7rc0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
125
+ conviso_cli-2.7.7rc0.dist-info/entry_points.txt,sha256=0IvamweR_V0uG4O5Fo9NpVHTHfpZRwUE9kn7KEVZ668,109
126
+ conviso_cli-2.7.7rc0.dist-info/top_level.txt,sha256=ju5r0RSCF1HA7m9JOG10jrQS4SnqQEJzl6-YMCxbSl4,14
127
+ conviso_cli-2.7.7rc0.dist-info/RECORD,,
@@ -117,7 +117,7 @@ class IssuesAPI(object):
117
117
 
118
118
  return issues
119
119
 
120
- def update_issue_status(self, issue_id, status, reason, control_sync_status_id):
120
+ def update_issue_status(self, issue_id, status, reason, control_sync_status_id=None):
121
121
  """ Update issue status on conviso platform """
122
122
 
123
123
  graphql_variables = {
@@ -1,6 +1,6 @@
1
1
  from convisoappsec.common.graphql.low_client import GraphQLClient
2
2
  from convisoappsec.flow.graphql_api.v1.resources_api import AssetsAPI, CompaniesApi, IssuesApi, DeploysApi, \
3
- SbomApi, LogAstError, ContainerApi, ControlSyncStatus
3
+ SbomApi, LogAstError, ContainerApi, ControlSyncStatus, SecurityGateApi
4
4
 
5
5
 
6
6
  class ConvisoGraphQLClient():
@@ -44,3 +44,7 @@ class ConvisoGraphQLClient():
44
44
  @property
45
45
  def control_sync_status(self):
46
46
  return ControlSyncStatus(self.__low_client)
47
+
48
+ @property
49
+ def security_gate(self):
50
+ return SecurityGateApi(self.__low_client)
@@ -487,3 +487,31 @@ class ControlSyncStatus:
487
487
  )
488
488
 
489
489
  return result
490
+
491
+
492
+ class SecurityGateApi(object):
493
+ """ To operations on Security Gate resources in Conviso Platform. """
494
+
495
+ def __init__(self, conviso_graphql_client):
496
+ self.__conviso_graphql_client = conviso_graphql_client
497
+
498
+ def run_security_gate(self, asset_id):
499
+ """ Execute security gate check for an asset using platform rules """
500
+
501
+ graphql_variables = {
502
+ 'assetId': str(asset_id)
503
+ }
504
+
505
+ graphql_body_response = self.__conviso_graphql_client.execute(
506
+ resolvers.SECURITY_GATE_RUN,
507
+ graphql_variables
508
+ )
509
+
510
+ expected_path = 'securityGateRun'
511
+
512
+ result = jmespath.search(
513
+ expected_path,
514
+ graphql_body_response,
515
+ )
516
+
517
+ return result
@@ -177,4 +177,23 @@ query GetDeploysByAsset(
177
177
  }
178
178
  }
179
179
  }
180
+ """
181
+
182
+ SECURITY_GATE_RUN = """
183
+ query SecurityGateRun($assetId: ID!) {
184
+ securityGateRun(assetId: $assetId) {
185
+ asset {
186
+ id
187
+ name
188
+ }
189
+ executionDate
190
+ reason {
191
+ low { limit count }
192
+ medium { limit count }
193
+ high { limit count }
194
+ critical { limit count }
195
+ }
196
+ status
197
+ }
198
+ }
180
199
  """
@@ -181,6 +181,8 @@ def deploy_results_to_conviso(
181
181
  except ResponseError as error:
182
182
  if error.code == 'RECORD_NOT_UNIQUE':
183
183
  continue
184
+ elif error.code == "Record not found" or "Record not found" in str(error):
185
+ continue
184
186
  else:
185
187
  retry_handler = RetryHandler(
186
188
  flow_context=flow_context, company_id=company_id, asset_id=asset_id
@@ -182,7 +182,7 @@ def generate(context, flow_context, asset_id, company_id, repository_dir, send_t
182
182
  stderr=subprocess.DEVNULL
183
183
  )
184
184
  command = [f"./conviso/syft scan {repository_dir} -o cyclonedx-json={file_name} "
185
- f"--select-catalogers '{','.join(catalogers)}'"]
185
+ f"--select-catalogers '{','.join(catalogers)}' --exclude ./conviso"]
186
186
 
187
187
  subprocess.run(command, shell=True, check=True, capture_output=True)
188
188
 
@@ -43,7 +43,8 @@ click_log.basic_config(logger)
43
43
  '--rules-file',
44
44
  'rules_file',
45
45
  type=click.File('r'),
46
- required=True
46
+ required=False,
47
+ help="Path to local YAML rules file. If not provided, uses platform-configured rules."
47
48
  )
48
49
  @click.option(
49
50
  '--asset-name',
@@ -66,6 +67,12 @@ def assert_security_rules(
66
67
  company_id = company[0]['id']
67
68
 
68
69
  try:
70
+ # If no rules file provided, use platform rules (default behavior)
71
+ if not rules_file:
72
+ run_platform_security_gate(flow_context, asset_id)
73
+ return
74
+
75
+ # Otherwise use local rules file
69
76
  rules = yaml.load(
70
77
  rules_file,
71
78
  Loader=yaml.Loader
@@ -149,6 +156,60 @@ def tolerated_days_by_severity(rules):
149
156
  return days_by_severity
150
157
 
151
158
 
159
+ def run_platform_security_gate(flow_context, asset_id):
160
+ """Execute security gate using platform-configured rules."""
161
+ conviso_api = flow_context.create_conviso_graphql_client()
162
+
163
+ click.secho(
164
+ '💬 Running security gate with platform rules...',
165
+ bold=True
166
+ )
167
+
168
+ result = conviso_api.security_gate.run_security_gate(asset_id)
169
+
170
+ if result is None:
171
+ raise click.ClickException(
172
+ 'Failed to execute security gate on platform. No result returned.'
173
+ )
174
+
175
+ asset_info = result.get('asset', {})
176
+ asset_name = asset_info.get('name', 'Unknown')
177
+ status = result.get('status')
178
+ reason = result.get('reason', {})
179
+ execution_date = result.get('executionDate', 'Unknown')
180
+
181
+ click.secho(
182
+ f'💬 Security Gate Result for Asset: {asset_name} (ID: {asset_id})',
183
+ bold=True
184
+ )
185
+ click.echo(f' Execution Date: {execution_date}')
186
+ click.echo('')
187
+
188
+ # Display severity counts
189
+ click.secho(' Severity Summary:', bold=True)
190
+ for severity in ['critical', 'high', 'medium', 'low']:
191
+ severity_data = reason.get(severity) if reason else None
192
+ if severity_data is None:
193
+ click.echo(f' ⚪ {severity.upper()}: N/A (not configured)')
194
+ continue
195
+ limit = severity_data.get('limit', 'N/A')
196
+ count = severity_data.get('count', 0)
197
+ status_icon = '❌' if limit != 'N/A' and count > limit else '✅'
198
+ click.echo(f' {status_icon} {severity.upper()}: {count}/{limit}')
199
+
200
+ click.echo('')
201
+
202
+ if status == 'FAIL':
203
+ raise click.ClickException(
204
+ f'Security gate FAILED. Vulnerabilities exceed configured limits.'
205
+ )
206
+
207
+ click.secho(
208
+ f'✅ Security gate PASSED.',
209
+ bold=True
210
+ )
211
+
212
+
152
213
  def __raise_if_gate_locked(response):
153
214
  if response['locked']:
154
215
  click.secho('💬 Vulnerabilities summary...', bold=True)
@@ -152,10 +152,11 @@ def fetch_and_merge_conviso_issues(context, flow_context):
152
152
 
153
153
  total_pages = issues_from_cp['metadata']['totalPages']
154
154
  issues_collection = issues_from_cp['collection']
155
+ valid_sources = ['conviso_scanner', 'conviso_ast']
155
156
 
156
157
  issues_collection = [
157
158
  item for item in issues_collection
158
- if item.get('scanSource') == 'conviso_scanner'
159
+ if item.get('scanSource') in valid_sources
159
160
  ]
160
161
  container_issues = [
161
162
  item for item in issues_collection
convisoappsec/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.7.5'
1
+ __version__ = '2.7.7-rc.0'