conviso-cli 2.7.5__tar.gz → 2.7.6__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 (133) hide show
  1. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/PKG-INFO +1 -1
  2. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/PKG-INFO +1 -1
  3. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/client.py +5 -1
  4. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/resources_api.py +28 -0
  5. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +19 -0
  6. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/iac/run.py +2 -0
  7. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sbom/generate.py +1 -1
  8. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +62 -1
  9. conviso_cli-2.7.6/convisoappsec/version.py +1 -0
  10. conviso_cli-2.7.5/convisoappsec/version.py +0 -1
  11. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/README.md +0 -0
  12. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/SOURCES.txt +0 -0
  13. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/dependency_links.txt +0 -0
  14. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/entry_points.txt +0 -0
  15. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/requires.txt +0 -0
  16. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/conviso_cli.egg-info/top_level.txt +0 -0
  17. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/__init__.py +0 -0
  18. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/__init__.py +0 -0
  19. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/box.py +0 -0
  20. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/cleaner.py +0 -0
  21. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/docker.py +0 -0
  22. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/exceptions.py +0 -0
  23. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/git_data_parser.py +0 -0
  24. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/graphql/__init__.py +0 -0
  25. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/graphql/error_handlers.py +0 -0
  26. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/graphql/errors.py +0 -0
  27. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/graphql/low_client.py +0 -0
  28. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/retry_handler.py +0 -0
  29. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/common/strings.py +0 -0
  30. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/__init__.py +0 -0
  31. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/api.py +0 -0
  32. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/cleaner.py +0 -0
  33. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/__init__.py +0 -0
  34. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  35. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
  36. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  37. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  38. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
  39. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
  40. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
  41. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
  42. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
  43. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
  44. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  45. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
  46. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  47. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  48. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  49. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
  50. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
  51. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
  52. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  53. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +0 -0
  54. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/util/__init__.py +0 -0
  55. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/util/ci_provider.py +0 -0
  56. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/util/source_code_compressor.py +0 -0
  57. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/version_control_system_adapter.py +0 -0
  58. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/version_searchers/__init__.py +0 -0
  59. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
  60. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
  61. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
  62. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/versioning_style/__init__.py +0 -0
  63. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
  64. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/__init__.py +0 -0
  65. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/__main__.py +0 -0
  66. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/assets/__init__.py +0 -0
  67. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/assets/create.py +0 -0
  68. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
  69. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/assets/ls.py +0 -0
  70. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/ast/__init__.py +0 -0
  71. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/ast/dry_run.py +0 -0
  72. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/ast/entrypoint.py +0 -0
  73. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/common.py +0 -0
  74. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/companies/__init__.py +0 -0
  75. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/companies/ls.py +0 -0
  76. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/container/__init__.py +0 -0
  77. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/container/entrypoint.py +0 -0
  78. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/container/run.py +0 -0
  79. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/context.py +0 -0
  80. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/__init__.py +0 -0
  81. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
  82. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/context.py +0 -0
  83. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
  84. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
  85. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
  86. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
  87. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
  88. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
  89. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
  90. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
  91. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -0
  92. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -0
  93. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
  94. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/entrypoint.py +0 -0
  95. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/environment_checker.py +0 -0
  96. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/__init__.py +0 -0
  97. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
  98. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
  99. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
  100. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
  101. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
  102. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
  103. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
  104. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
  105. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/help_option.py +0 -0
  106. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/iac/__init__.py +0 -0
  107. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/iac/dry_run.py +0 -0
  108. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/iac/entrypoint.py +0 -0
  109. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/requirements_verifier.py +0 -0
  110. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sast/__init__.py +0 -0
  111. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sast/dry_run.py +0 -0
  112. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sast/entrypoint.py +0 -0
  113. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sast/run.py +0 -0
  114. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sbom/__init__.py +0 -0
  115. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
  116. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sca/__init__.py +0 -0
  117. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sca/dry_run.py +0 -0
  118. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sca/entrypoint.py +0 -0
  119. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/sca/run.py +0 -0
  120. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
  121. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +0 -0
  122. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
  123. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
  124. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/flowcli/vulnerability/run.py +0 -0
  125. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/logger.py +0 -0
  126. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/sast/__init__.py +0 -0
  127. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/sast/decision.py +0 -0
  128. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/convisoappsec/sast/sastbox.py +0 -0
  129. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/scripts/shell_completer/flow_bash_completer.sh +0 -0
  130. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/scripts/shell_completer/flow_fish_completer.fish +0 -0
  131. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
  132. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/setup.cfg +0 -0
  133. {conviso_cli-2.7.5 → conviso_cli-2.7.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-cli
3
- Version: 2.7.5
3
+ Version: 2.7.6
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-cli
3
- Version: 2.7.5
3
+ Version: 2.7.6
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
@@ -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)
@@ -0,0 +1 @@
1
+ __version__ = '2.7.6'
@@ -1 +0,0 @@
1
- __version__ = '2.7.5'
File without changes
File without changes
File without changes