conviso-cli 1.14.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.
Files changed (123) hide show
  1. conviso-cli-1.14.0rc0/PKG-INFO +20 -0
  2. conviso-cli-1.14.0rc0/README.md +8 -0
  3. conviso-cli-1.14.0rc0/conviso_cli.egg-info/PKG-INFO +20 -0
  4. conviso-cli-1.14.0rc0/conviso_cli.egg-info/SOURCES.txt +121 -0
  5. conviso-cli-1.14.0rc0/conviso_cli.egg-info/dependency_links.txt +1 -0
  6. conviso-cli-1.14.0rc0/conviso_cli.egg-info/entry_points.txt +4 -0
  7. conviso-cli-1.14.0rc0/conviso_cli.egg-info/requires.txt +12 -0
  8. conviso-cli-1.14.0rc0/conviso_cli.egg-info/top_level.txt +1 -0
  9. conviso-cli-1.14.0rc0/convisoappsec/__init__.py +0 -0
  10. conviso-cli-1.14.0rc0/convisoappsec/common/__init__.py +5 -0
  11. conviso-cli-1.14.0rc0/convisoappsec/common/box.py +261 -0
  12. conviso-cli-1.14.0rc0/convisoappsec/common/docker.py +399 -0
  13. conviso-cli-1.14.0rc0/convisoappsec/common/exceptions.py +8 -0
  14. conviso-cli-1.14.0rc0/convisoappsec/common/git_data_parser.py +73 -0
  15. conviso-cli-1.14.0rc0/convisoappsec/common/graphql/__init__.py +0 -0
  16. conviso-cli-1.14.0rc0/convisoappsec/common/graphql/error_handlers.py +75 -0
  17. conviso-cli-1.14.0rc0/convisoappsec/common/graphql/errors.py +16 -0
  18. conviso-cli-1.14.0rc0/convisoappsec/common/graphql/low_client.py +49 -0
  19. conviso-cli-1.14.0rc0/convisoappsec/common/strings.py +8 -0
  20. conviso-cli-1.14.0rc0/convisoappsec/flow/__init__.py +3 -0
  21. conviso-cli-1.14.0rc0/convisoappsec/flow/api.py +410 -0
  22. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/__init__.py +0 -0
  23. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  24. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/client.py +18 -0
  25. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  26. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  27. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +7 -0
  28. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +13 -0
  29. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +48 -0
  30. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +50 -0
  31. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/resources_api.py +71 -0
  32. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  33. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +20 -0
  34. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  35. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  36. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/client.py +29 -0
  37. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  38. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/models/asset.py +12 -0
  39. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/models/project.py +30 -0
  40. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/resources_api.py +213 -0
  41. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  42. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +71 -0
  43. conviso-cli-1.14.0rc0/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +118 -0
  44. conviso-cli-1.14.0rc0/convisoappsec/flow/source_code_scanner/__init__.py +9 -0
  45. conviso-cli-1.14.0rc0/convisoappsec/flow/source_code_scanner/exceptions.py +2 -0
  46. conviso-cli-1.14.0rc0/convisoappsec/flow/source_code_scanner/scc.py +68 -0
  47. conviso-cli-1.14.0rc0/convisoappsec/flow/source_code_scanner/source_code_scanner.py +177 -0
  48. conviso-cli-1.14.0rc0/convisoappsec/flow/util/__init__.py +7 -0
  49. conviso-cli-1.14.0rc0/convisoappsec/flow/util/ci_provider.py +99 -0
  50. conviso-cli-1.14.0rc0/convisoappsec/flow/util/metrics.py +16 -0
  51. conviso-cli-1.14.0rc0/convisoappsec/flow/util/source_code_compressor.py +22 -0
  52. conviso-cli-1.14.0rc0/convisoappsec/flow/version_control_system_adapter.py +495 -0
  53. conviso-cli-1.14.0rc0/convisoappsec/flow/version_searchers/__init__.py +9 -0
  54. conviso-cli-1.14.0rc0/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +85 -0
  55. conviso-cli-1.14.0rc0/convisoappsec/flow/version_searchers/timebased_version_seacher.py +39 -0
  56. conviso-cli-1.14.0rc0/convisoappsec/flow/version_searchers/version_searcher_result.py +33 -0
  57. conviso-cli-1.14.0rc0/convisoappsec/flow/versioning_style/__init__.py +0 -0
  58. conviso-cli-1.14.0rc0/convisoappsec/flow/versioning_style/semantic_versioning.py +44 -0
  59. conviso-cli-1.14.0rc0/convisoappsec/flowcli/__init__.py +3 -0
  60. conviso-cli-1.14.0rc0/convisoappsec/flowcli/__main__.py +4 -0
  61. conviso-cli-1.14.0rc0/convisoappsec/flowcli/assets/__init__.py +4 -0
  62. conviso-cli-1.14.0rc0/convisoappsec/flowcli/assets/create.py +88 -0
  63. conviso-cli-1.14.0rc0/convisoappsec/flowcli/assets/entrypoint.py +20 -0
  64. conviso-cli-1.14.0rc0/convisoappsec/flowcli/assets/ls.py +63 -0
  65. conviso-cli-1.14.0rc0/convisoappsec/flowcli/ast/__init__.py +3 -0
  66. conviso-cli-1.14.0rc0/convisoappsec/flowcli/ast/entrypoint.py +202 -0
  67. conviso-cli-1.14.0rc0/convisoappsec/flowcli/common.py +192 -0
  68. conviso-cli-1.14.0rc0/convisoappsec/flowcli/companies/__init__.py +0 -0
  69. conviso-cli-1.14.0rc0/convisoappsec/flowcli/companies/ls.py +25 -0
  70. conviso-cli-1.14.0rc0/convisoappsec/flowcli/context.py +49 -0
  71. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/__init__.py +4 -0
  72. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/__init__.py +4 -0
  73. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/context.py +12 -0
  74. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/entrypoint.py +31 -0
  75. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/__init__.py +3 -0
  76. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +20 -0
  77. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +4 -0
  78. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +11 -0
  79. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +30 -0
  80. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +4 -0
  81. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +21 -0
  82. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +89 -0
  83. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +117 -0
  84. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/create/with_/values.py +149 -0
  85. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/entrypoint.py +22 -0
  86. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/ls.py +27 -0
  87. conviso-cli-1.14.0rc0/convisoappsec/flowcli/deploy/show.py +32 -0
  88. conviso-cli-1.14.0rc0/convisoappsec/flowcli/entrypoint.py +111 -0
  89. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/__init__.py +4 -0
  90. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/create/__init__.py +4 -0
  91. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/create/entrypoint.py +18 -0
  92. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/create/with_/__init__.py +3 -0
  93. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/create/with_/entrypoint.py +19 -0
  94. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/create/with_/version_tracker.py +96 -0
  95. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/entrypoint.py +19 -0
  96. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/import_sarif/__init__.py +4 -0
  97. conviso-cli-1.14.0rc0/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +225 -0
  98. conviso-cli-1.14.0rc0/convisoappsec/flowcli/help_option.py +18 -0
  99. conviso-cli-1.14.0rc0/convisoappsec/flowcli/iac/__init__.py +3 -0
  100. conviso-cli-1.14.0rc0/convisoappsec/flowcli/iac/entrypoint.py +17 -0
  101. conviso-cli-1.14.0rc0/convisoappsec/flowcli/iac/run.py +353 -0
  102. conviso-cli-1.14.0rc0/convisoappsec/flowcli/projects/__init__.py +0 -0
  103. conviso-cli-1.14.0rc0/convisoappsec/flowcli/projects/ls.py +32 -0
  104. conviso-cli-1.14.0rc0/convisoappsec/flowcli/requirements_verifier.py +211 -0
  105. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sast/__init__.py +3 -0
  106. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sast/entrypoint.py +17 -0
  107. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sast/run.py +530 -0
  108. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sca/__init__.py +3 -0
  109. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sca/entrypoint.py +17 -0
  110. conviso-cli-1.14.0rc0/convisoappsec/flowcli/sca/run.py +350 -0
  111. conviso-cli-1.14.0rc0/convisoappsec/flowcli/vulnerability/__init__.py +3 -0
  112. conviso-cli-1.14.0rc0/convisoappsec/flowcli/vulnerability/assert_security_rules.py +153 -0
  113. conviso-cli-1.14.0rc0/convisoappsec/flowcli/vulnerability/entrypoint.py +17 -0
  114. conviso-cli-1.14.0rc0/convisoappsec/logger.py +10 -0
  115. conviso-cli-1.14.0rc0/convisoappsec/sast/__init__.py +0 -0
  116. conviso-cli-1.14.0rc0/convisoappsec/sast/decision.py +45 -0
  117. conviso-cli-1.14.0rc0/convisoappsec/sast/sastbox.py +189 -0
  118. conviso-cli-1.14.0rc0/convisoappsec/version.py +1 -0
  119. conviso-cli-1.14.0rc0/scripts/shell_completer/flow_bash_completer.sh +21 -0
  120. conviso-cli-1.14.0rc0/scripts/shell_completer/flow_fish_completer.fish +1 -0
  121. conviso-cli-1.14.0rc0/scripts/shell_completer/flow_zsh_completer.sh +32 -0
  122. conviso-cli-1.14.0rc0/setup.cfg +4 -0
  123. conviso-cli-1.14.0rc0/setup.py +61 -0
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.1
2
+ Name: conviso-cli
3
+ Version: 1.14.0rc0
4
+ Summary: UNKNOWN
5
+ Maintainer: Conviso
6
+ Maintainer-email: development@convisoappsec.com
7
+ License: UNKNOWN
8
+ Platform: UNKNOWN
9
+ Requires-Python: >=3.5
10
+ Description-Content-Type: text/markdown
11
+
12
+ # CLI
13
+
14
+ This is a command line tool to interact with [convisoappsec] API.
15
+
16
+ # Documentation
17
+ Please visit the [official documentation] for further information.
18
+
19
+ [official documentation]: <https://docs.convisoappsec.com/cli/installation>
20
+
@@ -0,0 +1,8 @@
1
+ # CLI
2
+
3
+ This is a command line tool to interact with [convisoappsec] API.
4
+
5
+ # Documentation
6
+ Please visit the [official documentation] for further information.
7
+
8
+ [official documentation]: <https://docs.convisoappsec.com/cli/installation>
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.1
2
+ Name: conviso-cli
3
+ Version: 1.14.0rc0
4
+ Summary: UNKNOWN
5
+ Maintainer: Conviso
6
+ Maintainer-email: development@convisoappsec.com
7
+ License: UNKNOWN
8
+ Platform: UNKNOWN
9
+ Requires-Python: >=3.5
10
+ Description-Content-Type: text/markdown
11
+
12
+ # CLI
13
+
14
+ This is a command line tool to interact with [convisoappsec] API.
15
+
16
+ # Documentation
17
+ Please visit the [official documentation] for further information.
18
+
19
+ [official documentation]: <https://docs.convisoappsec.com/cli/installation>
20
+
@@ -0,0 +1,121 @@
1
+ README.md
2
+ setup.py
3
+ conviso_cli.egg-info/PKG-INFO
4
+ conviso_cli.egg-info/SOURCES.txt
5
+ conviso_cli.egg-info/dependency_links.txt
6
+ conviso_cli.egg-info/entry_points.txt
7
+ conviso_cli.egg-info/requires.txt
8
+ conviso_cli.egg-info/top_level.txt
9
+ convisoappsec/__init__.py
10
+ convisoappsec/logger.py
11
+ convisoappsec/version.py
12
+ convisoappsec/common/__init__.py
13
+ convisoappsec/common/box.py
14
+ convisoappsec/common/docker.py
15
+ convisoappsec/common/exceptions.py
16
+ convisoappsec/common/git_data_parser.py
17
+ convisoappsec/common/strings.py
18
+ convisoappsec/common/graphql/__init__.py
19
+ convisoappsec/common/graphql/error_handlers.py
20
+ convisoappsec/common/graphql/errors.py
21
+ convisoappsec/common/graphql/low_client.py
22
+ convisoappsec/flow/__init__.py
23
+ convisoappsec/flow/api.py
24
+ convisoappsec/flow/version_control_system_adapter.py
25
+ convisoappsec/flow/graphql_api/__init__.py
26
+ convisoappsec/flow/graphql_api/beta/__init__.py
27
+ convisoappsec/flow/graphql_api/beta/client.py
28
+ convisoappsec/flow/graphql_api/beta/resources_api.py
29
+ convisoappsec/flow/graphql_api/beta/models/__init__.py
30
+ convisoappsec/flow/graphql_api/beta/models/issues/__init__.py
31
+ convisoappsec/flow/graphql_api/beta/models/issues/iac.py
32
+ convisoappsec/flow/graphql_api/beta/models/issues/normalize.py
33
+ convisoappsec/flow/graphql_api/beta/models/issues/sast.py
34
+ convisoappsec/flow/graphql_api/beta/models/issues/sca.py
35
+ convisoappsec/flow/graphql_api/beta/schemas/__init__.py
36
+ convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py
37
+ convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py
38
+ convisoappsec/flow/graphql_api/v1/__init__.py
39
+ convisoappsec/flow/graphql_api/v1/client.py
40
+ convisoappsec/flow/graphql_api/v1/resources_api.py
41
+ convisoappsec/flow/graphql_api/v1/models/__init__.py
42
+ convisoappsec/flow/graphql_api/v1/models/asset.py
43
+ convisoappsec/flow/graphql_api/v1/models/project.py
44
+ convisoappsec/flow/graphql_api/v1/schemas/__init__.py
45
+ convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py
46
+ convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py
47
+ convisoappsec/flow/source_code_scanner/__init__.py
48
+ convisoappsec/flow/source_code_scanner/exceptions.py
49
+ convisoappsec/flow/source_code_scanner/scc.py
50
+ convisoappsec/flow/source_code_scanner/source_code_scanner.py
51
+ convisoappsec/flow/util/__init__.py
52
+ convisoappsec/flow/util/ci_provider.py
53
+ convisoappsec/flow/util/metrics.py
54
+ convisoappsec/flow/util/source_code_compressor.py
55
+ convisoappsec/flow/version_searchers/__init__.py
56
+ convisoappsec/flow/version_searchers/sorted_by_versioning_style.py
57
+ convisoappsec/flow/version_searchers/timebased_version_seacher.py
58
+ convisoappsec/flow/version_searchers/version_searcher_result.py
59
+ convisoappsec/flow/versioning_style/__init__.py
60
+ convisoappsec/flow/versioning_style/semantic_versioning.py
61
+ convisoappsec/flowcli/__init__.py
62
+ convisoappsec/flowcli/__main__.py
63
+ convisoappsec/flowcli/common.py
64
+ convisoappsec/flowcli/context.py
65
+ convisoappsec/flowcli/entrypoint.py
66
+ convisoappsec/flowcli/help_option.py
67
+ convisoappsec/flowcli/requirements_verifier.py
68
+ convisoappsec/flowcli/assets/__init__.py
69
+ convisoappsec/flowcli/assets/create.py
70
+ convisoappsec/flowcli/assets/entrypoint.py
71
+ convisoappsec/flowcli/assets/ls.py
72
+ convisoappsec/flowcli/ast/__init__.py
73
+ convisoappsec/flowcli/ast/entrypoint.py
74
+ convisoappsec/flowcli/companies/__init__.py
75
+ convisoappsec/flowcli/companies/ls.py
76
+ convisoappsec/flowcli/deploy/__init__.py
77
+ convisoappsec/flowcli/deploy/entrypoint.py
78
+ convisoappsec/flowcli/deploy/ls.py
79
+ convisoappsec/flowcli/deploy/show.py
80
+ convisoappsec/flowcli/deploy/create/__init__.py
81
+ convisoappsec/flowcli/deploy/create/context.py
82
+ convisoappsec/flowcli/deploy/create/entrypoint.py
83
+ convisoappsec/flowcli/deploy/create/with_/__init__.py
84
+ convisoappsec/flowcli/deploy/create/with_/entrypoint.py
85
+ convisoappsec/flowcli/deploy/create/with_/values.py
86
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py
87
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py
88
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py
89
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py
90
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py
91
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py
92
+ convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py
93
+ convisoappsec/flowcli/findings/__init__.py
94
+ convisoappsec/flowcli/findings/entrypoint.py
95
+ convisoappsec/flowcli/findings/create/__init__.py
96
+ convisoappsec/flowcli/findings/create/entrypoint.py
97
+ convisoappsec/flowcli/findings/create/with_/__init__.py
98
+ convisoappsec/flowcli/findings/create/with_/entrypoint.py
99
+ convisoappsec/flowcli/findings/create/with_/version_tracker.py
100
+ convisoappsec/flowcli/findings/import_sarif/__init__.py
101
+ convisoappsec/flowcli/findings/import_sarif/entrypoint.py
102
+ convisoappsec/flowcli/iac/__init__.py
103
+ convisoappsec/flowcli/iac/entrypoint.py
104
+ convisoappsec/flowcli/iac/run.py
105
+ convisoappsec/flowcli/projects/__init__.py
106
+ convisoappsec/flowcli/projects/ls.py
107
+ convisoappsec/flowcli/sast/__init__.py
108
+ convisoappsec/flowcli/sast/entrypoint.py
109
+ convisoappsec/flowcli/sast/run.py
110
+ convisoappsec/flowcli/sca/__init__.py
111
+ convisoappsec/flowcli/sca/entrypoint.py
112
+ convisoappsec/flowcli/sca/run.py
113
+ convisoappsec/flowcli/vulnerability/__init__.py
114
+ convisoappsec/flowcli/vulnerability/assert_security_rules.py
115
+ convisoappsec/flowcli/vulnerability/entrypoint.py
116
+ convisoappsec/sast/__init__.py
117
+ convisoappsec/sast/decision.py
118
+ convisoappsec/sast/sastbox.py
119
+ scripts/shell_completer/flow_bash_completer.sh
120
+ scripts/shell_completer/flow_fish_completer.fish
121
+ scripts/shell_completer/flow_zsh_completer.sh
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ conviso = convisoappsec.flowcli.entrypoint:cli
3
+ flow = convisoappsec.flowcli.entrypoint:cli
4
+
@@ -0,0 +1,12 @@
1
+ GitPython<4,>=3.1.2
2
+ click<8,>=7.1.2
3
+ requests<3,>=2.23.0
4
+ urllib3<=2.0.6
5
+ semantic-version<3,>=2.8.5
6
+ docker<=6.1.3
7
+ PyYAML==5.3.1
8
+ click-log<1,>=0.3.2
9
+ transitions<1,>=0.8.7
10
+ jsonschema<3,>=2.5.1
11
+ giturlparse<=0.12.0
12
+ jmespath<1.0.1,>=0.9.0
@@ -0,0 +1 @@
1
+ convisoappsec
File without changes
@@ -0,0 +1,5 @@
1
+ from urllib.parse import urljoin
2
+
3
+
4
+ def safe_join_url(base_url, path):
5
+ return urljoin(base_url, path)
@@ -0,0 +1,261 @@
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
+ self.logger.info(' Pulling {} image'.format(self.name))
111
+ image = self.scanner.pull()
112
+ if image:
113
+ self.logger.debug('Image: {}'.format(image))
114
+ self.next_state()
115
+ else:
116
+ raise RuntimeError("Image not found.")
117
+
118
+ def _on_running(self):
119
+ self.logger.info(' Scanner {} is running.'.format(
120
+ self.scanner.repository_name, self.state
121
+ ))
122
+ self.scanner.run()
123
+ self.end_time = time.time()
124
+ self.logger.debug('Total execution time for {} was {:2f}'.format(
125
+ self.scanner.repository_name,
126
+ self.end_time - self.start_time
127
+ ))
128
+ status_code = self.scanner.wait()
129
+ self.logger.info(' Scanner {}@{} returned status code {}'.format(
130
+ self.scanner.repository_name,
131
+ self.name,
132
+ status_code
133
+ ))
134
+ self.next_state()
135
+
136
+ def _on_sending(self):
137
+ self.logger.debug(RAW_STATE_MSG.format(
138
+ self.name, self.state
139
+ ))
140
+ self.results = self.scanner.get_container_reports()
141
+ self.next_state()
142
+
143
+ def _on_done(self):
144
+ self.logger.debug(RAW_STATE_MSG.format(
145
+ self.scanner.repository_name, self.state
146
+ ))
147
+ self.scanner.container.remove(v=True, force=True)
148
+
149
+ def start(self):
150
+ self.start_time = time.time()
151
+ self.to_pulling()
152
+
153
+
154
+ class ContainerWrapper:
155
+
156
+ def __init__(self, token, containers_map, logger, timeout, max_workers=5):
157
+ self.token = token
158
+ self.logger = logger or LOGGER
159
+ self.max_workers = max_workers
160
+ self.scanners = [
161
+ ScannerEntity(
162
+ token=token,
163
+ scanner=scanner,
164
+ logger=logger,
165
+ timeout=timeout
166
+ )
167
+ for scanner in containers_map.values()
168
+ ]
169
+
170
+ def run(self):
171
+ self.logger.debug("Starting Execution")
172
+ with ThreadPoolExecutor(max_workers=self.max_workers) as exeggutor:
173
+ for scanner in self.scanners:
174
+ exeggutor.submit(scanner.start)
175
+
176
+
177
+ def convert_sarif_to_sastbox1(report_filepath, repository_dir, container_registry_token, scanner_timeout=7200):
178
+ """
179
+ Args:
180
+ report_filepath (str): filepath to the report to be converted
181
+ repository_dir (str): filepath to the repository being tested
182
+ token (str): Conviso container registry token
183
+ scanner_timeout (int): container timeout
184
+
185
+ Returns:
186
+ string: filepath to the converted report
187
+ """
188
+ CONTAINER_IMAGE_NAME = 'sastbox-converter-tool'
189
+ CONTAINER_IMAGE_TAG = 'cc50dee'
190
+
191
+ CONTAINER_INPUT_FILEPATH = '/code{}'.format(
192
+ report_filepath.replace(repository_dir, '')
193
+ )
194
+ CONTAINER_OUTPUT_FILENAME = CONTAINER_INPUT_FILEPATH.replace(
195
+ 'sarif', 'json'
196
+ )
197
+
198
+ CONTAINERS_MAP = {
199
+ CONTAINER_IMAGE_NAME: {
200
+ 'repository_dir': repository_dir,
201
+ 'repository_name': CONTAINER_IMAGE_NAME,
202
+ 'tag': CONTAINER_IMAGE_TAG,
203
+ 'command': [
204
+ '--format', 'sastbox1',
205
+ '--input', CONTAINER_INPUT_FILEPATH,
206
+ '--output', CONTAINER_OUTPUT_FILENAME
207
+ ],
208
+ },
209
+ }
210
+ converter_wrapped = ContainerWrapper(
211
+ token=container_registry_token,
212
+ containers_map=CONTAINERS_MAP,
213
+ logger=None,
214
+ timeout=scanner_timeout
215
+ )
216
+
217
+ converter_wrapped.logger.setLevel('WARN')
218
+ converter_wrapped.run()
219
+ converter_wrapped.logger.setLevel('INFO')
220
+
221
+ scanner = converter_wrapped.scanners[0].scanner
222
+ last_scan_name = scanner.name
223
+ last_container = scanner.docker.containers.get(
224
+ last_scan_name
225
+ )
226
+
227
+ try:
228
+ chunks, _ = last_container.get_archive(CONTAINER_OUTPUT_FILENAME)
229
+ output_filepath = __extract_tarball_chunks(
230
+ chunks, report_filepath.replace('sarif', 'json')
231
+ )
232
+ except docker.errors.APIError as error:
233
+ stderr_log = last_container.logs(stderr=True).decode('utf-8')
234
+ raise PropertyRequiredError(stderr_log)
235
+
236
+ return output_filepath
237
+
238
+
239
+ def __extract_tarball_chunks(tarball_chunks, report_absolute_filepath):
240
+ """
241
+
242
+ Args:
243
+ tarball_chunks (int): The number of bytes returned by each iteration of the generator
244
+ report_filename (string): The name of the extracted report
245
+
246
+ Returns:
247
+ string: Report absolute filepath in local filesystem
248
+ """
249
+ output_dirpath = report_absolute_filepath[
250
+ :report_absolute_filepath.rfind('/')
251
+ ]
252
+
253
+ with tempfile.TemporaryFile() as tmp_wrapper_file:
254
+ for chunk in tarball_chunks:
255
+ tmp_wrapper_file.write(chunk)
256
+ tmp_wrapper_file.seek(0)
257
+
258
+ with tarfile.open(mode="r|", fileobj=tmp_wrapper_file) as talball_file:
259
+ talball_file.extractall(path=output_dirpath)
260
+
261
+ return report_absolute_filepath