conviso-ast 3.0.1rc1__tar.gz → 3.0.1rc3__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_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/PKG-INFO +1 -1
  2. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/PKG-INFO +1 -1
  3. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/SOURCES.txt +4 -0
  4. conviso_ast-3.0.1rc3/convisoappsec/flowcli/ast/dry_run.py +99 -0
  5. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/ast/entrypoint.py +2 -1
  6. conviso_ast-3.0.1rc3/convisoappsec/flowcli/iac/dry_run.py +94 -0
  7. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/iac/entrypoint.py +2 -0
  8. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/iac/run.py +10 -0
  9. conviso_ast-3.0.1rc3/convisoappsec/flowcli/sast/dry_run.py +159 -0
  10. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sast/entrypoint.py +2 -0
  11. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sbom/generate.py +1 -1
  12. conviso_ast-3.0.1rc3/convisoappsec/flowcli/sca/dry_run.py +108 -0
  13. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sca/entrypoint.py +2 -0
  14. conviso_ast-3.0.1rc3/convisoappsec/version.py +1 -0
  15. conviso_ast-3.0.1rc1/convisoappsec/version.py +0 -1
  16. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/README.md +0 -0
  17. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/dependency_links.txt +0 -0
  18. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/entry_points.txt +0 -0
  19. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/requires.txt +0 -0
  20. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/conviso_ast.egg-info/top_level.txt +0 -0
  21. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/__init__.py +0 -0
  22. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/__init__.py +0 -0
  23. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/box.py +0 -0
  24. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/cleaner.py +0 -0
  25. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/docker.py +0 -0
  26. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/exceptions.py +0 -0
  27. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/git_data_parser.py +0 -0
  28. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/graphql/__init__.py +0 -0
  29. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/graphql/error_handlers.py +0 -0
  30. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/graphql/errors.py +0 -0
  31. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/graphql/low_client.py +0 -0
  32. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/retry_handler.py +0 -0
  33. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/common/strings.py +0 -0
  34. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/__init__.py +0 -0
  35. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/api.py +0 -0
  36. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/cleaner.py +0 -0
  37. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/__init__.py +0 -0
  38. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  39. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
  40. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  41. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  42. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
  43. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
  44. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
  45. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
  46. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
  47. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
  48. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  49. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
  50. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  51. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  52. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/client.py +0 -0
  53. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  54. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
  55. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
  56. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
  57. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/resources_api.py +0 -0
  58. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  59. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +0 -0
  60. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
  61. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/util/__init__.py +0 -0
  62. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/util/ci_provider.py +0 -0
  63. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/util/source_code_compressor.py +0 -0
  64. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/version_control_system_adapter.py +0 -0
  65. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/version_searchers/__init__.py +0 -0
  66. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
  67. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
  68. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
  69. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/versioning_style/__init__.py +0 -0
  70. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
  71. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/__init__.py +0 -0
  72. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/__main__.py +0 -0
  73. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/assets/__init__.py +0 -0
  74. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/assets/create.py +0 -0
  75. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
  76. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/assets/ls.py +0 -0
  77. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/ast/__init__.py +0 -0
  78. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/common.py +0 -0
  79. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/companies/__init__.py +0 -0
  80. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/companies/ls.py +0 -0
  81. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/container/__init__.py +0 -0
  82. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/container/entrypoint.py +0 -0
  83. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/container/run.py +0 -0
  84. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/context.py +0 -0
  85. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/__init__.py +0 -0
  86. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
  87. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/context.py +0 -0
  88. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
  89. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
  90. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
  91. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
  92. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
  93. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
  94. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
  95. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
  96. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -0
  97. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -0
  98. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
  99. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/entrypoint.py +0 -0
  100. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/environment_checker.py +0 -0
  101. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/__init__.py +0 -0
  102. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
  103. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
  104. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
  105. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
  106. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
  107. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
  108. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
  109. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
  110. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/help_option.py +0 -0
  111. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/iac/__init__.py +0 -0
  112. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/requirements_verifier.py +0 -0
  113. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sast/__init__.py +0 -0
  114. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sast/run.py +0 -0
  115. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sbom/__init__.py +0 -0
  116. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
  117. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sca/__init__.py +0 -0
  118. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/sca/run.py +0 -0
  119. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
  120. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
  121. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +0 -0
  122. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
  123. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
  124. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/flowcli/vulnerability/run.py +0 -0
  125. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/logger.py +0 -0
  126. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/sast/__init__.py +0 -0
  127. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/sast/decision.py +0 -0
  128. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/convisoappsec/sast/sastbox.py +0 -0
  129. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/scripts/shell_completer/flow_bash_completer.sh +0 -0
  130. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/scripts/shell_completer/flow_fish_completer.fish +0 -0
  131. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
  132. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/setup.cfg +0 -0
  133. {conviso_ast-3.0.1rc1 → conviso_ast-3.0.1rc3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-ast
3
- Version: 3.0.1rc1
3
+ Version: 3.0.1rc3
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-ast
3
- Version: 3.0.1rc1
3
+ Version: 3.0.1rc3
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
@@ -71,6 +71,7 @@ convisoappsec/flowcli/assets/create.py
71
71
  convisoappsec/flowcli/assets/entrypoint.py
72
72
  convisoappsec/flowcli/assets/ls.py
73
73
  convisoappsec/flowcli/ast/__init__.py
74
+ convisoappsec/flowcli/ast/dry_run.py
74
75
  convisoappsec/flowcli/ast/entrypoint.py
75
76
  convisoappsec/flowcli/companies/__init__.py
76
77
  convisoappsec/flowcli/companies/ls.py
@@ -101,15 +102,18 @@ convisoappsec/flowcli/findings/create/with_/version_tracker.py
101
102
  convisoappsec/flowcli/findings/import_sarif/__init__.py
102
103
  convisoappsec/flowcli/findings/import_sarif/entrypoint.py
103
104
  convisoappsec/flowcli/iac/__init__.py
105
+ convisoappsec/flowcli/iac/dry_run.py
104
106
  convisoappsec/flowcli/iac/entrypoint.py
105
107
  convisoappsec/flowcli/iac/run.py
106
108
  convisoappsec/flowcli/sast/__init__.py
109
+ convisoappsec/flowcli/sast/dry_run.py
107
110
  convisoappsec/flowcli/sast/entrypoint.py
108
111
  convisoappsec/flowcli/sast/run.py
109
112
  convisoappsec/flowcli/sbom/__init__.py
110
113
  convisoappsec/flowcli/sbom/entrypoint.py
111
114
  convisoappsec/flowcli/sbom/generate.py
112
115
  convisoappsec/flowcli/sca/__init__.py
116
+ convisoappsec/flowcli/sca/dry_run.py
113
117
  convisoappsec/flowcli/sca/entrypoint.py
114
118
  convisoappsec/flowcli/sca/run.py
115
119
  convisoappsec/flowcli/vulnerability/__init__.py
@@ -0,0 +1,99 @@
1
+ import click
2
+ import json
3
+ import traceback
4
+ import sys
5
+ from convisoappsec.flowcli import help_option
6
+ from convisoappsec.flowcli.context import pass_flow_context
7
+ from convisoappsec.logger import LOGGER
8
+ from convisoappsec.flowcli.common import on_http_error
9
+ from convisoappsec.common.cleaner import Cleaner
10
+ from convisoappsec.sast.sastbox import SASTBox
11
+ from convisoappsec.flowcli.sast.dry_run import execute_dry_run as execute_sast_dry_run
12
+ from convisoappsec.flowcli.sca.dry_run import execute_dry_run as execute_sca_dry_run
13
+ from convisoappsec.flowcli.iac.dry_run import execute_dry_run as execute_iac_dry_run
14
+
15
+ @click.command(name='dry-run')
16
+ @click.option(
17
+ "-s", "--start-commit", required=False,
18
+ help="If no value is set so the empty tree hash commit is used."
19
+ )
20
+ @click.option(
21
+ "-e", "--end-commit", required=False,
22
+ help="If no value is set so the HEAD commit from the current branch is used"
23
+ )
24
+ @click.option(
25
+ "-r", "--repository-dir", default=".", show_default=True,
26
+ type=click.Path(exists=True, resolve_path=True), required=False,
27
+ help="The source code repository directory."
28
+ )
29
+ @click.option(
30
+ "--sastbox-registry", default="", required=False, hidden=True,
31
+ envvar=("CONVISO_SASTBOX_REGISTRY", "FLOW_SASTBOX_REGISTRY"),
32
+ )
33
+ @click.option(
34
+ "--sastbox-repository-name", default="", required=False, hidden=True,
35
+ envvar=("CONVISO_SASTBOX_REPOSITORY_NAME", "FLOW_SASTBOX_REPOSITORY_NAME"),
36
+ )
37
+ @click.option(
38
+ "--sastbox-tag", default=SASTBox.DEFAULT_TAG, required=False, hidden=True,
39
+ envvar=("CONVISO_SASTBOX_TAG", "FLOW_SASTBOX_TAG"),
40
+ )
41
+ @click.option(
42
+ "--sastbox-skip-login/--sastbox-no-skip-login", default=False, required=False, hidden=True,
43
+ envvar=("CONVISO_SASTBOX_SKIP_LOGIN", "FLOW_SASTBOX_SKIP_LOGIN"),
44
+ )
45
+ @click.option(
46
+ "--custom-sca-tags", hidden=True, required=False, multiple=True, type=(str, str),
47
+ help="It should be passed as <repository_name> <image_tag>."
48
+ )
49
+ @click.option(
50
+ "--scanner-timeout", hidden=True, required=False, default=7200, type=int,
51
+ help="Set timeout for each scanner"
52
+ )
53
+ @click.option(
54
+ '--cleanup', default=False, is_flag=True, show_default=True,
55
+ help="Clean up system resources."
56
+ )
57
+ @help_option
58
+ @pass_flow_context
59
+ def dry_run(flow_context, end_commit, start_commit, repository_dir,
60
+ sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login,
61
+ custom_sca_tags, scanner_timeout, cleanup):
62
+ """
63
+ Perform a dry-run AST analysis (SAST, SCA, IaC).
64
+ Checks API Key, runs the scans, and outputs the results in JSON format to stdout.
65
+ Does NOT create assets or deploys on Conviso Platform.
66
+ """
67
+ try:
68
+ results = {}
69
+
70
+ # Run SAST
71
+ sast_results = execute_sast_dry_run(
72
+ flow_context, end_commit, start_commit, repository_dir,
73
+ sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login
74
+ )
75
+ results['sast'] = sast_results
76
+
77
+ # Run SCA
78
+ sca_results = execute_sca_dry_run(
79
+ flow_context, repository_dir, custom_sca_tags, scanner_timeout
80
+ )
81
+ results['sca'] = sca_results
82
+
83
+ # Run IaC
84
+ iac_results = execute_iac_dry_run(
85
+ flow_context, repository_dir, scanner_timeout
86
+ )
87
+ results['iac'] = iac_results
88
+
89
+ print(json.dumps(results, indent=2))
90
+
91
+ if cleanup:
92
+ LOGGER.info("🧹 Cleaning up ...")
93
+ cleaner = Cleaner()
94
+ cleaner.cleanup()
95
+
96
+ except Exception as e:
97
+ traceback.print_exc(file=sys.stderr)
98
+ on_http_error(e)
99
+ sys.exit(1)
@@ -15,7 +15,7 @@ from convisoappsec.flow import GitAdapter
15
15
  from convisoappsec.flowcli.context import pass_flow_context
16
16
  from convisoappsec.logger import LOGGER, log_and_notify_ast_event
17
17
  from convisoappsec.common.cleaner import Cleaner
18
-
18
+ from .dry_run import dry_run
19
19
 
20
20
  def get_default_params_values(cmd_params):
21
21
  """ Further information in https://click.palletsprojects.com/en/8.1.x/api/?highlight=params#click.Command.params
@@ -425,3 +425,4 @@ def ast():
425
425
 
426
426
 
427
427
  ast.add_command(run)
428
+ ast.add_command(dry_run)
@@ -0,0 +1,94 @@
1
+ import click
2
+ import click_log
3
+ import json
4
+ import traceback
5
+ import sys
6
+ from convisoappsec.common.box import ContainerWrapper
7
+ from convisoappsec.flowcli import help_option
8
+ from convisoappsec.flowcli.context import pass_flow_context
9
+ from convisoappsec.logger import LOGGER
10
+ from convisoappsec.flowcli.common import on_http_error
11
+ from convisoappsec.common.cleaner import Cleaner
12
+
13
+ def execute_dry_run(flow_context, repository_dir, scanner_timeout):
14
+ REQUIRED_CODEBASE_PATH = '/code'
15
+ IAC_IMAGE_NAME = 'iac_scanner_checkov'
16
+ IAC_SCAN_FILENAME = '/{}.json'.format(IAC_IMAGE_NAME)
17
+ containers_map = {
18
+ IAC_IMAGE_NAME: {
19
+ 'repository_dir': repository_dir,
20
+ 'repository_name': IAC_IMAGE_NAME,
21
+ 'tag': 'unstable',
22
+ 'command': [
23
+ '-c', REQUIRED_CODEBASE_PATH,
24
+ '-o', IAC_SCAN_FILENAME,
25
+ ],
26
+ },
27
+ }
28
+
29
+ conviso_rest_api = flow_context.create_conviso_rest_api_client()
30
+ token = conviso_rest_api.docker_registry.get_sast_token()
31
+
32
+ LOGGER.info('💬 Preparing Environment...')
33
+ scanners_wrapper = ContainerWrapper(
34
+ token=token,
35
+ containers_map=containers_map,
36
+ logger=LOGGER,
37
+ timeout=scanner_timeout
38
+ )
39
+
40
+ LOGGER.info('💬 Starting IaC...')
41
+ scanners_wrapper.run()
42
+
43
+ results_list = []
44
+ for r in scanners_wrapper.scanners:
45
+ report_filepath = r.results
46
+ if report_filepath:
47
+ try:
48
+ with open(report_filepath, 'r') as f:
49
+ results_list.append(json.load(f))
50
+ except Exception as e:
51
+ click.echo(f"Error reading result file {report_filepath}: {e}", file=sys.stderr)
52
+
53
+ if len(results_list) == 1:
54
+ return results_list[0]
55
+ return results_list
56
+
57
+ @click.command(name='dry-run')
58
+ @click.option(
59
+ '-r', '--repository-dir', default=".", show_default=True,
60
+ type=click.Path(exists=True, resolve_path=True), required=False,
61
+ help="The source code repository directory."
62
+ )
63
+ @click.option(
64
+ "--scanner-timeout", hidden=True, required=False, default=7200, type=int,
65
+ help="Set timeout for each scanner"
66
+ )
67
+ @click.option(
68
+ '--cleanup', default=False, is_flag=True, show_default=True,
69
+ help="Clean up system resources."
70
+ )
71
+ @help_option
72
+ @pass_flow_context
73
+ def dry_run(flow_context, repository_dir, scanner_timeout, cleanup):
74
+ """
75
+ Perform a dry-run IAC analysis.
76
+ Checks API Key, runs the scan, and outputs the results in JSON format to stdout.
77
+ Does NOT create assets or deploys on Conviso Platform.
78
+ """
79
+ try:
80
+ results = execute_dry_run(flow_context, repository_dir, scanner_timeout)
81
+
82
+ if results:
83
+ print(json.dumps(results, indent=2))
84
+ else:
85
+ print(json.dumps({}, indent=2))
86
+
87
+ if cleanup:
88
+ LOGGER.info("🧹 Cleaning up ...")
89
+ cleaner = Cleaner()
90
+ cleaner.cleanup()
91
+
92
+ except Exception as e:
93
+ on_http_error(e)
94
+ sys.exit(1)
@@ -2,6 +2,7 @@ import click
2
2
 
3
3
  from convisoappsec.flowcli import help_option
4
4
  from .run import run
5
+ from .dry_run import dry_run
5
6
 
6
7
 
7
8
  @click.group()
@@ -11,6 +12,7 @@ def iac():
11
12
 
12
13
 
13
14
  iac.add_command(run)
15
+ iac.add_command(dry_run)
14
16
 
15
17
  iac.epilog = '''
16
18
  Run flow iac COMMAND --help for more information on a command.
@@ -142,6 +142,7 @@ def run(context, flow_context, asset_id, company_id, repository_dir, send_to_flo
142
142
  def deploy_results_to_conviso(
143
143
  conviso_api, results_filepaths, asset_id, company_id, flow_context, deploy_id, commit_ref=None, control_sync_status_id=None
144
144
  ):
145
+
145
146
  results_context = click.progressbar(results_filepaths, label="Sending results to the Conviso Platform...")
146
147
 
147
148
  with results_context as reports:
@@ -181,6 +182,15 @@ def deploy_results_to_conviso(
181
182
  except ResponseError as error:
182
183
  if error.code == 'RECORD_NOT_UNIQUE':
183
184
  continue
185
+ elif error.code == "Record not found" or "Record not found" in str(error):
186
+ LOGGER.warning(
187
+ f"\n⚠️ [Record Not Found] Falha ao vincular vulnerabilidade (Asset ou Sync ID inválido). Item ignorado.\n"
188
+ f" - Issue: {issue.get('title')}\n"
189
+ f" - Hash: {issue.get('hash_issue')}"
190
+ f" - Asset: {asset_id}"
191
+ f" - control sync: {control_sync_status_id}"
192
+ )
193
+ continue
184
194
  else:
185
195
  retry_handler = RetryHandler(
186
196
  flow_context=flow_context, company_id=company_id, asset_id=asset_id
@@ -0,0 +1,159 @@
1
+ import sys
2
+ import click
3
+ import traceback
4
+ import json
5
+ from convisoappsec.sast.sastbox import SASTBox
6
+ from docker.errors import APIError
7
+ import time
8
+ from convisoappsec.flow import GitAdapter
9
+ from convisoappsec.flowcli import help_option
10
+ from convisoappsec.flowcli.context import pass_flow_context
11
+ from convisoappsec.logger import LOGGER
12
+ from convisoappsec.common.cleaner import Cleaner
13
+ from convisoappsec.flowcli.common import on_http_error
14
+
15
+ class DryRunSASTBox(SASTBox):
16
+ def recovery_technologies_file(self):
17
+ # Skip technology recovery and update for dry-run
18
+ pass
19
+
20
+ def perform_dry_run_sastbox_scan(
21
+ conviso_rest_api, sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login, repository_dir, end_commit, start_commit, logger
22
+ ):
23
+ max_retries = 5
24
+ retries = 0
25
+ sastbox = DryRunSASTBox(registry=sastbox_registry, repository_name=sastbox_repository_name, tag=sastbox_tag)
26
+ pull_progress_bar = click.progressbar(length=sastbox.size, label="Performing SAST download...")
27
+
28
+ while retries < max_retries:
29
+ try:
30
+ if not sastbox_skip_login:
31
+ logger("Checking SASTBox authorization...")
32
+ token = conviso_rest_api.docker_registry.get_sast_token()
33
+ sastbox.login(token)
34
+
35
+ with pull_progress_bar as progressbar:
36
+ for downloaded_chunk in sastbox.pull():
37
+ progressbar.update(downloaded_chunk)
38
+ break
39
+ except APIError as e:
40
+ retries += 1
41
+ logger(f"Retrying {retries}/{max_retries}...")
42
+ time.sleep(1)
43
+
44
+ if retries == max_retries:
45
+ logger("Max retries reached. Failed to perform SAST download.")
46
+ raise Exception(f"Max retries reached. Could not complete the SAST download. Error: {str(e)}")
47
+
48
+ logger("Starting SAST scan diff...")
49
+
50
+ reports = sastbox.run_scan_diff(repository_dir, end_commit, start_commit, log=logger)
51
+
52
+ logger("SAST scan diff done.")
53
+
54
+ results_filepaths = []
55
+ for r in reports:
56
+ try:
57
+ file_path = str(r)
58
+ results_filepaths.append(file_path)
59
+ except Exception as e:
60
+ click.echo(f"Error decoding file path: {r} with error {e}.", file=sys.stderr)
61
+
62
+ return results_filepaths
63
+
64
+ def log_func(msg, new_line=True):
65
+ click.echo(msg, nl=new_line, err=True)
66
+
67
+ def execute_dry_run(flow_context, end_commit, start_commit, repository_dir,
68
+ sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login):
69
+ git_adapter = GitAdapter(repository_dir)
70
+ end_commit = end_commit or git_adapter.head_commit
71
+ start_commit = start_commit or git_adapter.empty_repository_tree_commit
72
+
73
+ if start_commit == end_commit:
74
+ return {}
75
+
76
+ conviso_rest_api = flow_context.create_conviso_rest_api_client()
77
+
78
+ results_filepaths = perform_dry_run_sastbox_scan(
79
+ conviso_rest_api, sastbox_registry, sastbox_repository_name, sastbox_tag,
80
+ sastbox_skip_login, repository_dir, end_commit, start_commit, log_func
81
+ )
82
+
83
+ results_list = []
84
+ for path in results_filepaths:
85
+ try:
86
+ with open(path, 'r') as f:
87
+ results_list.append(json.load(f))
88
+ except Exception as e:
89
+ click.echo(f"Error reading result file {path}: {e}", file=sys.stderr)
90
+
91
+ if len(results_list) == 1:
92
+ return results_list[0]
93
+ return results_list
94
+
95
+ @click.command(name='dry-run')
96
+ @click.option(
97
+ "-s", "--start-commit", required=False,
98
+ help="If no value is set so the empty tree hash commit is used."
99
+ )
100
+ @click.option(
101
+ "-e", "--end-commit", required=False,
102
+ help="If no value is set so the HEAD commit from the current branch is used"
103
+ )
104
+ @click.option(
105
+ "-r", "--repository-dir", default=".", show_default=True,
106
+ type=click.Path(exists=True, resolve_path=True), required=False,
107
+ help="The source code repository directory."
108
+ )
109
+ @click.option(
110
+ "--sastbox-registry", default="", required=False, hidden=True,
111
+ envvar=("CONVISO_SASTBOX_REGISTRY", "FLOW_SASTBOX_REGISTRY"),
112
+ )
113
+ @click.option(
114
+ "--sastbox-repository-name", default="", required=False, hidden=True,
115
+ envvar=("CONVISO_SASTBOX_REPOSITORY_NAME", "FLOW_SASTBOX_REPOSITORY_NAME"),
116
+ )
117
+ @click.option(
118
+ "--sastbox-tag", default=SASTBox.DEFAULT_TAG, required=False, hidden=True,
119
+ envvar=("CONVISO_SASTBOX_TAG", "FLOW_SASTBOX_TAG"),
120
+ )
121
+ @click.option(
122
+ "--sastbox-skip-login/--sastbox-no-skip-login", default=False, required=False, hidden=True,
123
+ envvar=("CONVISO_SASTBOX_SKIP_LOGIN", "FLOW_SASTBOX_SKIP_LOGIN"),
124
+ )
125
+ @click.option(
126
+ '--cleanup', default=False, is_flag=True, show_default=True,
127
+ help="Clean up system resources."
128
+ )
129
+ @click.option(
130
+ "-o", "--output", required=False, help="Output the results to a JSON file."
131
+ )
132
+ @help_option
133
+ @pass_flow_context
134
+ def dry_run(flow_context, end_commit, start_commit, repository_dir,
135
+ sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login, cleanup, output):
136
+ try:
137
+ results = execute_dry_run(
138
+ flow_context, end_commit, start_commit, repository_dir,
139
+ sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login
140
+ )
141
+
142
+ if output:
143
+ with open(output, "w") as f:
144
+ json.dump(results if results else {}, f, indent=2)
145
+ LOGGER.info(f"Results saved to {output}")
146
+ elif results:
147
+ print(json.dumps(results, indent=2))
148
+ else:
149
+ print(json.dumps({}, indent=2))
150
+
151
+ if cleanup:
152
+ LOGGER.info("🧹 Cleaning up ...")
153
+ cleaner = Cleaner()
154
+ cleaner.cleanup()
155
+
156
+ except Exception as e:
157
+ traceback.print_exc(file=sys.stderr)
158
+ on_http_error(e)
159
+ sys.exit(1)
@@ -2,6 +2,7 @@ import click
2
2
 
3
3
  from convisoappsec.flowcli import help_option
4
4
  from .run import run
5
+ from .dry_run import dry_run
5
6
 
6
7
 
7
8
  @click.group()
@@ -11,6 +12,7 @@ def sast():
11
12
 
12
13
 
13
14
  sast.add_command(run)
15
+ sast.add_command(dry_run)
14
16
 
15
17
  sast.epilog = '''
16
18
  Run flow sast COMMAND --help for more information on a command.
@@ -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
 
@@ -0,0 +1,108 @@
1
+ import click
2
+ import click_log
3
+ import traceback
4
+ import json
5
+ import sys
6
+ from convisoappsec.common.box import ContainerWrapper
7
+ from convisoappsec.flowcli import help_option
8
+ from convisoappsec.flowcli.context import pass_flow_context
9
+ from convisoappsec.logger import LOGGER
10
+ from convisoappsec.flowcli.common import on_http_error
11
+ from convisoappsec.common.cleaner import Cleaner
12
+
13
+ def log_func(msg, new_line=True):
14
+ click.echo(msg, nl=new_line, err=True)
15
+
16
+ def execute_dry_run(flow_context, repository_dir, custom_sca_tags, scanner_timeout):
17
+ REQUIRED_CODEBASE_PATH = '/code'
18
+ OSV_SCANNER_IMAGE_NAME = 'osv_scanner'
19
+
20
+ scanners = {
21
+ OSV_SCANNER_IMAGE_NAME: {
22
+ 'repository_name': OSV_SCANNER_IMAGE_NAME,
23
+ 'tag': 'latest',
24
+ 'command': [
25
+ '-c', REQUIRED_CODEBASE_PATH,
26
+ '-f', 'json',
27
+ '-o', '/{}.json'.format(OSV_SCANNER_IMAGE_NAME)
28
+ ],
29
+ 'repository_dir': repository_dir
30
+ },
31
+ }
32
+
33
+ if custom_sca_tags:
34
+ for custom_tag in custom_sca_tags:
35
+ scan_name, tag = custom_tag
36
+ if scan_name in scanners.keys():
37
+ scanners[scan_name]['tag'] = tag
38
+
39
+ conviso_rest_api = flow_context.create_conviso_rest_api_client()
40
+ token = conviso_rest_api.docker_registry.get_sast_token()
41
+
42
+ LOGGER.info('💬 Preparing Environment...')
43
+ scabox = ContainerWrapper(
44
+ token=token,
45
+ containers_map=scanners,
46
+ logger=LOGGER,
47
+ timeout=scanner_timeout
48
+ )
49
+ LOGGER.info('💬 Starting SCA...')
50
+ scabox.run()
51
+
52
+ results_list = []
53
+ for unit in scabox.scanners:
54
+ file_path = unit.results
55
+ if file_path:
56
+ try:
57
+ with open(file_path, 'r') as f:
58
+ results_list.append(json.load(f))
59
+ except Exception as e:
60
+ click.echo(f"Error reading result file {file_path}: {e}", file=sys.stderr)
61
+
62
+ if len(results_list) == 1:
63
+ return results_list[0]
64
+ return results_list
65
+
66
+
67
+ @click.command(name='dry-run')
68
+ @click.option(
69
+ '-r', '--repository-dir', default=".", show_default=True,
70
+ type=click.Path(exists=True, resolve_path=True), required=False,
71
+ help="The source code repository directory."
72
+ )
73
+ @click.option(
74
+ "--custom-sca-tags", hidden=True, required=False, multiple=True, type=(str, str),
75
+ help="It should be passed as <repository_name> <image_tag>."
76
+ )
77
+ @click.option(
78
+ "--scanner-timeout", hidden=True, required=False, default=7200, type=int,
79
+ help="Set timeout for each scanner"
80
+ )
81
+ @click.option(
82
+ '--cleanup', default=False, is_flag=True, show_default=True,
83
+ help="Clean up system resources."
84
+ )
85
+ @help_option
86
+ @pass_flow_context
87
+ def dry_run(flow_context, repository_dir, custom_sca_tags, scanner_timeout, cleanup):
88
+ """
89
+ Perform a dry-run SCA analysis.
90
+ Checks API Key, runs the scan, and outputs the results in JSON format to stdout.
91
+ Does NOT create assets or deploys on Conviso Platform.
92
+ """
93
+ try:
94
+ results = execute_dry_run(flow_context, repository_dir, custom_sca_tags, scanner_timeout)
95
+
96
+ if results:
97
+ print(json.dumps(results, indent=2))
98
+ else:
99
+ print(json.dumps({}, indent=2))
100
+
101
+ if cleanup:
102
+ LOGGER.info("🧹 Cleaning up ...")
103
+ cleaner = Cleaner()
104
+ cleaner.cleanup()
105
+
106
+ except Exception as e:
107
+ on_http_error(e)
108
+ sys.exit(1)
@@ -2,6 +2,7 @@ import click
2
2
 
3
3
  from convisoappsec.flowcli import help_option
4
4
  from .run import run
5
+ from .dry_run import dry_run
5
6
 
6
7
 
7
8
  @click.group()
@@ -11,6 +12,7 @@ def sca():
11
12
 
12
13
 
13
14
  sca.add_command(run)
15
+ sca.add_command(dry_run)
14
16
 
15
17
  sca.epilog = '''
16
18
  Run flow sca COMMAND --help for more information on a command.
@@ -0,0 +1 @@
1
+ __version__ = '3.0.1-rc.3'
@@ -1 +0,0 @@
1
- __version__ = '3.0.1-rc.1'
File without changes
File without changes
File without changes