conviso-ast 3.0.0__py3-none-any.whl
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_ast-3.0.0.data/scripts/flow_bash_completer.sh +21 -0
- conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish +1 -0
- conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh +32 -0
- conviso_ast-3.0.0.dist-info/METADATA +37 -0
- conviso_ast-3.0.0.dist-info/RECORD +128 -0
- conviso_ast-3.0.0.dist-info/WHEEL +5 -0
- conviso_ast-3.0.0.dist-info/entry_points.txt +3 -0
- conviso_ast-3.0.0.dist-info/top_level.txt +1 -0
- convisoappsec/__init__.py +0 -0
- convisoappsec/common/__init__.py +5 -0
- convisoappsec/common/box.py +251 -0
- convisoappsec/common/cleaner.py +78 -0
- convisoappsec/common/docker.py +399 -0
- convisoappsec/common/exceptions.py +8 -0
- convisoappsec/common/git_data_parser.py +76 -0
- convisoappsec/common/graphql/__init__.py +0 -0
- convisoappsec/common/graphql/error_handlers.py +75 -0
- convisoappsec/common/graphql/errors.py +16 -0
- convisoappsec/common/graphql/low_client.py +51 -0
- convisoappsec/common/retry_handler.py +40 -0
- convisoappsec/common/strings.py +8 -0
- convisoappsec/flow/__init__.py +3 -0
- convisoappsec/flow/api.py +104 -0
- convisoappsec/flow/cleaner.py +118 -0
- convisoappsec/flow/graphql_api/__init__.py +0 -0
- convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
- convisoappsec/flow/graphql_api/beta/client.py +18 -0
- convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
- convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
- convisoappsec/flow/graphql_api/beta/models/issues/container.py +72 -0
- convisoappsec/flow/graphql_api/beta/models/issues/iac.py +6 -0
- convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +13 -0
- convisoappsec/flow/graphql_api/beta/models/issues/sast.py +53 -0
- convisoappsec/flow/graphql_api/beta/models/issues/sca.py +78 -0
- convisoappsec/flow/graphql_api/beta/resources_api.py +142 -0
- convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
- convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +61 -0
- convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
- convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
- convisoappsec/flow/graphql_api/v1/client.py +46 -0
- convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
- convisoappsec/flow/graphql_api/v1/models/asset.py +14 -0
- convisoappsec/flow/graphql_api/v1/models/issues.py +16 -0
- convisoappsec/flow/graphql_api/v1/models/project.py +35 -0
- convisoappsec/flow/graphql_api/v1/resources_api.py +489 -0
- convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
- convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +212 -0
- convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +180 -0
- convisoappsec/flow/source_code_scanner/__init__.py +9 -0
- convisoappsec/flow/source_code_scanner/exceptions.py +2 -0
- convisoappsec/flow/source_code_scanner/scc.py +68 -0
- convisoappsec/flow/source_code_scanner/source_code_scanner.py +177 -0
- convisoappsec/flow/util/__init__.py +7 -0
- convisoappsec/flow/util/ci_provider.py +99 -0
- convisoappsec/flow/util/metrics.py +16 -0
- convisoappsec/flow/util/source_code_compressor.py +22 -0
- convisoappsec/flow/version_control_system_adapter.py +528 -0
- convisoappsec/flow/version_searchers/__init__.py +9 -0
- convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +85 -0
- convisoappsec/flow/version_searchers/timebased_version_seacher.py +39 -0
- convisoappsec/flow/version_searchers/version_searcher_result.py +33 -0
- convisoappsec/flow/versioning_style/__init__.py +0 -0
- convisoappsec/flow/versioning_style/semantic_versioning.py +44 -0
- convisoappsec/flowcli/__init__.py +3 -0
- convisoappsec/flowcli/__main__.py +4 -0
- convisoappsec/flowcli/assets/__init__.py +4 -0
- convisoappsec/flowcli/assets/create.py +88 -0
- convisoappsec/flowcli/assets/entrypoint.py +20 -0
- convisoappsec/flowcli/assets/ls.py +63 -0
- convisoappsec/flowcli/ast/__init__.py +3 -0
- convisoappsec/flowcli/ast/entrypoint.py +427 -0
- convisoappsec/flowcli/common.py +175 -0
- convisoappsec/flowcli/companies/__init__.py +0 -0
- convisoappsec/flowcli/companies/ls.py +25 -0
- convisoappsec/flowcli/container/__init__.py +3 -0
- convisoappsec/flowcli/container/entrypoint.py +17 -0
- convisoappsec/flowcli/container/run.py +306 -0
- convisoappsec/flowcli/context.py +49 -0
- convisoappsec/flowcli/deploy/__init__.py +0 -0
- convisoappsec/flowcli/deploy/create/__init__.py +4 -0
- convisoappsec/flowcli/deploy/create/context.py +12 -0
- convisoappsec/flowcli/deploy/create/entrypoint.py +31 -0
- convisoappsec/flowcli/deploy/create/with_/__init__.py +3 -0
- convisoappsec/flowcli/deploy/create/with_/entrypoint.py +20 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +4 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +11 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +30 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +4 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +21 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +84 -0
- convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +115 -0
- convisoappsec/flowcli/deploy/create/with_/values.py +133 -0
- convisoappsec/flowcli/entrypoint.py +103 -0
- convisoappsec/flowcli/environment_checker.py +45 -0
- convisoappsec/flowcli/findings/__init__.py +4 -0
- convisoappsec/flowcli/findings/create/__init__.py +4 -0
- convisoappsec/flowcli/findings/create/entrypoint.py +18 -0
- convisoappsec/flowcli/findings/create/with_/__init__.py +3 -0
- convisoappsec/flowcli/findings/create/with_/entrypoint.py +19 -0
- convisoappsec/flowcli/findings/create/with_/version_tracker.py +93 -0
- convisoappsec/flowcli/findings/entrypoint.py +19 -0
- convisoappsec/flowcli/findings/import_sarif/__init__.py +4 -0
- convisoappsec/flowcli/findings/import_sarif/entrypoint.py +430 -0
- convisoappsec/flowcli/help_option.py +18 -0
- convisoappsec/flowcli/iac/__init__.py +3 -0
- convisoappsec/flowcli/iac/entrypoint.py +17 -0
- convisoappsec/flowcli/iac/run.py +328 -0
- convisoappsec/flowcli/requirements_verifier.py +132 -0
- convisoappsec/flowcli/sast/__init__.py +3 -0
- convisoappsec/flowcli/sast/entrypoint.py +17 -0
- convisoappsec/flowcli/sast/run.py +485 -0
- convisoappsec/flowcli/sbom/__init__.py +3 -0
- convisoappsec/flowcli/sbom/entrypoint.py +17 -0
- convisoappsec/flowcli/sbom/generate.py +235 -0
- convisoappsec/flowcli/sca/__init__.py +3 -0
- convisoappsec/flowcli/sca/entrypoint.py +17 -0
- convisoappsec/flowcli/sca/run.py +479 -0
- convisoappsec/flowcli/vulnerability/__init__.py +3 -0
- convisoappsec/flowcli/vulnerability/assert_security_rules.py +201 -0
- convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +175 -0
- convisoappsec/flowcli/vulnerability/entrypoint.py +18 -0
- convisoappsec/flowcli/vulnerability/rules_schema.json +53 -0
- convisoappsec/flowcli/vulnerability/run.py +487 -0
- convisoappsec/logger.py +29 -0
- convisoappsec/sast/__init__.py +0 -0
- convisoappsec/sast/decision.py +45 -0
- convisoappsec/sast/sastbox.py +296 -0
- convisoappsec/version.py +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
_flow_completion() {
|
|
2
|
+
local IFS=$'
|
|
3
|
+
'
|
|
4
|
+
COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \
|
|
5
|
+
COMP_CWORD=$COMP_CWORD \
|
|
6
|
+
_FLOW_COMPLETE=complete $1 ) )
|
|
7
|
+
return 0
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
_flow_completionetup() {
|
|
11
|
+
local COMPLETION_OPTIONS=""
|
|
12
|
+
local BASH_VERSION_ARR=(${BASH_VERSION//./ })
|
|
13
|
+
# Only BASH version 4.4 and later have the nosort option.
|
|
14
|
+
if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] && [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then
|
|
15
|
+
COMPLETION_OPTIONS="-o nosort"
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
complete $COMPLETION_OPTIONS -F _flow_completion flow
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
_flow_completionetup;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
complete --no-files --command flow --arguments "(env _FLOW_COMPLETE=complete_fish COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t) flow)";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#compdef flow
|
|
2
|
+
|
|
3
|
+
_flow_completion() {
|
|
4
|
+
local -a completions
|
|
5
|
+
local -a completions_with_descriptions
|
|
6
|
+
local -a response
|
|
7
|
+
(( ! $+commands[flow] )) && return 1
|
|
8
|
+
|
|
9
|
+
response=("${(@f)$( env COMP_WORDS="${words[*]}" \
|
|
10
|
+
COMP_CWORD=$((CURRENT-1)) \
|
|
11
|
+
_FLOW_COMPLETE="complete_zsh" \
|
|
12
|
+
flow )}")
|
|
13
|
+
|
|
14
|
+
for key descr in ${(kv)response}; do
|
|
15
|
+
if [[ "$descr" == "_" ]]; then
|
|
16
|
+
completions+=("$key")
|
|
17
|
+
else
|
|
18
|
+
completions_with_descriptions+=("$key":"$descr")
|
|
19
|
+
fi
|
|
20
|
+
done
|
|
21
|
+
|
|
22
|
+
if [ -n "$completions_with_descriptions" ]; then
|
|
23
|
+
_describe -V unsorted completions_with_descriptions -U
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if [ -n "$completions" ]; then
|
|
27
|
+
compadd -U -V unsorted -a completions
|
|
28
|
+
fi
|
|
29
|
+
compstate[insert]="automenu"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
compdef _flow_completion flow;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: conviso-ast
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Maintainer: Conviso
|
|
5
|
+
Maintainer-email: development@convisoappsec.com
|
|
6
|
+
Project-URL: Source, https://github.com/convisoappsec/convisocli/
|
|
7
|
+
Requires-Python: >=3.9
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
Requires-Dist: GitPython==3.1.45
|
|
10
|
+
Requires-Dist: click==8.1.8
|
|
11
|
+
Requires-Dist: requests==2.32.5
|
|
12
|
+
Requires-Dist: urllib3==2.4.0
|
|
13
|
+
Requires-Dist: semantic-version==2.10.0
|
|
14
|
+
Requires-Dist: docker==7.1.0
|
|
15
|
+
Requires-Dist: PyYAML==6.0.3
|
|
16
|
+
Requires-Dist: click-log==0.4.0
|
|
17
|
+
Requires-Dist: transitions==0.9.2
|
|
18
|
+
Requires-Dist: jsonschema==4.25.1
|
|
19
|
+
Requires-Dist: giturlparse<=0.12.0
|
|
20
|
+
Requires-Dist: jmespath==1.0.1
|
|
21
|
+
Requires-Dist: setuptools==78.1.0
|
|
22
|
+
Dynamic: description
|
|
23
|
+
Dynamic: description-content-type
|
|
24
|
+
Dynamic: maintainer
|
|
25
|
+
Dynamic: maintainer-email
|
|
26
|
+
Dynamic: project-url
|
|
27
|
+
Dynamic: requires-dist
|
|
28
|
+
Dynamic: requires-python
|
|
29
|
+
|
|
30
|
+
# AST
|
|
31
|
+
|
|
32
|
+
This is a command line tool to execute Conviso AST.
|
|
33
|
+
|
|
34
|
+
# Documentation
|
|
35
|
+
Please visit the [official documentation] for further information.
|
|
36
|
+
|
|
37
|
+
[official documentation]: <https://docs.convisoappsec.com/security-scans/conviso-ast/>
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
conviso_ast-3.0.0.data/scripts/flow_bash_completer.sh,sha256=9q3HPuXq_FCUUV3IFGcOefsOLhPWatUkLY7txiBM7Uo,624
|
|
2
|
+
conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish,sha256=-wiuarawDJkms5N-rh99brIOzhy-ktsM1mi1ohQ3Mtg,147
|
|
3
|
+
conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh,sha256=cAtTDGUs5sY4NAA7AjscmLWj0dbNZ9iZhLP6BTz6dEQ,844
|
|
4
|
+
convisoappsec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
convisoappsec/logger.py,sha256=aTNebqOau9nEadBySMTXtnbGkOkJ_q2kyFlX1mzizeg,1132
|
|
6
|
+
convisoappsec/version.py,sha256=WZxVB-2_454JxgdmIIsxG-DUc65ia-VgtyjcgvV4mro,22
|
|
7
|
+
convisoappsec/common/__init__.py,sha256=QN7tV2C_jhTiWUrJHv2jbeq6ae3MssgLUWpQZwe8O2s,105
|
|
8
|
+
convisoappsec/common/box.py,sha256=WTtPF3YWxkcdblPmFTzrzQlPPPUwVsDt2zoi6xFMy1U,7561
|
|
9
|
+
convisoappsec/common/cleaner.py,sha256=Iy8BWCXj_v51oovcYzI_uhaJzLL-fCUyDxrbBglfwEs,2680
|
|
10
|
+
convisoappsec/common/docker.py,sha256=SYkZCgKS_kuREyJS_Zb4d61MWb58HoiFbxkSRzLJr0g,12529
|
|
11
|
+
convisoappsec/common/exceptions.py,sha256=Das7j6_nzB75-TY9xoVK12eswvxSntxI19nmXdjumzI,230
|
|
12
|
+
convisoappsec/common/git_data_parser.py,sha256=-Ou1YC8D4bpmHUcibxLiJf2rxKi8-SuTuto-6nB-ML8,2167
|
|
13
|
+
convisoappsec/common/retry_handler.py,sha256=MAwwD3QgxHZDJI87C8NPxYzxM4NBwGe3RflV7jRciAw,1495
|
|
14
|
+
convisoappsec/common/strings.py,sha256=JqBqW1redAfWTWtUFya2MvrW5T26Y07Vn0pbee-BpMo,185
|
|
15
|
+
convisoappsec/common/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
+
convisoappsec/common/graphql/error_handlers.py,sha256=1KUBa1zYiN_Gs2uwPsjl4LovoRFboWc16U7f680FfNE,2058
|
|
17
|
+
convisoappsec/common/graphql/errors.py,sha256=uWL4wkYG5Iqumu-m74HnW70QP0P9aBfBJKIfZFmgxgE,248
|
|
18
|
+
convisoappsec/common/graphql/low_client.py,sha256=RUKDx9N7li8BMj3zmRTWIm57a4-XoEHg2MkbvXyT7tg,1407
|
|
19
|
+
convisoappsec/flow/__init__.py,sha256=rjT1EIvy-xBfObIefOdxPfl1gQmYkHbFODYzI4VFXpQ,81
|
|
20
|
+
convisoappsec/flow/api.py,sha256=d9jOdr4jX8bD4BCMLT3jKCZO8W5mVpqRJGQIYS245hE,2493
|
|
21
|
+
convisoappsec/flow/cleaner.py,sha256=DRCrq_CkamYTZJTdbv_PYBCqgKz0N2ukFw2dued7nfQ,3679
|
|
22
|
+
convisoappsec/flow/version_control_system_adapter.py,sha256=glkG2pEIPSwBEFAZPHlqDuwk87ktiGUmSKaJrdWpYik,16056
|
|
23
|
+
convisoappsec/flow/graphql_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
convisoappsec/flow/graphql_api/beta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
convisoappsec/flow/graphql_api/beta/client.py,sha256=PPisDsUjFriDCT2EpHNPvw7bD_qYwGArFErsWbpBgIk,502
|
|
26
|
+
convisoappsec/flow/graphql_api/beta/resources_api.py,sha256=BKGVamCObXMxgK2ZVJLpUigwX7TNCBWyG9Mpti550wU,4339
|
|
27
|
+
convisoappsec/flow/graphql_api/beta/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
convisoappsec/flow/graphql_api/beta/models/issues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
+
convisoappsec/flow/graphql_api/beta/models/issues/container.py,sha256=-XJ5aA1ixd-QT-yNJwNdwxds_CkakEQDQxwbxFDiTj8,2392
|
|
30
|
+
convisoappsec/flow/graphql_api/beta/models/issues/iac.py,sha256=NKHnfzj3DGlc89_W1KMJ8NkmnfrS7vzlF__BHNjrnyA,228
|
|
31
|
+
convisoappsec/flow/graphql_api/beta/models/issues/normalize.py,sha256=apo20vmNJuRXNqXS3d9vRMthKGm9Z1RCqGPbdGZ6keE,421
|
|
32
|
+
convisoappsec/flow/graphql_api/beta/models/issues/sast.py,sha256=b8ZiXuTlMlx8iOlG-dPl4X6ndLeuci122-Ly68nxYEI,1820
|
|
33
|
+
convisoappsec/flow/graphql_api/beta/models/issues/sca.py,sha256=dGHp-hfb9BRfBVvnnAtloDaTVcvf4-ucbRBjt6LcqV0,2637
|
|
34
|
+
convisoappsec/flow/graphql_api/beta/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
+
convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py,sha256=zD9sJLO23bpMJn3NTY8C0_UAYEsnezKbldant_VQxoA,1119
|
|
36
|
+
convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
+
convisoappsec/flow/graphql_api/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
convisoappsec/flow/graphql_api/v1/client.py,sha256=bhtpYRWFiW8bvxScUwYKv7HamWAqNx_uckFDmrP42Po,1197
|
|
39
|
+
convisoappsec/flow/graphql_api/v1/resources_api.py,sha256=aW3B9rxcX6tnduiwLiuZrDkV1UQPCj9PU5dyfZCKzIE,14887
|
|
40
|
+
convisoappsec/flow/graphql_api/v1/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
|
+
convisoappsec/flow/graphql_api/v1/models/asset.py,sha256=rhHgQKXaRheksCSc8neMWQwd-cKB-noPpeO423nKFUQ,430
|
|
42
|
+
convisoappsec/flow/graphql_api/v1/models/issues.py,sha256=ZAM_aPwj20I7cApX1leCDVI8cX5LhcKAY1vkesNI_Ak,511
|
|
43
|
+
convisoappsec/flow/graphql_api/v1/models/project.py,sha256=CDZlufsT-_iQIOgpOPAtdmcv0JvHWFd6TjcDIAj6w7c,972
|
|
44
|
+
convisoappsec/flow/graphql_api/v1/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py,sha256=R9LgniQyj694h1MD7cn1-HJRDjI4PLiOrCmsqjp16ho,3251
|
|
46
|
+
convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py,sha256=2jAgzA-8te6HyyV8RVAx0BnLDeZhFulZynbxm5JR8Sc,2713
|
|
47
|
+
convisoappsec/flow/source_code_scanner/__init__.py,sha256=UvfLXNR1B8Fy6LuUwesQMXV0oMkLjVMhPs0SJ5nDR0k,227
|
|
48
|
+
convisoappsec/flow/source_code_scanner/exceptions.py,sha256=6ehUyZaFfMIRMzKdh0MND8gfyTNyHY_wsprmxkxSJD0,57
|
|
49
|
+
convisoappsec/flow/source_code_scanner/scc.py,sha256=O_kdWsw2x0czuKcLORD3gP5wbXsizj4Bb2Sbsk5n_Sw,1645
|
|
50
|
+
convisoappsec/flow/source_code_scanner/source_code_scanner.py,sha256=L9LVZnUO-o_JvT8dHUxBXcbxQlxSqRP8CVUBgTUEV7s,4726
|
|
51
|
+
convisoappsec/flow/util/__init__.py,sha256=rpu69qnn68rqrK3rhPcgrVYWCIW9WVSrQ5FyCeHxng4,160
|
|
52
|
+
convisoappsec/flow/util/ci_provider.py,sha256=VYDESwNFbtrRcWDtTEb8tYDN5qbnLksmQI_ntsciJ4I,2093
|
|
53
|
+
convisoappsec/flow/util/metrics.py,sha256=4qGBMMR02OZN4ezFiB9iqtCuUYO8bXYqeUNDFRDpQaw,480
|
|
54
|
+
convisoappsec/flow/util/source_code_compressor.py,sha256=b2iA8Exf8wVbxR1mnvwTbruDjdpYyVloUmSlyYLSJQU,508
|
|
55
|
+
convisoappsec/flow/version_searchers/__init__.py,sha256=rJkVGlmWiiDHegvQl7d900RvnglzICXpTxuUiLlHSz0,294
|
|
56
|
+
convisoappsec/flow/version_searchers/sorted_by_versioning_style.py,sha256=xLjaHy-WDOgY5jrASnaK-uM0UL-9sL3BALwzmM5PgSA,2657
|
|
57
|
+
convisoappsec/flow/version_searchers/timebased_version_seacher.py,sha256=fO3o93n4cgKJKYMtCtd76Yc80jFPal4EYf0ubhZGaoI,1266
|
|
58
|
+
convisoappsec/flow/version_searchers/version_searcher_result.py,sha256=RxROFRuQ0GXE9MhW6oKg2sPzZHkwhuaffkTUH6xDWZw,943
|
|
59
|
+
convisoappsec/flow/versioning_style/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
|
+
convisoappsec/flow/versioning_style/semantic_versioning.py,sha256=a47GNtPQbZ5MEjFypwyc7JVxSlbSY1xci-1woo54Ss0,1041
|
|
61
|
+
convisoappsec/flowcli/__init__.py,sha256=cNqNWO7nd1wyFCvYUQPWhRxZnwwwMnHbcppXqWt0SJA,64
|
|
62
|
+
convisoappsec/flowcli/__main__.py,sha256=9Bop0ORSNHNOe4uMhTq6UFvVfhQufGy3Mdim1qblIqk,99
|
|
63
|
+
convisoappsec/flowcli/common.py,sha256=wmasRcE9J8pBCyRmpdNRdynHOlM6OsWdKhpRhMU8OmA,4881
|
|
64
|
+
convisoappsec/flowcli/context.py,sha256=67I1u11HIIW6BKs_hALLETWVe25ZgBhq1sqAOHXq_e4,1309
|
|
65
|
+
convisoappsec/flowcli/entrypoint.py,sha256=V8zAF_tMFzz9FbEaqkHF_KK7xPMY8XXVq9zSG93sNVM,2754
|
|
66
|
+
convisoappsec/flowcli/environment_checker.py,sha256=NEWIiTVlbBIRwQ9AyAwM2okTjQ1MRvZoZ_OSMtIewGk,1714
|
|
67
|
+
convisoappsec/flowcli/help_option.py,sha256=JW9qp_S7UMFQR2MVJP5x82zBKlo7DhGiw403ukGwfAY,331
|
|
68
|
+
convisoappsec/flowcli/requirements_verifier.py,sha256=CCRizESeRNAn013SgdNRStv-AEVfZrZMdWo0YQN5T4w,5206
|
|
69
|
+
convisoappsec/flowcli/assets/__init__.py,sha256=9ry90G81ARDlvMJVtA1GwTHxjDfmI8g15etShDuZgZA,54
|
|
70
|
+
convisoappsec/flowcli/assets/create.py,sha256=JDmxDH1WbyaQYLTxoi6dS_WosRm7kjvpJVDEJ3Cp8fw,2278
|
|
71
|
+
convisoappsec/flowcli/assets/entrypoint.py,sha256=CEoev3d1ogclPNP3l31PBhGkoiZZ400kxsnnF02uxFk,310
|
|
72
|
+
convisoappsec/flowcli/assets/ls.py,sha256=IYfKIca218BvZ5ecrtDgZ_T8xVg0XO3Eq1kK16BMBsc,1484
|
|
73
|
+
convisoappsec/flowcli/ast/__init__.py,sha256=9SO9inH22PPm4jLlljVTJEeJKZujFKfwqTBbBo-TwFM,47
|
|
74
|
+
convisoappsec/flowcli/ast/entrypoint.py,sha256=pwkXn9R1FNuUlTGrwUIMCacpklYSFR9BFDB59a_ivcU,15946
|
|
75
|
+
convisoappsec/flowcli/companies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
+
convisoappsec/flowcli/companies/ls.py,sha256=0287VTXOkKnuXTaJh392crYjx0qank0pBvmESq3P_Bw,892
|
|
77
|
+
convisoappsec/flowcli/container/__init__.py,sha256=Z666kQa4qVfbcuyLaW_hvORdAPtZ9dTQFcQb2H2Nkfg,59
|
|
78
|
+
convisoappsec/flowcli/container/entrypoint.py,sha256=G5db82E0MrQSF7lk_7O7IodCmFtuKizXvCdMPfTc-Jc,268
|
|
79
|
+
convisoappsec/flowcli/container/run.py,sha256=XRjxQvetw-Kdyg9rRSg8rh_vw_E9zJPjoVhYJrtpcS8,9894
|
|
80
|
+
convisoappsec/flowcli/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
|
+
convisoappsec/flowcli/deploy/create/__init__.py,sha256=l7eIySVkTKr3auZ8Fwe7G6AG6-pM06vnl3aZcEclVP4,54
|
|
82
|
+
convisoappsec/flowcli/deploy/create/context.py,sha256=iazxDAx4SEGHJP9Psd16wUL9KlgKqlGdsBU8dU_jW48,190
|
|
83
|
+
convisoappsec/flowcli/deploy/create/entrypoint.py,sha256=NAc6wnFKYpPSvLrE0v89zTDAlV3XJ9nEn4EMvrV-tFo,677
|
|
84
|
+
convisoappsec/flowcli/deploy/create/with_/__init__.py,sha256=dfk3jJnixGV1_-YLopkoLFHIK0nWCMC9YxrcLYCbCRo,51
|
|
85
|
+
convisoappsec/flowcli/deploy/create/with_/entrypoint.py,sha256=h0EVvgNzW_e3iuxH_kVd30jOWXrY7B0uzzrfzRVvO_A,346
|
|
86
|
+
convisoappsec/flowcli/deploy/create/with_/values.py,sha256=rJ4l35xfkd5x2pGMRpHMLd3UArFC-gvJddVqHERiQ7w,4661
|
|
87
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py,sha256=fu1DRXmTRncvmgNBFgKF3psy-dYmVXsTD6vFJXDsvbo,64
|
|
88
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py,sha256=IZjsKSzetrjVyFKhO6NBrfCypf8MO-AFYNfRxkYJZww,194
|
|
89
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py,sha256=MUrx_fqAFQeJ2oUaAxRDPfk_qlgyNHKFMNZqmiDFWrU,675
|
|
90
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py,sha256=c1sggCq3RGdgyq0tqdxx_yGW1iOeBti2aoNsoiMxKnc,56
|
|
91
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py,sha256=J5dSGo0P__fKlPpeaVcAmyFnnAtZPi0E2y4Hv_U-ZQM,382
|
|
92
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py,sha256=Ipkz0bVXfJlbYHfPFICY3VUZYwlL2gxuHUqVVtvSyzQ,2721
|
|
93
|
+
convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py,sha256=-FJF4BOLzzpcJqYHlYJovRuvoUut7gLoxDWKnT6CzH0,3416
|
|
94
|
+
convisoappsec/flowcli/findings/__init__.py,sha256=0wiNMaThYuum1QA9s9-LGtcmWFxUY-mWiYMtTSuaDqY,58
|
|
95
|
+
convisoappsec/flowcli/findings/entrypoint.py,sha256=foc6wgD2BsoFZkJQiIuis260Zt-3DkTLsxej7cHv9Ko,344
|
|
96
|
+
convisoappsec/flowcli/findings/create/__init__.py,sha256=l7eIySVkTKr3auZ8Fwe7G6AG6-pM06vnl3aZcEclVP4,54
|
|
97
|
+
convisoappsec/flowcli/findings/create/entrypoint.py,sha256=EK2xThAzhMDV4aOxzUgEbT-adOkmFsX5R96CEKCuUmU,269
|
|
98
|
+
convisoappsec/flowcli/findings/create/with_/__init__.py,sha256=dfk3jJnixGV1_-YLopkoLFHIK0nWCMC9YxrcLYCbCRo,51
|
|
99
|
+
convisoappsec/flowcli/findings/create/with_/entrypoint.py,sha256=Bvbh0YIixAPD5ullp7bkpY9oub0YTEBu3hkUfKTJVtU,309
|
|
100
|
+
convisoappsec/flowcli/findings/create/with_/version_tracker.py,sha256=NrnYx6OMQWXRMYDU5ND0c0O4zUER2U3wrNzWsD5TisE,2637
|
|
101
|
+
convisoappsec/flowcli/findings/import_sarif/__init__.py,sha256=3iR7f9V9NdoIQTrD25EVu6OAYPPJ4RZEaM4P34BS0js,66
|
|
102
|
+
convisoappsec/flowcli/findings/import_sarif/entrypoint.py,sha256=MIHi9ZWU2Jn2o7o5mDLp81xfb14gsa33aGnqh1YR7n8,13740
|
|
103
|
+
convisoappsec/flowcli/iac/__init__.py,sha256=a3IZzSKpm987fMEliTECDeXO_Eduk7eg-aQzmaWvUXQ,47
|
|
104
|
+
convisoappsec/flowcli/iac/entrypoint.py,sha256=vGsHdIss3KEWartTZkKl7k5w1qxhYIVqHGOJdklc3b8,241
|
|
105
|
+
convisoappsec/flowcli/iac/run.py,sha256=q-bndWtZb9xYE9U_4aMHcZ3WtgHyXQBqUkjHTk-hdwI,11071
|
|
106
|
+
convisoappsec/flowcli/sast/__init__.py,sha256=S4O78eZGhgpT2lZY3GSUIUTQJB5a62uAVirEqbf4EQY,49
|
|
107
|
+
convisoappsec/flowcli/sast/entrypoint.py,sha256=7bvQ6mVLWvykGfjD-o0xbu7ybm8Hj2DTqvCv5CstIas,245
|
|
108
|
+
convisoappsec/flowcli/sast/run.py,sha256=7uX6K1VLASU8RnoCKNYIIqXSsNkF4JQ8OKhAG2CKjuI,16353
|
|
109
|
+
convisoappsec/flowcli/sbom/__init__.py,sha256=qzwiPWniK41Y41XvJJhxtRZguHrSSenb57lhy64KnSc,49
|
|
110
|
+
convisoappsec/flowcli/sbom/entrypoint.py,sha256=ax2WL5BtCu24NeZYe6zzCVZ2ujlviXkvtY7PZihlz3s,263
|
|
111
|
+
convisoappsec/flowcli/sbom/generate.py,sha256=Oke4JX4vARqpsMlGC2cPye_LMapIMRDyZv2W14hoD8g,7170
|
|
112
|
+
convisoappsec/flowcli/sca/__init__.py,sha256=xnVoxwbpe4LrEemmWJ6svr3zdpo9S4kEIvM4HVRsLX8,47
|
|
113
|
+
convisoappsec/flowcli/sca/entrypoint.py,sha256=LpFoiZ3iljhAyKzfMJ7pdBdHIUhnjh3ZguPgvWJZ-XA,241
|
|
114
|
+
convisoappsec/flowcli/sca/run.py,sha256=FWnTHgMgnIRvJSpMIkFcb6YMtvWEjEpKJyXEkjAZpA4,16725
|
|
115
|
+
convisoappsec/flowcli/vulnerability/__init__.py,sha256=c18E0J1KfZBBqpv8XGxF5dv7dxCDquFkjGkdnvFDSYI,67
|
|
116
|
+
convisoappsec/flowcli/vulnerability/assert_security_rules.py,sha256=j7VcondMeZSRxWz118aWS9qUSGdvsq4Mg-_9UXp8Dyw,6075
|
|
117
|
+
convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py,sha256=EkJhbUm1DTP14mIg_ZC4SKFSlvTtfPpSpNAMWPkwrsc,6897
|
|
118
|
+
convisoappsec/flowcli/vulnerability/entrypoint.py,sha256=WsQkEJSbb9CwPm_deUtata9omEYYcaZnssYKTAybtjA,386
|
|
119
|
+
convisoappsec/flowcli/vulnerability/rules_schema.json,sha256=OBkj9RMXltGoJYsyPqOsrJDfcyrQDlQHk9b5i9rMhoc,948
|
|
120
|
+
convisoappsec/flowcli/vulnerability/run.py,sha256=6flmvr55cKxj-duX3w4PAFwJgC5AJ0NYJ9Zk3FZHFII,17144
|
|
121
|
+
convisoappsec/sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
122
|
+
convisoappsec/sast/decision.py,sha256=d7dcNr9yZMzyccpFS_peAmDo0ZtfsE1qXDdYrvCux2U,1025
|
|
123
|
+
convisoappsec/sast/sastbox.py,sha256=hXZLiYh_F3f6yd1ydPYVOMKg-tNOQOZiBvKmWyedagI,11031
|
|
124
|
+
conviso_ast-3.0.0.dist-info/METADATA,sha256=ibjt1tIB2ghrzamhcBOiYfZSUOeEH2wEZg-sOySlk2A,1075
|
|
125
|
+
conviso_ast-3.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
126
|
+
conviso_ast-3.0.0.dist-info/entry_points.txt,sha256=0IvamweR_V0uG4O5Fo9NpVHTHfpZRwUE9kn7KEVZ668,109
|
|
127
|
+
conviso_ast-3.0.0.dist-info/top_level.txt,sha256=ju5r0RSCF1HA7m9JOG10jrQS4SnqQEJzl6-YMCxbSl4,14
|
|
128
|
+
conviso_ast-3.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
convisoappsec
|
|
File without changes
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import docker
|
|
2
|
+
import tarfile
|
|
3
|
+
import tempfile
|
|
4
|
+
import time
|
|
5
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
6
|
+
|
|
7
|
+
from transitions import Machine
|
|
8
|
+
from transitions.extensions.states import Timeout, add_state_features
|
|
9
|
+
|
|
10
|
+
from convisoappsec.common.docker import SCSCommon
|
|
11
|
+
from convisoappsec.logger import LOGGER
|
|
12
|
+
|
|
13
|
+
RAW_STATE_MSG = 'Scanner {} entered on {} state'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SARIFParsingError(BaseException):
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PropertyRequiredError(SARIFParsingError):
|
|
21
|
+
def __init__(self, stderr_log=''):
|
|
22
|
+
pretty_error = self.__parse_pretty_property_error(stderr_log)
|
|
23
|
+
print('Error:', pretty_error)
|
|
24
|
+
|
|
25
|
+
def __parse_pretty_property_error(self, stderr_logs):
|
|
26
|
+
expected_error_line = ''
|
|
27
|
+
|
|
28
|
+
for log_line in stderr_logs.split('\n'):
|
|
29
|
+
expected_error_text = 'PropertyRequiredError'
|
|
30
|
+
if expected_error_text in log_line:
|
|
31
|
+
expected_error_line = log_line
|
|
32
|
+
break
|
|
33
|
+
|
|
34
|
+
error = self.__extract_text_after_colon(expected_error_line)
|
|
35
|
+
|
|
36
|
+
return error.strip()
|
|
37
|
+
|
|
38
|
+
def __extract_text_after_colon(self, text):
|
|
39
|
+
try:
|
|
40
|
+
return text.split(':', 3)[-1]
|
|
41
|
+
except IndexError:
|
|
42
|
+
return ''
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@add_state_features(Timeout)
|
|
46
|
+
class ScannerMachine(Machine):
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ScannerEntity:
|
|
51
|
+
|
|
52
|
+
def __init__(self, token, scanner, logger=None, timeout=7200):
|
|
53
|
+
self.logger = logger or LOGGER
|
|
54
|
+
self.token = token
|
|
55
|
+
|
|
56
|
+
self.scanner = self.__setup_scanner(scanner)
|
|
57
|
+
self.name = self.scanner.name
|
|
58
|
+
self.results = None
|
|
59
|
+
|
|
60
|
+
self.states = [
|
|
61
|
+
'waiting',
|
|
62
|
+
{'name': 'pulling', 'timeout': timeout, 'on_timeout': self._on_timeout},
|
|
63
|
+
{'name': 'running', 'timeout': timeout, 'on_timeout': self._on_timeout},
|
|
64
|
+
{'name': 'sending', 'timeout': timeout, 'on_timeout': self._on_timeout},
|
|
65
|
+
'done'
|
|
66
|
+
]
|
|
67
|
+
self.machine = ScannerMachine(
|
|
68
|
+
model=self,
|
|
69
|
+
states=self.states,
|
|
70
|
+
initial='waiting'
|
|
71
|
+
)
|
|
72
|
+
self.machine.add_ordered_transitions()
|
|
73
|
+
self._set_callbacks()
|
|
74
|
+
self.to_waiting()
|
|
75
|
+
|
|
76
|
+
def __setup_scanner(self, scanner):
|
|
77
|
+
if isinstance(scanner, SCSCommon):
|
|
78
|
+
return scanner
|
|
79
|
+
else:
|
|
80
|
+
return self._instanciate_scanner(scanner)
|
|
81
|
+
|
|
82
|
+
def _set_callbacks(self):
|
|
83
|
+
self.machine.on_enter_waiting('_on_waiting')
|
|
84
|
+
self.machine.on_enter_pulling('_on_pulling')
|
|
85
|
+
self.machine.on_enter_running('_on_running')
|
|
86
|
+
self.machine.on_enter_sending('_on_sending')
|
|
87
|
+
self.machine.on_enter_done('_on_done')
|
|
88
|
+
|
|
89
|
+
def _instanciate_scanner(self, data):
|
|
90
|
+
return SCSCommon(
|
|
91
|
+
**data,
|
|
92
|
+
token=self.token,
|
|
93
|
+
logger=self.logger,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def _on_timeout(self):
|
|
97
|
+
self.logger.debug('Scanner {} timeout on state {}'.format(
|
|
98
|
+
self.name, self.state
|
|
99
|
+
))
|
|
100
|
+
|
|
101
|
+
def _on_waiting(self):
|
|
102
|
+
self.logger.debug(RAW_STATE_MSG.format(
|
|
103
|
+
self.name, self.state
|
|
104
|
+
))
|
|
105
|
+
|
|
106
|
+
def _on_pulling(self):
|
|
107
|
+
self.logger.debug(RAW_STATE_MSG.format(
|
|
108
|
+
self.name, self.state
|
|
109
|
+
))
|
|
110
|
+
image = self.scanner.pull()
|
|
111
|
+
if image:
|
|
112
|
+
self.logger.debug('Image: {}'.format(image))
|
|
113
|
+
self.next_state()
|
|
114
|
+
else:
|
|
115
|
+
raise RuntimeError("Image not found.")
|
|
116
|
+
|
|
117
|
+
def _on_running(self):
|
|
118
|
+
self.scanner.run()
|
|
119
|
+
self.end_time = time.time()
|
|
120
|
+
self.logger.debug('Total execution time for {} was {:2f}'.format(
|
|
121
|
+
self.scanner.repository_name,
|
|
122
|
+
self.end_time - self.start_time
|
|
123
|
+
))
|
|
124
|
+
self.next_state()
|
|
125
|
+
|
|
126
|
+
def _on_sending(self):
|
|
127
|
+
self.logger.debug(RAW_STATE_MSG.format(
|
|
128
|
+
self.name, self.state
|
|
129
|
+
))
|
|
130
|
+
self.results = self.scanner.get_container_reports()
|
|
131
|
+
self.next_state()
|
|
132
|
+
|
|
133
|
+
def _on_done(self):
|
|
134
|
+
self.logger.debug(RAW_STATE_MSG.format(
|
|
135
|
+
self.scanner.repository_name, self.state
|
|
136
|
+
))
|
|
137
|
+
self.scanner.container.remove(v=True, force=True)
|
|
138
|
+
|
|
139
|
+
def start(self):
|
|
140
|
+
self.start_time = time.time()
|
|
141
|
+
self.to_pulling()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class ContainerWrapper:
|
|
145
|
+
|
|
146
|
+
def __init__(self, token, containers_map, logger, timeout, max_workers=5):
|
|
147
|
+
self.token = token
|
|
148
|
+
self.logger = logger or LOGGER
|
|
149
|
+
self.max_workers = max_workers
|
|
150
|
+
self.scanners = [
|
|
151
|
+
ScannerEntity(
|
|
152
|
+
token=token,
|
|
153
|
+
scanner=scanner,
|
|
154
|
+
logger=logger,
|
|
155
|
+
timeout=timeout
|
|
156
|
+
)
|
|
157
|
+
for scanner in containers_map.values()
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
def run(self):
|
|
161
|
+
self.logger.debug("Starting Execution")
|
|
162
|
+
with ThreadPoolExecutor(max_workers=self.max_workers) as exeggutor:
|
|
163
|
+
for scanner in self.scanners:
|
|
164
|
+
exeggutor.submit(scanner.start)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def convert_sarif_to_sastbox1(report_filepath, repository_dir, container_registry_token, scanner_timeout=7200):
|
|
168
|
+
"""
|
|
169
|
+
Args:
|
|
170
|
+
report_filepath (str): filepath to the report to be converted
|
|
171
|
+
repository_dir (str): filepath to the repository being tested
|
|
172
|
+
token (str): Conviso container registry token
|
|
173
|
+
scanner_timeout (int): container timeout
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
string: filepath to the converted report
|
|
177
|
+
"""
|
|
178
|
+
CONTAINER_IMAGE_NAME = 'sastbox-converter-tool'
|
|
179
|
+
CONTAINER_IMAGE_TAG = 'cc50dee'
|
|
180
|
+
|
|
181
|
+
CONTAINER_INPUT_FILEPATH = '/code{}'.format(
|
|
182
|
+
report_filepath.replace(repository_dir, '')
|
|
183
|
+
)
|
|
184
|
+
CONTAINER_OUTPUT_FILENAME = CONTAINER_INPUT_FILEPATH.replace(
|
|
185
|
+
'sarif', 'json'
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
CONTAINERS_MAP = {
|
|
189
|
+
CONTAINER_IMAGE_NAME: {
|
|
190
|
+
'repository_dir': repository_dir,
|
|
191
|
+
'repository_name': CONTAINER_IMAGE_NAME,
|
|
192
|
+
'tag': CONTAINER_IMAGE_TAG,
|
|
193
|
+
'command': [
|
|
194
|
+
'--format', 'sastbox1',
|
|
195
|
+
'--input', CONTAINER_INPUT_FILEPATH,
|
|
196
|
+
'--output', CONTAINER_OUTPUT_FILENAME
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
}
|
|
200
|
+
converter_wrapped = ContainerWrapper(
|
|
201
|
+
token=container_registry_token,
|
|
202
|
+
containers_map=CONTAINERS_MAP,
|
|
203
|
+
logger=None,
|
|
204
|
+
timeout=scanner_timeout
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
converter_wrapped.logger.setLevel('WARN')
|
|
208
|
+
converter_wrapped.run()
|
|
209
|
+
converter_wrapped.logger.setLevel('INFO')
|
|
210
|
+
|
|
211
|
+
scanner = converter_wrapped.scanners[0].scanner
|
|
212
|
+
last_scan_name = scanner.name
|
|
213
|
+
last_container = scanner.docker.containers.get(
|
|
214
|
+
last_scan_name
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
try:
|
|
218
|
+
chunks, _ = last_container.get_archive(CONTAINER_OUTPUT_FILENAME)
|
|
219
|
+
output_filepath = __extract_tarball_chunks(
|
|
220
|
+
chunks, report_filepath.replace('sarif', 'json')
|
|
221
|
+
)
|
|
222
|
+
except docker.errors.APIError as error:
|
|
223
|
+
stderr_log = last_container.logs(stderr=True).decode('utf-8')
|
|
224
|
+
raise PropertyRequiredError(stderr_log)
|
|
225
|
+
|
|
226
|
+
return output_filepath
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def __extract_tarball_chunks(tarball_chunks, report_absolute_filepath):
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
tarball_chunks (int): The number of bytes returned by each iteration of the generator
|
|
234
|
+
report_filename (string): The name of the extracted report
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
string: Report absolute filepath in local filesystem
|
|
238
|
+
"""
|
|
239
|
+
output_dirpath = report_absolute_filepath[
|
|
240
|
+
:report_absolute_filepath.rfind('/')
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
with tempfile.TemporaryFile() as tmp_wrapper_file:
|
|
244
|
+
for chunk in tarball_chunks:
|
|
245
|
+
tmp_wrapper_file.write(chunk)
|
|
246
|
+
tmp_wrapper_file.seek(0)
|
|
247
|
+
|
|
248
|
+
with tarfile.open(mode="r|", fileobj=tmp_wrapper_file) as talball_file:
|
|
249
|
+
talball_file.extractall(path=output_dirpath)
|
|
250
|
+
|
|
251
|
+
return report_absolute_filepath
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import tempfile
|
|
4
|
+
import docker
|
|
5
|
+
|
|
6
|
+
class Cleaner:
|
|
7
|
+
"""Responsible for cleaning temporary files, Docker containers, images, and volumes."""
|
|
8
|
+
|
|
9
|
+
def __init__(self):
|
|
10
|
+
try:
|
|
11
|
+
self.client = docker.from_env()
|
|
12
|
+
except Exception as e:
|
|
13
|
+
print(f"Error initializing Docker client: {e}")
|
|
14
|
+
self.client = None
|
|
15
|
+
|
|
16
|
+
def cleanup(self):
|
|
17
|
+
""" Responsable to clean dirs, docker images and containers after all executions,
|
|
18
|
+
removes all stopped containers, unused networks, dangling images, and build cache.
|
|
19
|
+
"""
|
|
20
|
+
try:
|
|
21
|
+
client = docker.from_env()
|
|
22
|
+
self.perform_cleanup()
|
|
23
|
+
|
|
24
|
+
for container in client.containers.list(all=True):
|
|
25
|
+
try:
|
|
26
|
+
container.remove()
|
|
27
|
+
except Exception:
|
|
28
|
+
continue
|
|
29
|
+
|
|
30
|
+
for image in client.images.list():
|
|
31
|
+
if image.tags and any(tag.startswith("public.ecr.aws/convisoappsec/") for tag in image.tags):
|
|
32
|
+
try:
|
|
33
|
+
client.images.remove(image.id)
|
|
34
|
+
except Exception as e:
|
|
35
|
+
print(f"Error removing image {image.tags}: {e}")
|
|
36
|
+
continue
|
|
37
|
+
|
|
38
|
+
volumes = client.volumes.list()
|
|
39
|
+
for volume in volumes:
|
|
40
|
+
try:
|
|
41
|
+
volume.remove()
|
|
42
|
+
except Exception:
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
print(f"An unexpected error occurred: {e}")
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
def perform_cleanup(self):
|
|
50
|
+
"""Method to clean the tmp directory and remove 'conviso-output-' directories in the current directory."""
|
|
51
|
+
|
|
52
|
+
tmp_dir = tempfile.gettempdir()
|
|
53
|
+
|
|
54
|
+
# Clear system temp directory
|
|
55
|
+
try:
|
|
56
|
+
for filename in os.listdir(tmp_dir):
|
|
57
|
+
file_path = os.path.join(tmp_dir, filename)
|
|
58
|
+
try:
|
|
59
|
+
if os.path.isfile(file_path) or os.path.islink(file_path):
|
|
60
|
+
os.remove(file_path)
|
|
61
|
+
elif os.path.isdir(file_path):
|
|
62
|
+
shutil.rmtree(file_path)
|
|
63
|
+
except Exception:
|
|
64
|
+
pass
|
|
65
|
+
except Exception:
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
# Clear 'conviso-output-' directories in the current directory
|
|
69
|
+
try:
|
|
70
|
+
for filename in os.listdir("."):
|
|
71
|
+
dir_path = os.path.join(".", filename)
|
|
72
|
+
if os.path.isdir(dir_path) and filename.startswith("conviso-output-"):
|
|
73
|
+
try:
|
|
74
|
+
shutil.rmtree(dir_path)
|
|
75
|
+
except Exception:
|
|
76
|
+
pass
|
|
77
|
+
except Exception:
|
|
78
|
+
pass
|