conviso-cli 2.3.0.dev3__tar.gz → 2.3.0rc0__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 (137) hide show
  1. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/PKG-INFO +2 -2
  2. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/PKG-INFO +2 -2
  3. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/SOURCES.txt +1 -0
  4. conviso-cli-2.3.0rc0/conviso_cli.egg-info/requires.txt +13 -0
  5. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/git_data_parser.py +1 -4
  6. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/resources_api.py +83 -71
  7. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +24 -0
  8. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/ast/entrypoint.py +4 -4
  9. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/run.py +2 -2
  10. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/entrypoint.py +0 -10
  11. conviso-cli-2.3.0rc0/convisoappsec/flowcli/environment_checker.py +45 -0
  12. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/run.py +1 -3
  13. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/requirements_verifier.py +2 -0
  14. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/run.py +18 -101
  15. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/generate.py +4 -9
  16. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/run.py +3 -20
  17. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/run.py +4 -10
  18. conviso-cli-2.3.0rc0/convisoappsec/version.py +1 -0
  19. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/setup.py +13 -13
  20. conviso-cli-2.3.0.dev3/conviso_cli.egg-info/requires.txt +0 -13
  21. conviso-cli-2.3.0.dev3/convisoappsec/version.py +0 -1
  22. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/README.md +0 -0
  23. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/dependency_links.txt +0 -0
  24. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/entry_points.txt +0 -0
  25. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/top_level.txt +0 -0
  26. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/__init__.py +0 -0
  27. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/__init__.py +0 -0
  28. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/box.py +0 -0
  29. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/docker.py +0 -0
  30. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/exceptions.py +0 -0
  31. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/__init__.py +0 -0
  32. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/error_handlers.py +0 -0
  33. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/errors.py +0 -0
  34. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/low_client.py +0 -0
  35. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/retry_handler.py +0 -0
  36. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/strings.py +0 -0
  37. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/__init__.py +0 -0
  38. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/api.py +0 -0
  39. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/__init__.py +0 -0
  40. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  41. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
  42. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  43. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  44. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
  45. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
  46. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
  47. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
  48. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
  49. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
  50. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  51. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
  52. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  53. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  54. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/client.py +0 -0
  55. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  56. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
  57. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
  58. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
  59. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  60. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
  61. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/__init__.py +0 -0
  62. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/exceptions.py +0 -0
  63. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/scc.py +0 -0
  64. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/source_code_scanner.py +0 -0
  65. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/__init__.py +0 -0
  66. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/ci_provider.py +0 -0
  67. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/metrics.py +0 -0
  68. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/source_code_compressor.py +0 -0
  69. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_control_system_adapter.py +0 -0
  70. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/__init__.py +0 -0
  71. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
  72. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
  73. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
  74. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/versioning_style/__init__.py +0 -0
  75. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
  76. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/__init__.py +0 -0
  77. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/__main__.py +0 -0
  78. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/__init__.py +0 -0
  79. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/create.py +0 -0
  80. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
  81. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/ls.py +0 -0
  82. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/ast/__init__.py +0 -0
  83. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/common.py +0 -0
  84. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/companies/__init__.py +0 -0
  85. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/companies/ls.py +0 -0
  86. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/__init__.py +0 -0
  87. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/entrypoint.py +0 -0
  88. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/context.py +0 -0
  89. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/__init__.py +0 -0
  90. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
  91. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/context.py +0 -0
  92. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
  93. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
  94. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
  95. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
  96. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
  97. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
  98. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
  99. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
  100. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -0
  101. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -0
  102. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
  103. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/entrypoint.py +0 -0
  104. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/ls.py +0 -0
  105. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/show.py +0 -0
  106. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/__init__.py +0 -0
  107. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
  108. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
  109. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
  110. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
  111. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
  112. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
  113. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
  114. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
  115. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/help_option.py +0 -0
  116. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/__init__.py +0 -0
  117. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/entrypoint.py +0 -0
  118. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/projects/__init__.py +0 -0
  119. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/projects/ls.py +0 -0
  120. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/__init__.py +0 -0
  121. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/entrypoint.py +0 -0
  122. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/__init__.py +0 -0
  123. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
  124. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/__init__.py +0 -0
  125. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/entrypoint.py +0 -0
  126. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
  127. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
  128. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
  129. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
  130. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/logger.py +0 -0
  131. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/__init__.py +0 -0
  132. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/decision.py +0 -0
  133. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/sastbox.py +0 -0
  134. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_bash_completer.sh +0 -0
  135. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_fish_completer.fish +0 -0
  136. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
  137. {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/setup.cfg +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conviso-cli
3
- Version: 2.3.0.dev3
3
+ Version: 2.3.0rc0
4
4
  Summary: UNKNOWN
5
5
  Maintainer: Conviso
6
6
  Maintainer-email: development@convisoappsec.com
7
7
  License: UNKNOWN
8
8
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
9
9
  Platform: UNKNOWN
10
- Requires-Python: >=3.8
10
+ Requires-Python: >=3.9
11
11
  Description-Content-Type: text/markdown
12
12
 
13
13
  # CLI
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conviso-cli
3
- Version: 2.3.0.dev3
3
+ Version: 2.3.0rc0
4
4
  Summary: UNKNOWN
5
5
  Maintainer: Conviso
6
6
  Maintainer-email: development@convisoappsec.com
7
7
  License: UNKNOWN
8
8
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
9
9
  Platform: UNKNOWN
10
- Requires-Python: >=3.8
10
+ Requires-Python: >=3.9
11
11
  Description-Content-Type: text/markdown
12
12
 
13
13
  # CLI
@@ -66,6 +66,7 @@ convisoappsec/flowcli/__main__.py
66
66
  convisoappsec/flowcli/common.py
67
67
  convisoappsec/flowcli/context.py
68
68
  convisoappsec/flowcli/entrypoint.py
69
+ convisoappsec/flowcli/environment_checker.py
69
70
  convisoappsec/flowcli/help_option.py
70
71
  convisoappsec/flowcli/requirements_verifier.py
71
72
  convisoappsec/flowcli/assets/__init__.py
@@ -0,0 +1,13 @@
1
+ GitPython==3.1.44
2
+ click==8.1.8
3
+ requests==2.32.3
4
+ urllib3==2.3.0
5
+ semantic-version==2.10.0
6
+ docker==7.1.0
7
+ PyYAML==6.0.2
8
+ click-log==0.4.0
9
+ transitions==0.9.2
10
+ jsonschema==4.23.0
11
+ giturlparse<=0.12.0
12
+ jmespath==1.0.1
13
+ setuptools==75.8.0
@@ -70,7 +70,4 @@ class GitDataParser:
70
70
  )
71
71
 
72
72
  def __validate_git_repo(self, repository_dir):
73
- repo = Repo(repository_dir)
74
- repo.git.config("--global", "--add", "safe.directory", repository_dir)
75
-
76
- return repo
73
+ return Repo(repository_dir)
@@ -240,6 +240,64 @@ class IssuesApi(object):
240
240
 
241
241
  return issues_stats
242
242
 
243
+ def send_issues_file(self, company_id, asset_id, file_path, api_key, vulnerability_type='SAST_FINDING',
244
+ deploy_id=None, commit_ref=None):
245
+ """Send issues file to Conviso platform"""
246
+
247
+ url = self.__conviso_graphql_client.url
248
+
249
+ if not isinstance(vulnerability_type, list):
250
+ vulnerability_type = [vulnerability_type]
251
+
252
+ vulnerability_type = [v.upper() for v in vulnerability_type]
253
+
254
+ variables = {
255
+ "companyId": company_id,
256
+ "assetId": asset_id,
257
+ "vulnerabilityTypes": vulnerability_type,
258
+ "deployId": deploy_id,
259
+ "commitRef": commit_ref,
260
+ "file": None
261
+ }
262
+
263
+ operations = {
264
+ "query": mutations.IMPORT_FINDINGS,
265
+ "variables": variables
266
+ }
267
+
268
+ file_map = {"0": ["variables.file"]}
269
+
270
+ headers = {
271
+ 'x-api-key': api_key,
272
+ "User-Agent": f"AST:{__version__}"
273
+ }
274
+
275
+ try:
276
+ with open(file_path, 'rb') as file:
277
+ files = {
278
+ 'operations': (None, json.dumps(operations), 'application/json'),
279
+ 'map': (None, json.dumps(file_map), 'application/json'),
280
+ '0': (file_path, file, 'application/octet-stream')
281
+ }
282
+
283
+ response = requests.post(url, files=files, headers=headers)
284
+ response.raise_for_status()
285
+ json_response = response.json()
286
+
287
+ self._handle_graphql_errors(json_response)
288
+ return json_response.get('data')
289
+
290
+ except requests.RequestException as e:
291
+ raise Exception(f"GraphQL request failed: {e}")
292
+
293
+ @staticmethod
294
+ def _handle_graphql_errors(json_response):
295
+ """Handle GraphQL errors"""
296
+ errors = json_response.get('errors')
297
+ if errors:
298
+ error_messages = [error.get('message', 'Unknown error') for error in errors]
299
+ raise Exception(f"GraphQL request failed with errors: {', '.join(error_messages)}")
300
+
243
301
 
244
302
  class DeploysApi(object):
245
303
  """ Class for deploys resources """
@@ -320,19 +378,18 @@ class DeploysApi(object):
320
378
  raise Exception("GraphQL request failed with errors.")
321
379
 
322
380
 
323
- class SbomApi(object):
324
- """ Class for sbom file resources """
381
+ class BaseApi:
382
+ """ Base class for handling file uploads to Conviso platform """
325
383
 
326
384
  def __init__(self, conviso_graphql_client):
327
385
  self._conviso_graphql_client = conviso_graphql_client
328
386
 
329
- def send_sbom_file(self, company_id, asset_id, file_path, api_key):
330
- """ Send SBOM file to Conviso platform """
331
-
387
+ def send_file(self, company_id, asset_id, file_path, api_key, mutation):
388
+ """ Generic method for sending a file """
332
389
  url = self._conviso_graphql_client.url
333
390
 
334
391
  operations = {
335
- "query": mutations.IMPORT_SBOM,
392
+ "query": mutation,
336
393
  "variables": {
337
394
  "companyId": company_id,
338
395
  "assetId": asset_id,
@@ -340,41 +397,50 @@ class SbomApi(object):
340
397
  }
341
398
  }
342
399
 
343
- file_map = {
344
- "0": ["variables.file"]
345
- }
400
+ file_map = {"0": ["variables.file"]}
346
401
 
347
- with open(file_path, 'rb') as sbom_file:
402
+ with open(file_path, 'rb') as file:
348
403
  files = {
349
404
  'operations': (None, json.dumps(operations), 'application/json'),
350
405
  'map': (None, json.dumps(file_map), 'application/json'),
351
- '0': (file_path, sbom_file, 'application/octet-stream')
406
+ '0': (file_path, file, 'application/octet-stream')
352
407
  }
353
408
 
354
409
  headers = {
355
- 'x-api-key': f'{api_key}',
356
- "User-Agent": "AST:{version}".format(version=__version__)
410
+ 'x-api-key': api_key,
411
+ "User-Agent": f"AST:{__version__}"
357
412
  }
358
413
 
359
414
  response = requests.post(url, files=files, headers=headers)
360
-
361
415
  response.raise_for_status()
362
416
  json_response = response.json()
363
417
 
364
418
  self._handle_graphql_errors(json_response)
365
-
366
419
  return json_response.get('data')
367
420
 
368
421
  @staticmethod
369
422
  def _handle_graphql_errors(json_response):
370
423
  """ Handle GraphQL errors """
371
424
  if 'errors' in json_response:
372
- errors = json_response['errors']
373
- for error in errors:
425
+ for error in json_response['errors']:
374
426
  print(f"GraphQL Error: {error.get('message')}")
375
427
  raise Exception("GraphQL request failed with errors.")
376
428
 
377
429
 
430
+ class SbomApi(BaseApi):
431
+ """ Class for SBOM file resources """
432
+
433
+ def send_sbom_file(self, company_id, asset_id, file_path, api_key):
434
+ return self.send_file(company_id, asset_id, file_path, api_key, mutations.IMPORT_SBOM)
435
+
436
+
437
+ class ContainerApi(BaseApi):
438
+ """ Class for container finding file resources """
439
+
440
+ def send_container_file(self, company_id, asset_id, file_path, api_key):
441
+ return self.send_file(company_id, asset_id, file_path, api_key, mutations.IMPORT_CONTAINER)
442
+
443
+
378
444
  class LogAstError(object):
379
445
  """ Class to send AST errors to Conviso Platform """
380
446
  def __init__(self, conviso_graphql_client):
@@ -402,57 +468,3 @@ class LogAstError(object):
402
468
  )
403
469
 
404
470
  return success
405
-
406
- class ContainerApi(object):
407
- """ Class for container finding file resources """
408
-
409
- def __init__(self, conviso_graphql_client):
410
- self._conviso_graphql_client = conviso_graphql_client
411
-
412
- def send_container_file(self, company_id, asset_id, file_path, api_key):
413
- """ Send Container file to Conviso platform """
414
-
415
- url = self._conviso_graphql_client.url
416
-
417
- operations = {
418
- "query": mutations.IMPORT_CONTAINER,
419
- "variables": {
420
- "companyId": company_id,
421
- "assetId": asset_id,
422
- "file": None
423
- }
424
- }
425
-
426
- file_map = {
427
- "0": ["variables.file"]
428
- }
429
-
430
- with open(file_path, 'rb') as container_file:
431
- files = {
432
- 'operations': (None, json.dumps(operations), 'application/json'),
433
- 'map': (None, json.dumps(file_map), 'application/json'),
434
- '0': (file_path, container_file, 'application/octet-stream')
435
- }
436
-
437
- headers = {
438
- 'x-api-key': f'{api_key}',
439
- "User-Agent": "AST:{version}".format(version=__version__)
440
- }
441
-
442
- response = requests.post(url, files=files, headers=headers)
443
-
444
- response.raise_for_status()
445
- json_response = response.json()
446
-
447
- self._handle_graphql_errors(json_response)
448
-
449
- return json_response.get('data')
450
-
451
- @staticmethod
452
- def _handle_graphql_errors(json_response):
453
- """ Handle GraphQL errors """
454
- if 'errors' in json_response:
455
- errors = json_response['errors']
456
- for error in errors:
457
- print(f"GraphQL Error: {error.get('message')}")
458
- raise Exception("GraphQL request failed with errors.")
@@ -171,3 +171,27 @@ mutation (
171
171
  }
172
172
  }
173
173
  """
174
+
175
+ IMPORT_FINDINGS = """
176
+ mutation (
177
+ $file: Upload!,
178
+ $assetId: ID!,
179
+ $companyId: ID!
180
+ $vulnerabilityTypes: [Issue!]!
181
+ $deployId: ID
182
+ $commitRef: String
183
+ ) {
184
+ importAstFindingsFile(
185
+ input: {
186
+ file: $file,
187
+ assetId: $assetId,
188
+ companyId: $companyId,
189
+ vulnerabilityTypes: $vulnerabilityTypes,
190
+ deployId: $deployId,
191
+ commitRef: $commitRef
192
+ }
193
+ ) {
194
+ success
195
+ }
196
+ }
197
+ """
@@ -163,6 +163,9 @@ def perform_deploy(context, flow_context, prepared_context):
163
163
  try:
164
164
  LOGGER.info("Creating new deploy...")
165
165
  created_deploy = values.invoke(context)
166
+
167
+ if created_deploy is None:
168
+ raise CreateDeployException("Deploy not created.")
166
169
  try:
167
170
  conviso_api = flow_context.create_conviso_graphql_client()
168
171
  api_key = flow_context.key
@@ -227,10 +230,7 @@ def perform_deploy(context, flow_context, prepared_context):
227
230
  ast_log=full_trace
228
231
  )
229
232
 
230
- if created_deploy:
231
- return created_deploy
232
-
233
- raise CreateDeployException("Deploy not created.")
233
+ return created_deploy
234
234
 
235
235
  except CreateDeployException as err:
236
236
  raise PerformDeployException(err)
@@ -91,8 +91,8 @@ def run(
91
91
  debug_message(f"Context after being prepared: {prepared_context.params}")
92
92
 
93
93
  params_to_copy = [
94
- 'asset_id', 'send_to_flow', 'asset_name', 'vulnerability_auto_close', 'project_code', 'repository_dir',
95
- 'company_id'
94
+ 'asset_id', 'send_to_flow', 'asset_name', 'vulnerability_auto_close',
95
+ 'project_code', 'repository_dir', 'company_id'
96
96
  ]
97
97
 
98
98
  for param_name in params_to_copy:
@@ -23,15 +23,6 @@ from .container import container
23
23
 
24
24
  click_log.basic_config(LOGGER)
25
25
 
26
-
27
- def api_url_autocompletion(*args, **kargs):
28
- return [
29
- api.PRODUCTION_API_URL,
30
- api.STAGING_API_URL,
31
- api.DEVELOPMENT_API_URL,
32
- ]
33
-
34
-
35
26
  @click.group()
36
27
  @click_log.simple_verbosity_option(LOGGER, '-l', '--verbosity')
37
28
  @click.option(
@@ -48,7 +39,6 @@ def api_url_autocompletion(*args, **kargs):
48
39
  envvar=("CONVISO_API_URL", "FLOW_API_URL"),
49
40
  default=api.DEFAULT_API_URL,
50
41
  show_default=True,
51
- autocompletion=api_url_autocompletion,
52
42
  help='The api url to access Conviso Platform resources.',
53
43
  )
54
44
  @click.option(
@@ -0,0 +1,45 @@
1
+ import os
2
+ import platform
3
+ import subprocess
4
+
5
+ class EnvironmentChecker:
6
+ """
7
+ A class to check the system environment for required software and services.
8
+ """
9
+
10
+ def __init__(self):
11
+ self.checks = {}
12
+
13
+ def _run_command(self, command, check_running=False):
14
+ """Helper function to run shell commands and capture output/errors."""
15
+ try:
16
+ process = subprocess.run(command, capture_output=True, text=True, check=not check_running)
17
+ if check_running:
18
+ return process.returncode == 0, "", ""
19
+ return process.returncode == 0, process.stdout.strip(), process.stderr.strip()
20
+ except FileNotFoundError:
21
+ return False, "", "Command not found"
22
+ except subprocess.CalledProcessError as e:
23
+ return False, "", e.stderr.strip()
24
+
25
+ def check_docker(self):
26
+ """Checks if Docker is installed and the daemon is running."""
27
+ installed, _, _ = self._run_command(["docker", "--version"])
28
+ running, _, _ = self._run_command(["docker", "info"], check_running=True)
29
+ self.checks["docker_installed"] = installed
30
+ self.checks["docker_running"] = running
31
+ return installed and running
32
+
33
+ def run_all_checks(self):
34
+ """Runs all checks and prints a summary."""
35
+ self.check_docker()
36
+
37
+ print("Environment Check Summary:")
38
+ for check, result in self.checks.items():
39
+ if "version" in check:
40
+ print(f"- {check.replace('_',' ').title()}: {result}")
41
+ else:
42
+ status = "OK" if result else "FAILED"
43
+ print(f"- {check.replace('_',' ').title()}: {status}")
44
+
45
+ return all(self.checks.values())
@@ -109,13 +109,11 @@ def run(context, flow_context, project_code, asset_id, company_id, repository_di
109
109
  This command will perform IAC analysis at the source code. The analysis
110
110
  results can be reported or not to flow application.
111
111
  """
112
- context.params['company_id'] = company_id if company_id is not None else None
113
-
114
112
  if not from_ast:
115
113
  prepared_context = RequirementsVerifier.prepare_context(clone(context))
116
114
 
117
115
  params_to_copy = [
118
- 'project_code', 'asset_id', 'repository_dir', 'send_to_flow',
116
+ 'project_code', 'asset_id', 'company_id', 'repository_dir', 'send_to_flow',
119
117
  'deploy_id', 'scanner_timeout', 'parallel_workers', 'experimental'
120
118
  ]
121
119
 
@@ -92,6 +92,8 @@ class RequirementsVerifier:
92
92
  @staticmethod
93
93
  def create_asset_with_custom_name(context, company_id, asset_name):
94
94
  """ Create an asset with custom name pass with a custom name """
95
+ if not asset_name or not asset_name.strip(): # Check for None or blank string
96
+ raise ValueError("Asset name cannot be None or blank.")
95
97
 
96
98
  # we need to verify if already has an asset with the name provided.
97
99
  # because graphql will return an error if already has.
@@ -202,71 +202,23 @@ def deploy_results_to_conviso_beta(
202
202
  ):
203
203
  """Send SAST results to the Conviso platform."""
204
204
 
205
- duplicated_issues = 0
206
- total_issues = 0
207
- errors_occurred = 0
208
-
209
205
  results_context = click.progressbar(
210
- results_filepaths, label="Sending SAST reports to the Conviso Platform..."
206
+ results_filepaths, label="🔧 Sending SAST report to the Conviso Platform ..."
211
207
  )
212
208
 
213
209
  with results_context as reports:
214
210
  for report_path in reports:
211
+ api_key = flow_context.key
212
+ conviso_api = flow_context.create_conviso_graphql_client()
213
+
215
214
  try:
216
- with open(report_path, 'r') as report_file:
217
- report_content = json.load(report_file)
218
- except (OSError, json.JSONDecodeError) as e:
219
- LOGGER.warn(f"⚠️ Failed to process the report '{report_path}': {e}")
220
- errors_occurred += 1
221
- continue
222
-
223
- issues = report_content.get("issues", [])
224
- if not issues:
225
- continue
226
-
227
- for issue in issues:
228
- total_issues += 1
229
- issue_cwe = issue.get('cwe_id', '')
230
-
231
- if issue_cwe != '':
232
- issue_cwe = f'CWE-{issue_cwe}'
233
-
234
- issue_model = CreateSastFindingInput(
235
- asset_id=asset_id,
236
- file_name=issue.get("filename"),
237
- vulnerable_line=issue.get("line"),
238
- title=issue.get("title"),
239
- description=issue.get("description"),
240
- severity=issue.get("severity"),
241
- commit_ref=commit_ref,
242
- deploy_id=deploy_id,
243
- code_snippet=parse_code_snippet(issue.get("evidence")),
244
- reference=parse_conviso_references(issue.get("references")),
245
- first_line=parse_first_line_number(issue.get("evidence")),
246
- category=issue_cwe,
247
- original_issue_id_from_tool=issue.get("hash_issue") or issue.get("hash_issue_v2"),
248
- solution=issue.get('solution')
215
+ conviso_api.issues.send_issues_file(
216
+ company_id=company_id, asset_id=asset_id, file_path=report_path, api_key=api_key, vulnerability_type='SAST_FINDING',
217
+ deploy_id=deploy_id, commit_ref=commit_ref
249
218
  )
250
-
251
- try:
252
- conviso_api.issues.create_sast(issue_model)
253
- except ResponseError as error:
254
- if error.code == 'RECORD_NOT_UNIQUE':
255
- duplicated_issues += 1
256
- else:
257
- retry_handler = RetryHandler(
258
- flow_context=flow_context, company_id=company_id, asset_id=asset_id
259
- )
260
- retry_handler.execute_with_retry(conviso_api.issues.create_sast, issue_model)
261
- except Exception:
262
- retry_handler = RetryHandler(
263
- flow_context=flow_context, company_id=company_id, asset_id=asset_id
264
- )
265
- retry_handler.execute_with_retry(conviso_api.issues.create_sast, issue_model)
266
-
267
- continue
268
-
269
- LOGGER.info(f"💬 {duplicated_issues} issue(s) ignored due to duplication.")
219
+ except Exception as e:
220
+ # send to conviso slack and pass
221
+ pass
270
222
 
271
223
 
272
224
  @click.command()
@@ -393,28 +345,9 @@ def deploy_results_to_conviso_beta(
393
345
  @help_option
394
346
  @pass_flow_context
395
347
  @click.pass_context
396
- def run(
397
- context,
398
- flow_context,
399
- project_code,
400
- asset_id,
401
- company_id,
402
- end_commit,
403
- start_commit,
404
- repository_dir,
405
- send_to_flow,
406
- deploy_id,
407
- sastbox_registry,
408
- sastbox_repository_name,
409
- sastbox_tag,
410
- sastbox_skip_login,
411
- fail_on_threshold,
412
- fail_on_severity_threshold,
413
- experimental,
414
- asset_name,
415
- vulnerability_auto_close,
416
- from_ast
417
- ):
348
+ def run(context, flow_context, project_code, asset_id, company_id, end_commit, start_commit, repository_dir,
349
+ send_to_flow, deploy_id, sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login,
350
+ fail_on_threshold, fail_on_severity_threshold, experimental, asset_name, vulnerability_auto_close, from_ast):
418
351
  """
419
352
  This command will perform SAST analysis at the source code. The analysis
420
353
  results can be reported or not to flow application. The analysis can be
@@ -422,13 +355,11 @@ def run(
422
355
 
423
356
  This command will write the analysis reports files paths to stdout.
424
357
  """
425
- context.params['company_id'] = company_id if company_id is not None else None
426
-
427
358
  if not from_ast:
428
359
  prepared_context = RequirementsVerifier.prepare_context(clone(context))
429
360
 
430
361
  params_to_copy = [
431
- 'project_code', 'asset_id', 'start_commit', 'end_commit',
362
+ 'project_code', 'asset_id', 'company_id', 'start_commit', 'end_commit',
432
363
  'repository_dir', 'send_to_flow', 'deploy_id', 'sastbox_registry',
433
364
  'sastbox_repository_name', 'sastbox_tag', 'sastbox_skip_login',
434
365
  'experimental', 'asset_name', 'vulnerability_auto_close', 'company_id'
@@ -459,24 +390,10 @@ def run(
459
390
  )
460
391
 
461
392
 
462
- def perform_command(
463
- flow_context,
464
- project_code,
465
- asset_id,
466
- end_commit,
467
- start_commit,
468
- repository_dir,
469
- send_to_flow,
470
- deploy_id,
471
- sastbox_registry,
472
- sastbox_repository_name,
473
- sastbox_tag,
474
- sastbox_skip_login,
475
- fail_on_threshold,
476
- fail_on_severity_threshold,
477
- experimental,
478
- company_id
479
- ):
393
+ def perform_command(flow_context, project_code, asset_id, end_commit, start_commit, repository_dir, send_to_flow,
394
+ deploy_id, sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login,
395
+ fail_on_threshold, fail_on_severity_threshold, experimental, company_id):
396
+
480
397
  if send_to_flow and not experimental and not project_code:
481
398
  raise click.MissingParameter(
482
399
  "It is required when sending reports to Conviso Platform API.",
@@ -108,13 +108,6 @@ from convisoappsec.flowcli.common import (asset_id_option, project_code_option)
108
108
  @click.pass_context
109
109
  def generate(context, flow_context, project_code, asset_id, company_id, repository_dir, send_to_flow, custom_sca_tags,
110
110
  scanner_timeout, parallel_workers, deploy_id, experimental, asset_name, vulnerability_auto_close, from_ast):
111
-
112
- # Ensure company_id is valid
113
- context.params['company_id'] = context.params.get('company_id') or company_id
114
- if not context.params['company_id']:
115
- log_func(f"⚠️ Invalid company_id: {company_id}. Exiting.")
116
- return
117
-
118
111
  # Prepare context if not coming from AST
119
112
  if not from_ast:
120
113
  try:
@@ -125,7 +118,7 @@ def generate(context, flow_context, project_code, asset_id, company_id, reposito
125
118
 
126
119
  # Copy parameters from locals or prepared_context
127
120
  params_to_copy = [
128
- 'project_code', 'asset_id', 'repository_dir', 'send_to_flow',
121
+ 'project_code', 'asset_id', 'company_id', 'repository_dir', 'send_to_flow',
129
122
  'deploy_id', 'custom_sca_tags', 'scanner_timeout', 'parallel_workers',
130
123
  'experimental', 'asset_name', 'vulnerability_auto_close'
131
124
  ]
@@ -169,8 +162,10 @@ def generate(context, flow_context, project_code, asset_id, company_id, reposito
169
162
  log_func(f"⚠️ Unexpected error during SBOM generation: {e}")
170
163
  return
171
164
 
172
- # Ensure asset_id is available
165
+ # Ensure asset_id and company_id is available
173
166
  asset_id = asset_id or context.params.get('asset_id')
167
+ company_id = company_id or context.params.get('company_id')
168
+
174
169
  if not asset_id:
175
170
  log_func(f"⚠️ Missing asset_id. Unable to send SBOM.")
176
171
  return
@@ -119,34 +119,17 @@ click_log.basic_config(LOGGER)
119
119
  @help_option
120
120
  @pass_flow_context
121
121
  @click.pass_context
122
- def run(
123
- context,
124
- flow_context,
125
- project_code,
126
- asset_id,
127
- company_id,
128
- repository_dir,
129
- send_to_flow,
130
- custom_sca_tags,
131
- scanner_timeout,
132
- parallel_workers,
133
- deploy_id,
134
- experimental,
135
- asset_name,
136
- vulnerability_auto_close,
137
- from_ast
138
- ):
122
+ def run(context, flow_context, project_code, asset_id, company_id, repository_dir, send_to_flow, custom_sca_tags,
123
+ scanner_timeout, parallel_workers, deploy_id, experimental, asset_name, vulnerability_auto_close, from_ast):
139
124
  """
140
125
  This command will perform SCA analysis at the source code. The analysis
141
126
  results can be reported or not to flow application.
142
127
  """
143
- context.params['company_id'] = company_id if company_id is not None else None
144
-
145
128
  if not from_ast:
146
129
  prepared_context = RequirementsVerifier.prepare_context(clone(context))
147
130
 
148
131
  params_to_copy = [
149
- 'project_code', 'asset_id', 'repository_dir', 'send_to_flow',
132
+ 'project_code', 'asset_id', 'company_id', 'repository_dir', 'send_to_flow',
150
133
  'deploy_id', 'custom_sca_tags', 'scanner_timeout', 'parallel_workers',
151
134
  'experimental', 'asset_name', 'vulnerability_auto_close'
152
135
  ]