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