conviso-ast 3.0.0rc0__tar.gz → 3.0.1__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 (139) hide show
  1. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/PKG-INFO +4 -4
  2. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/PKG-INFO +4 -4
  3. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/SOURCES.txt +4 -5
  4. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/requires.txt +3 -3
  5. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/retry_handler.py +2 -2
  6. conviso_ast-3.0.1/convisoappsec/flow/util/__init__.py +5 -0
  7. conviso_ast-3.0.1/convisoappsec/flowcli/ast/dry_run.py +99 -0
  8. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/ast/entrypoint.py +2 -1
  9. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -2
  10. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -2
  11. conviso_ast-3.0.1/convisoappsec/flowcli/iac/dry_run.py +94 -0
  12. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/entrypoint.py +2 -0
  13. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/run.py +4 -1
  14. conviso_ast-3.0.1/convisoappsec/flowcli/sast/dry_run.py +159 -0
  15. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/entrypoint.py +2 -0
  16. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/generate.py +1 -1
  17. conviso_ast-3.0.1/convisoappsec/flowcli/sca/dry_run.py +108 -0
  18. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/entrypoint.py +2 -0
  19. conviso_ast-3.0.1/convisoappsec/version.py +1 -0
  20. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/setup.py +3 -3
  21. conviso_ast-3.0.0rc0/convisoappsec/flow/source_code_scanner/__init__.py +0 -9
  22. conviso_ast-3.0.0rc0/convisoappsec/flow/source_code_scanner/exceptions.py +0 -2
  23. conviso_ast-3.0.0rc0/convisoappsec/flow/source_code_scanner/scc.py +0 -68
  24. conviso_ast-3.0.0rc0/convisoappsec/flow/source_code_scanner/source_code_scanner.py +0 -177
  25. conviso_ast-3.0.0rc0/convisoappsec/flow/util/__init__.py +0 -7
  26. conviso_ast-3.0.0rc0/convisoappsec/flow/util/metrics.py +0 -16
  27. conviso_ast-3.0.0rc0/convisoappsec/version.py +0 -1
  28. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/README.md +0 -0
  29. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/dependency_links.txt +0 -0
  30. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/entry_points.txt +0 -0
  31. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/conviso_ast.egg-info/top_level.txt +0 -0
  32. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/__init__.py +0 -0
  33. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/__init__.py +0 -0
  34. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/box.py +0 -0
  35. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/cleaner.py +0 -0
  36. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/docker.py +0 -0
  37. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/exceptions.py +0 -0
  38. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/git_data_parser.py +0 -0
  39. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/graphql/__init__.py +0 -0
  40. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/graphql/error_handlers.py +0 -0
  41. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/graphql/errors.py +0 -0
  42. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/graphql/low_client.py +0 -0
  43. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/common/strings.py +0 -0
  44. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/__init__.py +0 -0
  45. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/api.py +0 -0
  46. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/cleaner.py +0 -0
  47. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/__init__.py +0 -0
  48. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  49. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
  50. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  51. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  52. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
  53. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
  54. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
  55. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
  56. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
  57. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
  58. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  59. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
  60. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  61. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  62. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/client.py +0 -0
  63. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  64. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
  65. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
  66. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
  67. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/resources_api.py +0 -0
  68. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  69. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +0 -0
  70. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
  71. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/util/ci_provider.py +0 -0
  72. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/util/source_code_compressor.py +0 -0
  73. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/version_control_system_adapter.py +0 -0
  74. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/__init__.py +0 -0
  75. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
  76. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
  77. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
  78. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/versioning_style/__init__.py +0 -0
  79. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
  80. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/__init__.py +0 -0
  81. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/__main__.py +0 -0
  82. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/__init__.py +0 -0
  83. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/create.py +0 -0
  84. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
  85. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/ls.py +0 -0
  86. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/ast/__init__.py +0 -0
  87. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/common.py +0 -0
  88. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/companies/__init__.py +0 -0
  89. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/companies/ls.py +0 -0
  90. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/__init__.py +0 -0
  91. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/entrypoint.py +0 -0
  92. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/run.py +0 -0
  93. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/context.py +0 -0
  94. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/__init__.py +0 -0
  95. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
  96. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/context.py +0 -0
  97. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
  98. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
  99. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
  100. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
  101. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
  102. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
  103. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
  104. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
  105. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
  106. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/entrypoint.py +0 -0
  107. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/environment_checker.py +0 -0
  108. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/__init__.py +0 -0
  109. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
  110. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
  111. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
  112. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
  113. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
  114. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
  115. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
  116. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
  117. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/help_option.py +0 -0
  118. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/__init__.py +0 -0
  119. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/requirements_verifier.py +0 -0
  120. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/__init__.py +0 -0
  121. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/run.py +0 -0
  122. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/__init__.py +0 -0
  123. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
  124. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/__init__.py +0 -0
  125. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/run.py +0 -0
  126. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
  127. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
  128. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +0 -0
  129. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
  130. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
  131. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/run.py +0 -0
  132. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/logger.py +0 -0
  133. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/sast/__init__.py +0 -0
  134. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/sast/decision.py +0 -0
  135. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/convisoappsec/sast/sastbox.py +0 -0
  136. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/scripts/shell_completer/flow_bash_completer.sh +0 -0
  137. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/scripts/shell_completer/flow_fish_completer.fish +0 -0
  138. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
  139. {conviso_ast-3.0.0rc0 → conviso_ast-3.0.1}/setup.cfg +0 -0
@@ -1,22 +1,22 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-ast
3
- Version: 3.0.0rc0
3
+ Version: 3.0.1
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
7
7
  Requires-Python: >=3.9
8
8
  Description-Content-Type: text/markdown
9
- Requires-Dist: GitPython==3.1.45
9
+ Requires-Dist: GitPython==3.1.46
10
10
  Requires-Dist: click==8.1.8
11
11
  Requires-Dist: requests==2.32.5
12
- Requires-Dist: urllib3==2.4.0
12
+ Requires-Dist: urllib3==2.6.3
13
13
  Requires-Dist: semantic-version==2.10.0
14
14
  Requires-Dist: docker==7.1.0
15
15
  Requires-Dist: PyYAML==6.0.3
16
16
  Requires-Dist: click-log==0.4.0
17
17
  Requires-Dist: transitions==0.9.2
18
18
  Requires-Dist: jsonschema==4.25.1
19
- Requires-Dist: giturlparse<=0.12.0
19
+ Requires-Dist: giturlparse<=0.14.0
20
20
  Requires-Dist: jmespath==1.0.1
21
21
  Requires-Dist: setuptools==78.1.0
22
22
  Dynamic: description
@@ -1,22 +1,22 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: conviso-ast
3
- Version: 3.0.0rc0
3
+ Version: 3.0.1
4
4
  Maintainer: Conviso
5
5
  Maintainer-email: development@convisoappsec.com
6
6
  Project-URL: Source, https://github.com/convisoappsec/convisocli/
7
7
  Requires-Python: >=3.9
8
8
  Description-Content-Type: text/markdown
9
- Requires-Dist: GitPython==3.1.45
9
+ Requires-Dist: GitPython==3.1.46
10
10
  Requires-Dist: click==8.1.8
11
11
  Requires-Dist: requests==2.32.5
12
- Requires-Dist: urllib3==2.4.0
12
+ Requires-Dist: urllib3==2.6.3
13
13
  Requires-Dist: semantic-version==2.10.0
14
14
  Requires-Dist: docker==7.1.0
15
15
  Requires-Dist: PyYAML==6.0.3
16
16
  Requires-Dist: click-log==0.4.0
17
17
  Requires-Dist: transitions==0.9.2
18
18
  Requires-Dist: jsonschema==4.25.1
19
- Requires-Dist: giturlparse<=0.12.0
19
+ Requires-Dist: giturlparse<=0.14.0
20
20
  Requires-Dist: jmespath==1.0.1
21
21
  Requires-Dist: setuptools==78.1.0
22
22
  Dynamic: description
@@ -49,13 +49,8 @@ convisoappsec/flow/graphql_api/v1/models/project.py
49
49
  convisoappsec/flow/graphql_api/v1/schemas/__init__.py
50
50
  convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py
51
51
  convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py
52
- convisoappsec/flow/source_code_scanner/__init__.py
53
- convisoappsec/flow/source_code_scanner/exceptions.py
54
- convisoappsec/flow/source_code_scanner/scc.py
55
- convisoappsec/flow/source_code_scanner/source_code_scanner.py
56
52
  convisoappsec/flow/util/__init__.py
57
53
  convisoappsec/flow/util/ci_provider.py
58
- convisoappsec/flow/util/metrics.py
59
54
  convisoappsec/flow/util/source_code_compressor.py
60
55
  convisoappsec/flow/version_searchers/__init__.py
61
56
  convisoappsec/flow/version_searchers/sorted_by_versioning_style.py
@@ -76,6 +71,7 @@ convisoappsec/flowcli/assets/create.py
76
71
  convisoappsec/flowcli/assets/entrypoint.py
77
72
  convisoappsec/flowcli/assets/ls.py
78
73
  convisoappsec/flowcli/ast/__init__.py
74
+ convisoappsec/flowcli/ast/dry_run.py
79
75
  convisoappsec/flowcli/ast/entrypoint.py
80
76
  convisoappsec/flowcli/companies/__init__.py
81
77
  convisoappsec/flowcli/companies/ls.py
@@ -106,15 +102,18 @@ convisoappsec/flowcli/findings/create/with_/version_tracker.py
106
102
  convisoappsec/flowcli/findings/import_sarif/__init__.py
107
103
  convisoappsec/flowcli/findings/import_sarif/entrypoint.py
108
104
  convisoappsec/flowcli/iac/__init__.py
105
+ convisoappsec/flowcli/iac/dry_run.py
109
106
  convisoappsec/flowcli/iac/entrypoint.py
110
107
  convisoappsec/flowcli/iac/run.py
111
108
  convisoappsec/flowcli/sast/__init__.py
109
+ convisoappsec/flowcli/sast/dry_run.py
112
110
  convisoappsec/flowcli/sast/entrypoint.py
113
111
  convisoappsec/flowcli/sast/run.py
114
112
  convisoappsec/flowcli/sbom/__init__.py
115
113
  convisoappsec/flowcli/sbom/entrypoint.py
116
114
  convisoappsec/flowcli/sbom/generate.py
117
115
  convisoappsec/flowcli/sca/__init__.py
116
+ convisoappsec/flowcli/sca/dry_run.py
118
117
  convisoappsec/flowcli/sca/entrypoint.py
119
118
  convisoappsec/flowcli/sca/run.py
120
119
  convisoappsec/flowcli/vulnerability/__init__.py
@@ -1,13 +1,13 @@
1
- GitPython==3.1.45
1
+ GitPython==3.1.46
2
2
  click==8.1.8
3
3
  requests==2.32.5
4
- urllib3==2.4.0
4
+ urllib3==2.6.3
5
5
  semantic-version==2.10.0
6
6
  docker==7.1.0
7
7
  PyYAML==6.0.3
8
8
  click-log==0.4.0
9
9
  transitions==0.9.2
10
10
  jsonschema==4.25.1
11
- giturlparse<=0.12.0
11
+ giturlparse<=0.14.0
12
12
  jmespath==1.0.1
13
13
  setuptools==78.1.0
@@ -20,7 +20,7 @@ class RetryHandler:
20
20
  while retries < self.max_retries:
21
21
  try:
22
22
  return func(*args, **kwargs)
23
- except Exception:
23
+ except Exception as log_message:
24
24
  retries += 1
25
25
  time.sleep(delay)
26
26
  delay *= self.backoff_factor
@@ -28,7 +28,7 @@ class RetryHandler:
28
28
  if retries == self.max_retries:
29
29
  full_trace = traceback.format_exc()
30
30
  LOGGER.warning(
31
- "⚠️ Maximum retries reached. Our technical team has been notified."
31
+ f"⚠️ Maximum retries reached. Our technical team has been notified. Error: {log_message}"
32
32
  )
33
33
 
34
34
  try:
@@ -0,0 +1,5 @@
1
+ from .source_code_compressor import SourceCodeCompressor
2
+
3
+ __all__ = [
4
+ 'SourceCodeCompressor'
5
+ ]
@@ -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)
@@ -1,6 +1,5 @@
1
1
  import click
2
2
  # TODO: refactoring. all deploy create share some behavior
3
- from convisoappsec.flow.util import project_metrics
4
3
  from convisoappsec.flow.version_searchers import TimeBasedVersionSearcher
5
4
  from convisoappsec.flow.version_control_system_adapter import GitAdapter
6
5
  from convisoappsec.flowcli.context import pass_flow_context
@@ -72,7 +71,6 @@ def time_(flow_context, create_context, tag_tracker_context, attach_diff):
72
71
  previous_version=previous_version,
73
72
  diff_content=diff_content,
74
73
  metrics=deploy_metrics,
75
- project_metrics=project_metrics(repository_dir),
76
74
  commit_authors=authors_data
77
75
  )
78
76
 
@@ -1,6 +1,5 @@
1
1
  import click
2
2
  # TODO: refactoring. all deploy create share some behavior
3
- from convisoappsec.flow.util import project_metrics
4
3
  from convisoappsec.flowcli.context import pass_flow_context
5
4
  from convisoappsec.flow.version_searchers import SortedByVersioningStyle
6
5
  from convisoappsec.flow.version_control_system_adapter import GitAdapter
@@ -103,7 +102,6 @@ def versioning_style(
103
102
  previous_version=previous_version,
104
103
  diff_content=diff_content,
105
104
  metrics=deploy_metrics,
106
- project_metrics=project_metrics(repository_dir),
107
105
  commit_authors=authors_data
108
106
  )
109
107
 
@@ -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:
@@ -150,7 +151,7 @@ def deploy_results_to_conviso(
150
151
  with open(report_path) as report_file:
151
152
  data = parse_data(json.load(report_file))
152
153
  except Exception:
153
- LOGGER.warn(f"⚠️ Error processing report file. Our technical team has been notified.")
154
+ LOGGER.warning(f"⚠️ Error processing report file. Our technical team has been notified.")
154
155
  full_trace = traceback.format_exc()
155
156
  log_and_notify_ast_event(
156
157
  flow_context=flow_context, company_id=company_id, asset_id=asset_id,
@@ -181,6 +182,8 @@ 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
+ continue
184
187
  else:
185
188
  retry_handler = RetryHandler(
186
189
  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