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.
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/PKG-INFO +2 -2
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/PKG-INFO +2 -2
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/SOURCES.txt +1 -0
- conviso-cli-2.3.0rc0/conviso_cli.egg-info/requires.txt +13 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/git_data_parser.py +1 -4
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/resources_api.py +83 -71
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +24 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/ast/entrypoint.py +4 -4
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/run.py +2 -2
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/entrypoint.py +0 -10
- conviso-cli-2.3.0rc0/convisoappsec/flowcli/environment_checker.py +45 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/run.py +1 -3
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/requirements_verifier.py +2 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/run.py +18 -101
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/generate.py +4 -9
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/run.py +3 -20
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/run.py +4 -10
- conviso-cli-2.3.0rc0/convisoappsec/version.py +1 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/setup.py +13 -13
- conviso-cli-2.3.0.dev3/conviso_cli.egg-info/requires.txt +0 -13
- conviso-cli-2.3.0.dev3/convisoappsec/version.py +0 -1
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/README.md +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/dependency_links.txt +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/entry_points.txt +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/conviso_cli.egg-info/top_level.txt +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/box.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/docker.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/exceptions.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/error_handlers.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/errors.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/graphql/low_client.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/retry_handler.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/common/strings.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/api.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/client.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/exceptions.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/scc.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/source_code_scanner/source_code_scanner.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/ci_provider.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/metrics.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/util/source_code_compressor.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_control_system_adapter.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/versioning_style/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/__main__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/create.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/assets/ls.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/ast/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/common.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/companies/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/companies/ls.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/container/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/context.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/context.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -0
- {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
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/ls.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/deploy/show.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/help_option.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/iac/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/projects/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/projects/ls.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sast/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/sca/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/logger.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/__init__.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/decision.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/sast/sastbox.py +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_bash_completer.sh +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_fish_completer.fish +0 -0
- {conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
{conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flow/graphql_api/v1/resources_api.py
RENAMED
|
@@ -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
|
|
324
|
-
"""
|
|
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
|
|
330
|
-
"""
|
|
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":
|
|
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
|
|
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,
|
|
406
|
+
'0': (file_path, file, 'application/octet-stream')
|
|
352
407
|
}
|
|
353
408
|
|
|
354
409
|
headers = {
|
|
355
|
-
'x-api-key':
|
|
356
|
-
"User-Agent": "AST:{
|
|
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
|
-
|
|
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
|
-
|
|
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',
|
|
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
|
|
{conviso-cli-2.3.0.dev3 → conviso-cli-2.3.0rc0}/convisoappsec/flowcli/requirements_verifier.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
252
|
-
|
|
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
|
-
|
|
398
|
-
|
|
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
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
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
|
]
|