conviso-cli 2.2.1__tar.gz → 2.2.2.dev0__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 (130) hide show
  1. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/PKG-INFO +1 -1
  2. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/PKG-INFO +1 -1
  3. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/client.py +5 -1
  4. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/resources_api.py +58 -1
  5. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +18 -0
  6. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sbom/generate.py +47 -68
  7. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sca/run.py +8 -1
  8. conviso-cli-2.2.2.dev0/convisoappsec/version.py +1 -0
  9. conviso-cli-2.2.1/convisoappsec/version.py +0 -1
  10. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/README.md +0 -0
  11. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/SOURCES.txt +0 -0
  12. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/dependency_links.txt +0 -0
  13. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/entry_points.txt +0 -0
  14. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/requires.txt +0 -0
  15. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/conviso_cli.egg-info/top_level.txt +0 -0
  16. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/__init__.py +0 -0
  17. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/__init__.py +0 -0
  18. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/box.py +0 -0
  19. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/docker.py +0 -0
  20. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/exceptions.py +0 -0
  21. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/git_data_parser.py +0 -0
  22. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/graphql/__init__.py +0 -0
  23. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/graphql/error_handlers.py +0 -0
  24. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/graphql/errors.py +0 -0
  25. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/graphql/low_client.py +0 -0
  26. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/common/strings.py +0 -0
  27. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/__init__.py +0 -0
  28. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/api.py +0 -0
  29. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/__init__.py +0 -0
  30. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  31. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
  32. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  33. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  34. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
  35. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
  36. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
  37. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
  38. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
  39. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  40. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
  41. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  42. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  43. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  44. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
  45. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
  46. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
  47. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  48. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
  49. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/source_code_scanner/__init__.py +0 -0
  50. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/source_code_scanner/exceptions.py +0 -0
  51. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/source_code_scanner/scc.py +0 -0
  52. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/source_code_scanner/source_code_scanner.py +0 -0
  53. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/util/__init__.py +0 -0
  54. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/util/ci_provider.py +0 -0
  55. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/util/metrics.py +0 -0
  56. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/util/source_code_compressor.py +0 -0
  57. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/version_control_system_adapter.py +0 -0
  58. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/version_searchers/__init__.py +0 -0
  59. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
  60. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
  61. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
  62. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/versioning_style/__init__.py +0 -0
  63. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
  64. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/__init__.py +0 -0
  65. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/__main__.py +0 -0
  66. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/assets/__init__.py +0 -0
  67. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/assets/create.py +0 -0
  68. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
  69. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/assets/ls.py +0 -0
  70. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/ast/__init__.py +0 -0
  71. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/ast/entrypoint.py +0 -0
  72. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/common.py +0 -0
  73. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/companies/__init__.py +0 -0
  74. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/companies/ls.py +0 -0
  75. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/context.py +0 -0
  76. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/__init__.py +0 -0
  77. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
  78. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/context.py +0 -0
  79. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
  80. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
  81. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
  82. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
  83. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
  84. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
  85. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
  86. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
  87. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -0
  88. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -0
  89. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
  90. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/entrypoint.py +0 -0
  91. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/ls.py +0 -0
  92. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/deploy/show.py +0 -0
  93. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/entrypoint.py +0 -0
  94. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/__init__.py +0 -0
  95. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
  96. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
  97. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
  98. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
  99. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
  100. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
  101. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
  102. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
  103. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/help_option.py +0 -0
  104. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/iac/__init__.py +0 -0
  105. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/iac/entrypoint.py +0 -0
  106. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/iac/run.py +0 -0
  107. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/projects/__init__.py +0 -0
  108. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/projects/ls.py +0 -0
  109. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/requirements_verifier.py +0 -0
  110. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sast/__init__.py +0 -0
  111. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sast/entrypoint.py +0 -0
  112. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sast/run.py +0 -0
  113. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sbom/__init__.py +0 -0
  114. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
  115. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sca/__init__.py +0 -0
  116. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/sca/entrypoint.py +0 -0
  117. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
  118. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
  119. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
  120. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
  121. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/flowcli/vulnerability/run.py +0 -0
  122. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/logger.py +0 -0
  123. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/sast/__init__.py +0 -0
  124. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/sast/decision.py +0 -0
  125. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/convisoappsec/sast/sastbox.py +0 -0
  126. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/scripts/shell_completer/flow_bash_completer.sh +0 -0
  127. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/scripts/shell_completer/flow_fish_completer.fish +0 -0
  128. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
  129. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/setup.cfg +0 -0
  130. {conviso-cli-2.2.1 → conviso-cli-2.2.2.dev0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conviso-cli
3
- Version: 2.2.1
3
+ Version: 2.2.2.dev0
4
4
  Summary: UNKNOWN
5
5
  Maintainer: Conviso
6
6
  Maintainer-email: development@convisoappsec.com
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conviso-cli
3
- Version: 2.2.1
3
+ Version: 2.2.2.dev0
4
4
  Summary: UNKNOWN
5
5
  Maintainer: Conviso
6
6
  Maintainer-email: development@convisoappsec.com
@@ -1,5 +1,5 @@
1
1
  from convisoappsec.common.graphql.low_client import GraphQLClient
2
- from convisoappsec.flow.graphql_api.v1.resources_api import AssetsAPI, ProjectsApi, CompaniesApi, IssuesApi, DeploysApi
2
+ from convisoappsec.flow.graphql_api.v1.resources_api import AssetsAPI, ProjectsApi, CompaniesApi, IssuesApi, DeploysApi, SbomApi
3
3
 
4
4
 
5
5
  class ConvisoGraphQLClient():
@@ -31,3 +31,7 @@ class ConvisoGraphQLClient():
31
31
  @property
32
32
  def deploys(self):
33
33
  return DeploysApi(self.__low_client)
34
+
35
+ @property
36
+ def sbom(self):
37
+ return SbomApi(self.__low_client)
@@ -1,7 +1,8 @@
1
1
  from urllib.parse import urlparse
2
2
 
3
3
  import jmespath
4
-
4
+ import json
5
+ import requests
5
6
  from convisoappsec.flow.graphql_api.v1.models.asset import AssetInput
6
7
  from convisoappsec.flow.graphql_api.v1.models.project import CreateProjectInput, UpdateProjectInput
7
8
  from convisoappsec.flow.graphql_api.v1.schemas import mutations, resolvers
@@ -266,3 +267,59 @@ class DeploysApi(object):
266
267
  )
267
268
 
268
269
  return deploys
270
+
271
+
272
+ class SbomApi(object):
273
+ """ Class for sbom file resources """
274
+
275
+ def __init__(self, conviso_graphql_client):
276
+ self._conviso_graphql_client = conviso_graphql_client
277
+
278
+ def send_sbom_file(self, company_id, asset_id, file_path, api_key):
279
+ """ Send SBOM file to Conviso platform """
280
+
281
+ url = self._conviso_graphql_client.url
282
+
283
+ operations = {
284
+ "query": mutations.IMPORT_SBOM,
285
+ "variables": {
286
+ "companyId": company_id,
287
+ "assetId": asset_id,
288
+ "file": None
289
+ }
290
+ }
291
+
292
+ file_map = {
293
+ "0": ["variables.file"]
294
+ }
295
+
296
+ with open(file_path, 'rb') as sbom_file:
297
+ files = {
298
+ 'operations': (None, json.dumps(operations), 'application/json'),
299
+ 'map': (None, json.dumps(file_map), 'application/json'),
300
+ '0': (file_path, sbom_file, 'application/octet-stream')
301
+ }
302
+
303
+ # TODO adding default headers and conviso ast version
304
+ headers = {
305
+ 'x-api-key': f'{api_key}',
306
+
307
+ }
308
+
309
+ response = requests.post(url, files=files, headers=headers)
310
+
311
+ response.raise_for_status()
312
+ json_response = response.json()
313
+
314
+ self._handle_graphql_errors(json_response)
315
+
316
+ return json_response.get('data')
317
+
318
+ def _handle_graphql_errors(self, json_response):
319
+ """ Handle GraphQL errors """
320
+ if 'errors' in json_response:
321
+ errors = json_response['errors']
322
+ for error in errors:
323
+ print(f"GraphQL Error: {error.get('message')}")
324
+ raise Exception("GraphQL request failed with errors.")
325
+
@@ -93,3 +93,21 @@ mutation (
93
93
  }
94
94
  }
95
95
  """
96
+
97
+ IMPORT_SBOM = """
98
+ mutation (
99
+ $file: Upload!,
100
+ $assetId: ID!,
101
+ $companyId: ID!
102
+ ) {
103
+ importSbom(
104
+ input: {
105
+ file: $file,
106
+ assetId: $assetId,
107
+ companyId: $companyId
108
+ }
109
+ ) {
110
+ success
111
+ }
112
+ }
113
+ """
@@ -1,35 +1,24 @@
1
1
  import click
2
2
  import subprocess
3
- import json
4
3
  import tempfile
5
4
  import os
6
5
  from convisoappsec.flowcli.context import pass_flow_context
7
6
  from datetime import datetime
8
7
  from convisoappsec.flowcli.requirements_verifier import RequirementsVerifier
9
8
  from convisoappsec.flowcli import help_option
10
- from convisoappsec.flowcli.common import (asset_id_option, project_code_option, on_http_error)
11
- from convisoappsec.sast.sastbox import SASTBox
9
+ from convisoappsec.flowcli.common import (asset_id_option, project_code_option)
12
10
 
13
11
 
14
12
  @click.command()
15
13
  @project_code_option(required=False)
16
14
  @asset_id_option(required=False)
17
- @click.option(
18
- "-s",
19
- "--start-commit",
20
- required=False,
21
- help="If no value is set so the empty tree hash commit is used.",
22
- )
23
- @click.option(
24
- "-e",
25
- "--end-commit",
26
- required=False,
27
- help="""If no value is set so the HEAD commit
28
- from the current branch is used""",
15
+ @project_code_option(
16
+ help="Not required when --no-send-to-flow option is set",
17
+ required=False
29
18
  )
30
19
  @click.option(
31
- "-r",
32
- "--repository-dir",
20
+ '-r',
21
+ '--repository-dir',
33
22
  default=".",
34
23
  show_default=True,
35
24
  type=click.Path(
@@ -39,65 +28,46 @@ from convisoappsec.sast.sastbox import SASTBox
39
28
  required=False,
40
29
  help="The source code repository directory.",
41
30
  )
42
- @click.option(
43
- "--fail-on-severity-threshold",
44
- required=False,
45
- help="If the threshold of the informed severity and higher has reach, then the command will fail after send the results to AppSec Flow.\n \
46
- The severity levels are: UNDEFINED, INFO, LOW, MEDIUM, HIGH, CRITICAL.",
47
- type=click.Tuple([str, int]),
48
- default=(None, None),
49
- )
50
- @click.option(
51
- "--fail-on-threshold",
52
- required=False,
53
- help="If the threshold has reach then the command will fail after send the result to AppSec Flow",
54
- type=int,
55
- default=False,
56
- )
57
31
  @click.option(
58
32
  "--send-to-flow/--no-send-to-flow",
59
33
  default=True,
60
34
  show_default=True,
61
35
  required=False,
62
- hidden=True,
63
36
  help="""Enable or disable the ability of send analysis result
64
37
  reports to flow. When --send-to-flow option is set the --project-code
65
38
  option is required""",
39
+ hidden=True
66
40
  )
67
41
  @click.option(
68
- "--deploy-id",
69
- default=None,
70
- required=False,
42
+ "--custom-sca-tags",
71
43
  hidden=True,
72
- envvar=("CONVISO_DEPLOY_ID", "FLOW_DEPLOY_ID")
73
- )
74
- @click.option(
75
- "--sastbox-registry",
76
- default="",
77
44
  required=False,
78
- hidden=True,
79
- envvar=("CONVISO_SASTBOX_REGISTRY", "FLOW_SASTBOX_REGISTRY"),
45
+ multiple=True,
46
+ type=(str, str),
47
+ help="""It should be passed as <repository_name> <image_tag>. It accepts multiple values"""
80
48
  )
81
49
  @click.option(
82
- "--sastbox-repository-name",
83
- default="",
84
- required=False,
50
+ "--scanner-timeout",
85
51
  hidden=True,
86
- envvar=("CONVISO_SASTBOX_REPOSITORY_NAME", "FLOW_SASTBOX_REPOSITORY_NAME"),
52
+ required=False,
53
+ default=7200,
54
+ type=int,
55
+ help="Set timeout for each scanner"
87
56
  )
88
57
  @click.option(
89
- "--sastbox-tag",
90
- default=SASTBox.DEFAULT_TAG,
91
- required=False,
58
+ "--parallel-workers",
92
59
  hidden=True,
93
- envvar=("CONVISO_SASTBOX_TAG", "FLOW_SASTBOX_TAG"),
60
+ required=False,
61
+ default=2,
62
+ type=int,
63
+ help="Set max parallel workers"
94
64
  )
95
65
  @click.option(
96
- "--sastbox-skip-login/--sastbox-no-skip-login",
97
- default=False,
66
+ "--deploy-id",
67
+ default=None,
98
68
  required=False,
99
69
  hidden=True,
100
- envvar=("CONVISO_SASTBOX_SKIP_LOGIN", "FLOW_SASTBOX_SKIP_LOGIN"),
70
+ envvar=("CONVISO_DEPLOY_ID", "FLOW_DEPLOY_ID")
101
71
  )
102
72
  @click.option(
103
73
  '--experimental',
@@ -135,10 +105,9 @@ from convisoappsec.sast.sastbox import SASTBox
135
105
  @help_option
136
106
  @pass_flow_context
137
107
  @click.pass_context
138
- def generate(context, flow_context, project_code, asset_id, company_id, end_commit, start_commit, repository_dir,
139
- send_to_flow, deploy_id, sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login,
140
- fail_on_threshold, fail_on_severity_threshold, experimental, asset_name, vulnerability_auto_close,
141
- from_ast):
108
+ def generate(context, flow_context, project_code, asset_id, company_id, repository_dir, send_to_flow, custom_sca_tags,
109
+ scanner_timeout, parallel_workers, deploy_id, experimental, asset_name, vulnerability_auto_close, from_ast):
110
+
142
111
  context.params['company_id'] = context.params.get('company_id') or company_id
143
112
 
144
113
  if not context.params['company_id']:
@@ -149,10 +118,9 @@ def generate(context, flow_context, project_code, asset_id, company_id, end_comm
149
118
  prepared_context = RequirementsVerifier.prepare_context(context)
150
119
 
151
120
  params_to_copy = [
152
- 'project_code', 'asset_id', 'start_commit', 'end_commit',
153
- 'repository_dir', 'send_to_flow', 'deploy_id', 'sastbox_registry',
154
- 'sastbox_repository_name', 'sastbox_tag', 'sastbox_skip_login',
155
- 'experimental', 'asset_name', 'vulnerability_auto_close', 'company_id'
121
+ 'project_code', 'asset_id', 'repository_dir', 'send_to_flow',
122
+ 'deploy_id', 'custom_sca_tags', 'scanner_timeout', 'parallel_workers',
123
+ 'experimental', 'asset_name', 'vulnerability_auto_close'
156
124
  ]
157
125
 
158
126
  for param_name in params_to_copy:
@@ -169,7 +137,7 @@ def generate(context, flow_context, project_code, asset_id, company_id, end_comm
169
137
  ))
170
138
 
171
139
  command = [
172
- f"syft packages {repository_dir} -o syft-json={file_name}"
140
+ f"syft packages {repository_dir} -o cyclonedx-json={file_name}"
173
141
  ]
174
142
 
175
143
  try:
@@ -179,10 +147,21 @@ def generate(context, flow_context, project_code, asset_id, company_id, end_comm
179
147
  log_func("We have a problem when try to generate the sbom file ...{error}".format(error=error), color='red')
180
148
  return
181
149
 
182
- with open(file_name, 'r') as sbom_file:
183
- sbom_data = json.load(sbom_file)
184
- # TODO: here we already have the file, so we need to send to cp
150
+ if asset_id is None:
151
+ asset_id = context.params['asset_id']
152
+
153
+ send_sbom_file_to_csc(company_id=company_id, asset_id=asset_id, file=file_name)
154
+
155
+
156
+ def log_func(msg, new_line=True):
157
+ click.echo(click.style(msg), nl=new_line, err=True)
158
+
159
+
160
+ @pass_flow_context
161
+ def send_sbom_file_to_csc(flow_context, company_id, asset_id, file):
162
+ conviso_api = flow_context.create_conviso_graphql_client()
163
+ api_key = flow_context.key
185
164
 
165
+ log_func(f"Sending sbom to conviso platform ...")
186
166
 
187
- def log_func(msg, new_line=True, color='blue'):
188
- click.echo(click.style(msg, bold=True, fg=color), nl=new_line, err=True)
167
+ return conviso_api.sbom.send_sbom_file(company_id=company_id, asset_id=asset_id, file_path=file, api_key=api_key)
@@ -16,6 +16,7 @@ from convisoappsec.logger import LOGGER
16
16
  from convisoappsec.common.graphql.errors import ReponseError
17
17
  from convisoappsec.flowcli.requirements_verifier import RequirementsVerifier
18
18
  from copy import deepcopy as clone
19
+ from convisoappsec.flowcli.sbom import sbom
19
20
 
20
21
  click_log.basic_config(LOGGER)
21
22
 
@@ -155,6 +156,7 @@ def run(
155
156
 
156
157
  perform_command(
157
158
  flow_context,
159
+ context,
158
160
  context.params['project_code'],
159
161
  context.params['asset_id'],
160
162
  context.params['repository_dir'],
@@ -276,7 +278,7 @@ def get_relative_path(path):
276
278
 
277
279
 
278
280
  def perform_command(
279
- flow_context, project_code, asset_id, repository_dir, send_to_flow, custom_sca_tags, scanner_timeout,
281
+ flow_context, context, project_code, asset_id, repository_dir, send_to_flow, custom_sca_tags, scanner_timeout,
280
282
  deploy_id, experimental
281
283
  ):
282
284
  if send_to_flow and not experimental and not project_code:
@@ -361,6 +363,11 @@ def perform_command(
361
363
  # TODO add CI Decision block code
362
364
  LOGGER.info('\U00002705 SCA Scan Finished')
363
365
 
366
+ # Generate SBOM when execute a sca only scan.
367
+ sbom_generate = sbom.commands.get('generate')
368
+ specific_param = { "from_ast": True }
369
+ context.params.update(specific_param)
370
+ sbom_generate.invoke(context)
364
371
  except Exception as e:
365
372
  on_http_error(e)
366
373
  raise click.ClickException(str(e)) from e
@@ -0,0 +1 @@
1
+ __version__ = '2.2.2-dev.0'
@@ -1 +0,0 @@
1
- __version__ = '2.2.1'
File without changes
File without changes
File without changes