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.
Files changed (128) hide show
  1. conviso_ast-3.0.0.data/scripts/flow_bash_completer.sh +21 -0
  2. conviso_ast-3.0.0.data/scripts/flow_fish_completer.fish +1 -0
  3. conviso_ast-3.0.0.data/scripts/flow_zsh_completer.sh +32 -0
  4. conviso_ast-3.0.0.dist-info/METADATA +37 -0
  5. conviso_ast-3.0.0.dist-info/RECORD +128 -0
  6. conviso_ast-3.0.0.dist-info/WHEEL +5 -0
  7. conviso_ast-3.0.0.dist-info/entry_points.txt +3 -0
  8. conviso_ast-3.0.0.dist-info/top_level.txt +1 -0
  9. convisoappsec/__init__.py +0 -0
  10. convisoappsec/common/__init__.py +5 -0
  11. convisoappsec/common/box.py +251 -0
  12. convisoappsec/common/cleaner.py +78 -0
  13. convisoappsec/common/docker.py +399 -0
  14. convisoappsec/common/exceptions.py +8 -0
  15. convisoappsec/common/git_data_parser.py +76 -0
  16. convisoappsec/common/graphql/__init__.py +0 -0
  17. convisoappsec/common/graphql/error_handlers.py +75 -0
  18. convisoappsec/common/graphql/errors.py +16 -0
  19. convisoappsec/common/graphql/low_client.py +51 -0
  20. convisoappsec/common/retry_handler.py +40 -0
  21. convisoappsec/common/strings.py +8 -0
  22. convisoappsec/flow/__init__.py +3 -0
  23. convisoappsec/flow/api.py +104 -0
  24. convisoappsec/flow/cleaner.py +118 -0
  25. convisoappsec/flow/graphql_api/__init__.py +0 -0
  26. convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
  27. convisoappsec/flow/graphql_api/beta/client.py +18 -0
  28. convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
  29. convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
  30. convisoappsec/flow/graphql_api/beta/models/issues/container.py +72 -0
  31. convisoappsec/flow/graphql_api/beta/models/issues/iac.py +6 -0
  32. convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +13 -0
  33. convisoappsec/flow/graphql_api/beta/models/issues/sast.py +53 -0
  34. convisoappsec/flow/graphql_api/beta/models/issues/sca.py +78 -0
  35. convisoappsec/flow/graphql_api/beta/resources_api.py +142 -0
  36. convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
  37. convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +61 -0
  38. convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
  39. convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
  40. convisoappsec/flow/graphql_api/v1/client.py +46 -0
  41. convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
  42. convisoappsec/flow/graphql_api/v1/models/asset.py +14 -0
  43. convisoappsec/flow/graphql_api/v1/models/issues.py +16 -0
  44. convisoappsec/flow/graphql_api/v1/models/project.py +35 -0
  45. convisoappsec/flow/graphql_api/v1/resources_api.py +489 -0
  46. convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
  47. convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +212 -0
  48. convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +180 -0
  49. convisoappsec/flow/source_code_scanner/__init__.py +9 -0
  50. convisoappsec/flow/source_code_scanner/exceptions.py +2 -0
  51. convisoappsec/flow/source_code_scanner/scc.py +68 -0
  52. convisoappsec/flow/source_code_scanner/source_code_scanner.py +177 -0
  53. convisoappsec/flow/util/__init__.py +7 -0
  54. convisoappsec/flow/util/ci_provider.py +99 -0
  55. convisoappsec/flow/util/metrics.py +16 -0
  56. convisoappsec/flow/util/source_code_compressor.py +22 -0
  57. convisoappsec/flow/version_control_system_adapter.py +528 -0
  58. convisoappsec/flow/version_searchers/__init__.py +9 -0
  59. convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +85 -0
  60. convisoappsec/flow/version_searchers/timebased_version_seacher.py +39 -0
  61. convisoappsec/flow/version_searchers/version_searcher_result.py +33 -0
  62. convisoappsec/flow/versioning_style/__init__.py +0 -0
  63. convisoappsec/flow/versioning_style/semantic_versioning.py +44 -0
  64. convisoappsec/flowcli/__init__.py +3 -0
  65. convisoappsec/flowcli/__main__.py +4 -0
  66. convisoappsec/flowcli/assets/__init__.py +4 -0
  67. convisoappsec/flowcli/assets/create.py +88 -0
  68. convisoappsec/flowcli/assets/entrypoint.py +20 -0
  69. convisoappsec/flowcli/assets/ls.py +63 -0
  70. convisoappsec/flowcli/ast/__init__.py +3 -0
  71. convisoappsec/flowcli/ast/entrypoint.py +427 -0
  72. convisoappsec/flowcli/common.py +175 -0
  73. convisoappsec/flowcli/companies/__init__.py +0 -0
  74. convisoappsec/flowcli/companies/ls.py +25 -0
  75. convisoappsec/flowcli/container/__init__.py +3 -0
  76. convisoappsec/flowcli/container/entrypoint.py +17 -0
  77. convisoappsec/flowcli/container/run.py +306 -0
  78. convisoappsec/flowcli/context.py +49 -0
  79. convisoappsec/flowcli/deploy/__init__.py +0 -0
  80. convisoappsec/flowcli/deploy/create/__init__.py +4 -0
  81. convisoappsec/flowcli/deploy/create/context.py +12 -0
  82. convisoappsec/flowcli/deploy/create/entrypoint.py +31 -0
  83. convisoappsec/flowcli/deploy/create/with_/__init__.py +3 -0
  84. convisoappsec/flowcli/deploy/create/with_/entrypoint.py +20 -0
  85. convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +4 -0
  86. convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +11 -0
  87. convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +30 -0
  88. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +4 -0
  89. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +21 -0
  90. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +84 -0
  91. convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +115 -0
  92. convisoappsec/flowcli/deploy/create/with_/values.py +133 -0
  93. convisoappsec/flowcli/entrypoint.py +103 -0
  94. convisoappsec/flowcli/environment_checker.py +45 -0
  95. convisoappsec/flowcli/findings/__init__.py +4 -0
  96. convisoappsec/flowcli/findings/create/__init__.py +4 -0
  97. convisoappsec/flowcli/findings/create/entrypoint.py +18 -0
  98. convisoappsec/flowcli/findings/create/with_/__init__.py +3 -0
  99. convisoappsec/flowcli/findings/create/with_/entrypoint.py +19 -0
  100. convisoappsec/flowcli/findings/create/with_/version_tracker.py +93 -0
  101. convisoappsec/flowcli/findings/entrypoint.py +19 -0
  102. convisoappsec/flowcli/findings/import_sarif/__init__.py +4 -0
  103. convisoappsec/flowcli/findings/import_sarif/entrypoint.py +430 -0
  104. convisoappsec/flowcli/help_option.py +18 -0
  105. convisoappsec/flowcli/iac/__init__.py +3 -0
  106. convisoappsec/flowcli/iac/entrypoint.py +17 -0
  107. convisoappsec/flowcli/iac/run.py +328 -0
  108. convisoappsec/flowcli/requirements_verifier.py +132 -0
  109. convisoappsec/flowcli/sast/__init__.py +3 -0
  110. convisoappsec/flowcli/sast/entrypoint.py +17 -0
  111. convisoappsec/flowcli/sast/run.py +485 -0
  112. convisoappsec/flowcli/sbom/__init__.py +3 -0
  113. convisoappsec/flowcli/sbom/entrypoint.py +17 -0
  114. convisoappsec/flowcli/sbom/generate.py +235 -0
  115. convisoappsec/flowcli/sca/__init__.py +3 -0
  116. convisoappsec/flowcli/sca/entrypoint.py +17 -0
  117. convisoappsec/flowcli/sca/run.py +479 -0
  118. convisoappsec/flowcli/vulnerability/__init__.py +3 -0
  119. convisoappsec/flowcli/vulnerability/assert_security_rules.py +201 -0
  120. convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +175 -0
  121. convisoappsec/flowcli/vulnerability/entrypoint.py +18 -0
  122. convisoappsec/flowcli/vulnerability/rules_schema.json +53 -0
  123. convisoappsec/flowcli/vulnerability/run.py +487 -0
  124. convisoappsec/logger.py +29 -0
  125. convisoappsec/sast/__init__.py +0 -0
  126. convisoappsec/sast/decision.py +45 -0
  127. convisoappsec/sast/sastbox.py +296 -0
  128. convisoappsec/version.py +1 -0
@@ -0,0 +1,85 @@
1
+ import warnings
2
+
3
+ from convisoappsec.flow.versioning_style import semantic_versioning
4
+
5
+ from .version_searcher_result import VersionSearcherResult
6
+
7
+
8
+ class SortedByVersioningStyle(object):
9
+ SEMANTIC_VERSIONING_STYLE = 'semantic-versioning'
10
+ STYLES = [
11
+ SEMANTIC_VERSIONING_STYLE,
12
+ ]
13
+
14
+ def __init__(
15
+ self, version_control_system_adapter,
16
+ ignore_prefix, style, current_tag, **kargs
17
+ ):
18
+ self.version_control_system_adapter = version_control_system_adapter
19
+ self.ignore_prefix = ignore_prefix
20
+ self.style = style
21
+ self.current_tag = current_tag
22
+ self.suppress_warnings = kargs.get('suppress_warnings', True)
23
+
24
+ def find_current_and_previous_version(self):
25
+ tags = self.version_control_system_adapter.tags()
26
+
27
+ versions = []
28
+
29
+ for tag in tags:
30
+ try:
31
+ versions.append(
32
+ semantic_versioning.Version(
33
+ tag,
34
+ prefix=self.ignore_prefix,
35
+ )
36
+ )
37
+ except ValueError as e:
38
+ if not self.suppress_warnings:
39
+ warnings.warn(str(e))
40
+
41
+ current_version = None
42
+
43
+ if not self.current_tag:
44
+ current_version = semantic_versioning.Version.find_latest(
45
+ versions
46
+ )
47
+
48
+ if not current_version:
49
+ raise RuntimeError("No current_version was found")
50
+ else:
51
+ current_version = semantic_versioning.Version(
52
+ self.current_tag,
53
+ prefix=self.ignore_prefix,
54
+ )
55
+
56
+ if current_version not in versions:
57
+ raise ValueError(
58
+ "Current version[%s] not exists on repository"
59
+ %
60
+ current_version
61
+ )
62
+
63
+ previous_version = current_version.find_previous(versions)
64
+
65
+ current_tag = str(current_version)
66
+ current_commit = self.version_control_system_adapter.show_commit_from_tag( # noqa: E501
67
+ current_tag
68
+ )
69
+
70
+ previous_tag = None
71
+ previous_commit = self.version_control_system_adapter.empty_repository_tree_commit # noqa: E501
72
+
73
+ if previous_version:
74
+ previous_tag = str(previous_version)
75
+ previous_commit = self.version_control_system_adapter.show_commit_from_tag( # noqa: E501
76
+ previous_tag
77
+ )
78
+
79
+ return VersionSearcherResult(
80
+ current_commit=current_commit,
81
+ previous_commit=previous_commit,
82
+ current_tag=current_tag,
83
+ previous_tag=previous_tag,
84
+
85
+ )
@@ -0,0 +1,39 @@
1
+ from .version_searcher_result import VersionSearcherResult
2
+
3
+
4
+ class TimeBasedVersionSearcher(object):
5
+ def __init__(self, version_control_system_adapter):
6
+ self.version_control_system_adapter = version_control_system_adapter
7
+
8
+ def find_current_and_previous_version(self):
9
+ tags = self.version_control_system_adapter.tags()
10
+
11
+ current_tag = None
12
+ previous_tag = None
13
+
14
+ tags = tags[:2]
15
+
16
+ if len(tags) >= 2:
17
+ (current_tag, previous_tag) = tags
18
+ elif len(tags) == 1:
19
+ current_tag = tags[0]
20
+ else:
21
+ raise Exception("Was not possible find the current tag")
22
+
23
+ current_commit = self.version_control_system_adapter.show_commit_from_tag( # noqa: E501
24
+ current_tag
25
+ )
26
+
27
+ previous_commit = self.version_control_system_adapter.empty_repository_tree_commit # noqa: E501
28
+
29
+ if previous_tag:
30
+ previous_commit = self.version_control_system_adapter.show_commit_from_tag( # noqa: E501
31
+ previous_tag
32
+ )
33
+
34
+ return VersionSearcherResult(
35
+ current_commit=current_commit,
36
+ previous_commit=previous_commit,
37
+ current_tag=current_tag,
38
+ previous_tag=previous_tag,
39
+ )
@@ -0,0 +1,33 @@
1
+ class VersionSearcherResult(object):
2
+
3
+ def __init__(self, **karg):
4
+ self.current_tag = karg.get('current_tag')
5
+ self.previous_tag = karg.get('previous_tag')
6
+ self.current_commit = karg.get('current_commit')
7
+ self.previous_commit = karg.get('previous_commit')
8
+
9
+ if not (self.current_commit and self.previous_commit):
10
+ raise ValueError(
11
+ "The values of current_commit and previous_commit are required"
12
+ )
13
+
14
+ @property
15
+ def current_version(self):
16
+ return self.create_version_dict(
17
+ self.current_commit,
18
+ self.current_tag,
19
+ )
20
+
21
+ @property
22
+ def previous_version(self):
23
+ return self.create_version_dict(
24
+ self.previous_commit,
25
+ self.previous_tag,
26
+ )
27
+
28
+ @staticmethod
29
+ def create_version_dict(commit, tag):
30
+ return {
31
+ 'commit': commit,
32
+ 'tag': tag,
33
+ }
File without changes
@@ -0,0 +1,44 @@
1
+ import semantic_version
2
+ import re
3
+
4
+
5
+ class Version(semantic_version.Version):
6
+ PREFIXED_VERSION_RE_FMT = '^{prefix}(.+)'
7
+
8
+ def __init__(self, version_string, prefix=None):
9
+ super().__init__(
10
+ self.__remove_prefix(prefix, version_string)
11
+ )
12
+
13
+ self.__version_string = version_string
14
+
15
+ def __str__(self):
16
+ return self.__version_string
17
+
18
+ @classmethod
19
+ def __remove_prefix(cls, prefix, version_string):
20
+ if not prefix:
21
+ return version_string
22
+
23
+ version_re = cls.PREFIXED_VERSION_RE_FMT.format(
24
+ prefix=re.escape(prefix)
25
+ )
26
+
27
+ match = re.match(version_re, version_string)
28
+
29
+ if match:
30
+ return match.group(1)
31
+
32
+ return version_string
33
+
34
+ def find_previous(self, versions):
35
+ previous_tags = list(
36
+ filter(lambda v: v < self, versions)
37
+ )
38
+
39
+ return self.find_latest(previous_tags)
40
+
41
+ @staticmethod
42
+ def find_latest(versions):
43
+ if len(versions) > 0:
44
+ return max(versions)
@@ -0,0 +1,3 @@
1
+ from .help_option import help_option
2
+
3
+ __all__ = ['help_option']
@@ -0,0 +1,4 @@
1
+ from .entrypoint import cli
2
+
3
+ if __name__ == '__main__':
4
+ cli(prog_name="convisoappsec.flowcli")
@@ -0,0 +1,4 @@
1
+ from .entrypoint import assets
2
+
3
+
4
+ __all__ = ['assets']
@@ -0,0 +1,88 @@
1
+ import click
2
+ import click_log
3
+
4
+ from convisoappsec.common.git_data_parser import GitDataParser
5
+ from convisoappsec.flow.graphql_api.v1.models.asset import AssetInput
6
+ from convisoappsec.flowcli import help_option
7
+ from convisoappsec.flowcli.common import on_http_error
8
+ from convisoappsec.flowcli.context import pass_flow_context
9
+ from convisoappsec.logger import LOGGER
10
+
11
+ click_log.basic_config(LOGGER)
12
+
13
+
14
+ def parse_repository_name(repository_dir, asset_name=None):
15
+ has_user_input = asset_name != None
16
+ if has_user_input:
17
+ return asset_name
18
+
19
+ return GitDataParser(repository_dir).parse_name()
20
+
21
+
22
+ @click.command()
23
+ @click_log.simple_verbosity_option(LOGGER)
24
+ @click.option(
25
+ "-c",
26
+ "--company-id",
27
+ type=int,
28
+ required=True,
29
+ help="The Company ID from your organization in Conviso Platform.",
30
+ )
31
+ @click.option(
32
+ "-r",
33
+ "--repository-dir",
34
+ type=click.Path(exists=True, resolve_path=True),
35
+ default=".",
36
+ show_default=True,
37
+ required=True,
38
+ help="The directory path for the asset.",
39
+ )
40
+ @click.option(
41
+ "--name",
42
+ type=str,
43
+ default=None,
44
+ show_default=False,
45
+ required=False,
46
+ help="Customize the Asset name.",
47
+ )
48
+ @click.option(
49
+ "--scan-type",
50
+ type=str,
51
+ default="None",
52
+ show_default=True,
53
+ required=False,
54
+ help="Customize the Asset scan type.",
55
+ )
56
+ @help_option
57
+ @pass_flow_context
58
+ def create(flow_context, company_id, repository_dir, name, scan_type):
59
+ try:
60
+ conviso_api = flow_context.create_conviso_graphql_client()
61
+
62
+ perform_command(conviso_api, company_id, repository_dir, name, scan_type)
63
+
64
+ except Exception as exception:
65
+ on_http_error(exception)
66
+ raise click.ClickException(str(exception)) from exception
67
+
68
+
69
+ def perform_command(
70
+ conviso_api,
71
+ company_id,
72
+ repository_dir,
73
+ name,
74
+ scan_type,
75
+ ):
76
+ asset_name = parse_repository_name(repository_dir, name)
77
+
78
+ asset_model = AssetInput(
79
+ company_id,
80
+ asset_name,
81
+ scan_type,
82
+ )
83
+
84
+ print('Creating new asset to repository: "{}"'.format(repository_dir))
85
+ asset = conviso_api.assets.create_asset(asset_model)
86
+
87
+ asset_url = conviso_api.assets.get_asset_url(company_id, asset["id"])
88
+ print("The created Asset is available at Conviso Platform: {}".format(asset_url))
@@ -0,0 +1,20 @@
1
+ import click
2
+
3
+ from convisoappsec.flowcli import help_option
4
+ from .ls import ls
5
+ from .create import create
6
+
7
+
8
+ @click.group()
9
+ @help_option
10
+ def assets():
11
+ pass
12
+
13
+
14
+ assets.add_command(ls)
15
+ assets.add_command(create)
16
+
17
+
18
+ assets.epilog = '''
19
+ Run 'conviso assets COMMAND --help' for more information on a command.
20
+ '''
@@ -0,0 +1,63 @@
1
+ from json import dumps as json_dumps
2
+
3
+ import click
4
+ import click_log
5
+
6
+ from convisoappsec.flowcli import help_option
7
+ from convisoappsec.flowcli.common import on_http_error
8
+ from convisoappsec.flowcli.context import pass_flow_context
9
+ from convisoappsec.logger import LOGGER
10
+
11
+ click_log.basic_config(LOGGER)
12
+
13
+
14
+ @click.command()
15
+ @click_log.simple_verbosity_option(LOGGER)
16
+ @click.option(
17
+ '-c',
18
+ '--company-id',
19
+ type=int,
20
+ required=True,
21
+ help="The company ID to have its resources used.",
22
+ )
23
+ @click.option(
24
+ '-p',
25
+ '--page',
26
+ type=int,
27
+ default=1,
28
+ show_default=True,
29
+ required=False,
30
+ help="Page to be consulted",
31
+ )
32
+ @click.option(
33
+ '-l',
34
+ '--limit',
35
+ type=int,
36
+ default=32,
37
+ show_default=True,
38
+ required=False,
39
+ help="Items limit per page.",
40
+ )
41
+ @help_option
42
+ @pass_flow_context
43
+ def ls(flow_context, company_id, asset_name="", page=1, limit=32):
44
+ try:
45
+ conviso_api = flow_context.create_conviso_graphql_client()
46
+
47
+ perform_command(conviso_api, company_id, asset_name, page, limit)
48
+
49
+ except Exception as exception:
50
+ on_http_error(exception)
51
+ raise click.ClickException(str(exception)) from exception
52
+
53
+
54
+ def perform_command(conviso_api, company_id, asset_name="", page=1, limit=32):
55
+ assets_found = conviso_api.assets.get_by_company_id_or_name(
56
+ company_id,
57
+ asset_name,
58
+ page,
59
+ limit
60
+ )
61
+
62
+ indented_output = json_dumps(assets_found, indent=2)
63
+ print(indented_output)
@@ -0,0 +1,3 @@
1
+ from .entrypoint import ast
2
+
3
+ __all__ = ['ast']