devsecops-engine-tools 1.14.6__py3-none-any.whl → 1.15.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.

Potentially problematic release.


This version of devsecops-engine-tools might be problematic. Click here for more details.

Files changed (29) hide show
  1. devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py +1 -1
  2. devsecops_engine_tools/engine_core/src/domain/model/report.py +3 -1
  3. devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +7 -1
  4. devsecops_engine_tools/engine_utilities/sonarqube/__init__.py +0 -0
  5. devsecops_engine_tools/engine_utilities/sonarqube/src/__init__.py +0 -0
  6. devsecops_engine_tools/engine_utilities/sonarqube/src/applications/__init__.py +0 -0
  7. devsecops_engine_tools/engine_utilities/sonarqube/src/applications/runner_report_sonar.py +110 -0
  8. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/__init__.py +0 -0
  9. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/__init__.py +0 -0
  10. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/__init__.py +0 -0
  11. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py +63 -0
  12. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/__init__.py +0 -0
  13. devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py +194 -0
  14. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/__init__.py +0 -0
  15. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py +0 -0
  16. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/__init__.py +0 -0
  17. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py +112 -0
  18. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/__init__.py +0 -0
  19. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py +37 -0
  20. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/__init__.py +0 -0
  21. devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/utils.py +8 -0
  22. devsecops_engine_tools/engine_utilities/utils/utils.py +6 -1
  23. devsecops_engine_tools/version.py +1 -1
  24. {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/METADATA +1 -1
  25. {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/RECORD +28 -10
  26. devsecops_engine_tools-1.15.0.dist-info/entry_points.txt +3 -0
  27. devsecops_engine_tools-1.14.6.dist-info/entry_points.txt +0 -2
  28. {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/WHEEL +0 -0
  29. {devsecops_engine_tools-1.14.6.dist-info → devsecops_engine_tools-1.15.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
 
3
3
  from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import VulnerabilityManagement
4
-
4
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import DevopsPlatformGateway
5
5
 
6
6
  class VulnerabilityManagementGateway(metaclass=ABCMeta):
7
7
  @abstractmethod
@@ -31,4 +31,6 @@ class Report:
31
31
  self.component_name = kwargs.get("component_name", "")
32
32
  self.component_version = kwargs.get("component_version", "")
33
33
  self.file_path = kwargs.get("file_path", "")
34
- self.endpoints = kwargs.get("endpoints", "")
34
+ self.endpoints = kwargs.get("endpoints", "")
35
+ self.unique_id_from_tool = kwargs.get("unique_id_from_tool", "")
36
+ self.out_of_scope = kwargs.get("out_of_scope", "")
@@ -5,6 +5,9 @@ from devsecops_engine_tools.engine_core.src.domain.model.gateway.vulnerability_m
5
5
  from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import (
6
6
  VulnerabilityManagement,
7
7
  )
8
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import (
9
+ DevopsPlatformGateway
10
+ )
8
11
  from devsecops_engine_tools.engine_utilities.defect_dojo import (
9
12
  DefectDojo,
10
13
  ImportScanRequest,
@@ -67,7 +70,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
67
70
  "KUBESCAPE": "Kubescape Scanner",
68
71
  "KICS": "KICS Scanner",
69
72
  "BEARER": "Bearer CLI",
70
- "DEPENDENCY_CHECK": "Dependency Check Scan"
73
+ "DEPENDENCY_CHECK": "Dependency Check Scan",
74
+ "SONARQUBE": "SonarQube API Import"
71
75
  }
72
76
 
73
77
  if any(
@@ -426,6 +430,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
426
430
  risk_accepted=finding.risk_accepted,
427
431
  false_p=finding.false_p,
428
432
  service=finding.service,
433
+ unique_id_from_tool=finding.unique_id_from_tool,
434
+ out_of_scope=finding.out_of_scope
429
435
  )
430
436
 
431
437
  def _format_date_to_dd_format(self, date_string):
@@ -0,0 +1,110 @@
1
+ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.aws.secrets_manager import (
2
+ SecretsManager
3
+ )
4
+ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.azure.azure_devops import (
5
+ AzureDevops
6
+ )
7
+ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.defect_dojo.defect_dojo import (
8
+ DefectDojoPlatform
9
+ )
10
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.driven_adapters.sonarqube.sonarqube_report import(
11
+ SonarAdapter
12
+ )
13
+ from devsecops_engine_tools.engine_core.src.infrastructure.driven_adapters.aws.s3_manager import (
14
+ S3Manager,
15
+ )
16
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.entry_points.entry_point_report_sonar import (
17
+ init_report_sonar
18
+ )
19
+ import sys
20
+ import argparse
21
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
22
+ from devsecops_engine_tools.engine_utilities import settings
23
+
24
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
25
+
26
+ def get_inputs_from_cli(args):
27
+ parser = argparse.ArgumentParser()
28
+ parser.add_argument(
29
+ "-rcf",
30
+ "--remote_config_repo",
31
+ type=str,
32
+ required=True,
33
+ help="Name of Config Repo",
34
+ )
35
+ parser.add_argument(
36
+ "--use_secrets_manager",
37
+ choices=["true", "false"],
38
+ type=str,
39
+ required=True,
40
+ help="Use Secrets Manager to get the tokens",
41
+ )
42
+ parser.add_argument(
43
+ "--send_metrics",
44
+ choices=["true", "false"],
45
+ type=str,
46
+ required=False,
47
+ help="Enable or Disable the send metrics to the driven adapter metrics",
48
+ )
49
+ parser.add_argument(
50
+ "--sonar_url",
51
+ required=False,
52
+ help="Url to access sonar API",
53
+ )
54
+ parser.add_argument(
55
+ "--token_cmdb",
56
+ required=False,
57
+ help="Token to connect to the CMDB"
58
+ )
59
+ parser.add_argument(
60
+ "--token_vulnerability_management",
61
+ required=False,
62
+ help="Token to connect to the Vulnerability Management",
63
+ )
64
+ parser.add_argument(
65
+ "--token_sonar",
66
+ required=False,
67
+ help="Token to access sonar server",
68
+ )
69
+
70
+ args = parser.parse_args()
71
+ return {
72
+ "remote_config_repo": args.remote_config_repo,
73
+ "use_secrets_manager": args.use_secrets_manager,
74
+ "send_metrics": args.send_metrics,
75
+ "sonar_url": args.sonar_url,
76
+ "token_cmdb": args.token_cmdb,
77
+ "token_vulnerability_management": args.token_vulnerability_management,
78
+ "token_sonar": args.token_sonar,
79
+ }
80
+
81
+ def runner_report_sonar():
82
+ try:
83
+ vulnerability_management_gateway = DefectDojoPlatform()
84
+ secrets_manager_gateway = SecretsManager()
85
+ devops_platform_gateway = AzureDevops()
86
+ sonar_gateway = SonarAdapter()
87
+ metrics_manager_gateway = S3Manager()
88
+ args = get_inputs_from_cli(sys.argv[1:])
89
+
90
+ init_report_sonar(
91
+ vulnerability_management_gateway=vulnerability_management_gateway,
92
+ secrets_manager_gateway=secrets_manager_gateway,
93
+ devops_platform_gateway=devops_platform_gateway,
94
+ sonar_gateway=sonar_gateway,
95
+ metrics_manager_gateway=metrics_manager_gateway,
96
+ args=args,
97
+ )
98
+
99
+ except Exception as e:
100
+ logger.error("Error report_sonar: {0} ".format(str(e)))
101
+ print(
102
+ devops_platform_gateway.message(
103
+ "error", "Error report_sonar: {0} ".format(str(e))
104
+ )
105
+ )
106
+ print(devops_platform_gateway.result_pipeline("failed"))
107
+
108
+
109
+ if __name__ == "__main__":
110
+ runner_report_sonar()
@@ -0,0 +1,63 @@
1
+ from abc import (
2
+ ABCMeta,
3
+ abstractmethod
4
+ )
5
+
6
+ class SonarGateway(metaclass=ABCMeta):
7
+ @abstractmethod
8
+ def get_project_keys(
9
+ self,
10
+ pipeline_name: str
11
+ ):
12
+ "get sonar project keys"
13
+
14
+ @abstractmethod
15
+ def parse_project_key(
16
+ self,
17
+ file_path: str
18
+ ):
19
+ "find project key in metadata file"
20
+
21
+ @abstractmethod
22
+ def create_task_report_from_string(
23
+ self,
24
+ file_content: str
25
+ ):
26
+ "make dict from metadata file"
27
+
28
+ @abstractmethod
29
+ def filter_by_sonarqube_tag(
30
+ self,
31
+ findings: list
32
+ ):
33
+ "search for sonar findings"
34
+
35
+ @abstractmethod
36
+ def change_finding_status(
37
+ self,
38
+ sonar_url: str,
39
+ sonar_token: str,
40
+ endpoint: str,
41
+ data: dict,
42
+ finding_type: str
43
+ ):
44
+ "use API to change vulnerabilities state in sonar"
45
+
46
+ @abstractmethod
47
+ def get_findings(
48
+ self,
49
+ sonar_url: str,
50
+ sonar_token: str,
51
+ endpoint: str,
52
+ params: dict,
53
+ finding_type: str
54
+ ):
55
+ "use API to get project findings in sonar"
56
+
57
+ @abstractmethod
58
+ def search_finding_by_id(
59
+ self,
60
+ findings: list,
61
+ finding_id: str
62
+ ):
63
+ "search a finding by id"
@@ -0,0 +1,194 @@
1
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.infrastructure.helpers.utils import (
2
+ set_repository
3
+ )
4
+ from devsecops_engine_tools.engine_core.src.infrastructure.helpers.util import (
5
+ define_env
6
+ )
7
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.vulnerability_management_gateway import (
8
+ VulnerabilityManagementGateway
9
+ )
10
+ from devsecops_engine_tools.engine_core.src.domain.model.vulnerability_management import (
11
+ VulnerabilityManagement
12
+ )
13
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.secrets_manager_gateway import (
14
+ SecretsManagerGateway
15
+ )
16
+ from devsecops_engine_tools.engine_core.src.domain.model.gateway.devops_platform_gateway import (
17
+ DevopsPlatformGateway
18
+ )
19
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.model.gateways.sonar_gateway import (
20
+ SonarGateway
21
+ )
22
+ from devsecops_engine_tools.engine_core.src.domain.model.input_core import (
23
+ InputCore
24
+ )
25
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
26
+ from devsecops_engine_tools.engine_utilities import settings
27
+
28
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
29
+
30
+ class ReportSonar:
31
+ def __init__(
32
+ self,
33
+ vulnerability_management_gateway: VulnerabilityManagementGateway,
34
+ secrets_manager_gateway: SecretsManagerGateway,
35
+ devops_platform_gateway: DevopsPlatformGateway,
36
+ sonar_gateway: SonarGateway
37
+ ):
38
+ self.vulnerability_management_gateway = vulnerability_management_gateway
39
+ self.secrets_manager_gateway = secrets_manager_gateway
40
+ self.devops_platform_gateway = devops_platform_gateway
41
+ self.sonar_gateway = sonar_gateway
42
+
43
+ def process(self, args):
44
+ pipeline_name = self.devops_platform_gateway.get_variable("pipeline_name")
45
+ branch = self.devops_platform_gateway.get_variable("branch_name")
46
+ input_core = InputCore(
47
+ [],
48
+ {},
49
+ "",
50
+ "",
51
+ "",
52
+ self.devops_platform_gateway.get_variable("stage").capitalize(),
53
+ )
54
+
55
+ compact_remote_config_url = self.devops_platform_gateway.get_base_compact_remote_config_url(args["remote_config_repo"])
56
+ source_code_management_uri = set_repository(
57
+ pipeline_name,
58
+ self.devops_platform_gateway.get_source_code_management_uri()
59
+ )
60
+ config_tool = self.devops_platform_gateway.get_remote_config(
61
+ args["remote_config_repo"],
62
+ "/engine_core/ConfigTool.json"
63
+ )
64
+ environment = define_env(None, branch)
65
+
66
+ if args["use_secrets_manager"] == "true":
67
+ secret = self.secrets_manager_gateway.get_secret(config_tool)
68
+ else:
69
+ secret = args
70
+
71
+ report_config_tool = self.devops_platform_gateway.get_remote_config(
72
+ args["remote_config_repo"],
73
+ "/report_sonar/ConfigTool.json"
74
+ )
75
+
76
+ get_components = report_config_tool["PIPELINE_COMPONENTS"].get(pipeline_name)
77
+ if get_components:
78
+ project_keys = [f"{pipeline_name}_{component}" for component in get_components]
79
+ print(f"Multiple project keys detected: {project_keys}")
80
+ logger.info(f"Multiple project keys detected: {project_keys}")
81
+ else:
82
+ project_keys = self.sonar_gateway.get_project_keys(pipeline_name)
83
+
84
+ args["tool"] = "sonarqube"
85
+ vulnerability_manager = VulnerabilityManagement(
86
+ scan_type = "SONARQUBE",
87
+ input_core = input_core,
88
+ dict_args = args,
89
+ secret_tool = self.secrets_manager_gateway,
90
+ config_tool = config_tool,
91
+ source_code_management_uri = source_code_management_uri,
92
+ base_compact_remote_config_url = compact_remote_config_url,
93
+ access_token = self.devops_platform_gateway.get_variable("access_token"),
94
+ version = self.devops_platform_gateway.get_variable("build_execution_id"),
95
+ build_id = self.devops_platform_gateway.get_variable("build_id"),
96
+ branch_tag = branch,
97
+ commit_hash = self.devops_platform_gateway.get_variable("commit_hash"),
98
+ environment = environment
99
+ )
100
+
101
+ for project_key in project_keys:
102
+ try:
103
+ findings = self.vulnerability_management_gateway.get_all(
104
+ service=project_key,
105
+ dict_args=args,
106
+ secret_tool=self.secrets_manager_gateway,
107
+ config_tool=config_tool
108
+ )[0]
109
+ filtered_findings = self.sonar_gateway.filter_by_sonarqube_tag(findings)
110
+
111
+ sonar_vulnerabilities = self.sonar_gateway.get_findings(
112
+ args["sonar_url"],
113
+ secret["token_sonar"],
114
+ "/api/issues/search",
115
+ {
116
+ "componentKeys": project_key,
117
+ "types": "VULNERABILITY",
118
+ "ps": 500,
119
+ "p": 1,
120
+ "s": "CREATION_DATE",
121
+ "asc": "false"
122
+ },
123
+ "issues"
124
+ )
125
+ sonar_hotspots = self.sonar_gateway.get_findings(
126
+ args["sonar_url"],
127
+ secret["token_sonar"],
128
+ "/api/hotspots/search",
129
+ {
130
+ "projectKey": project_key,
131
+ "ps": 100,
132
+ "p": 1,
133
+ },
134
+ "hotspots"
135
+ )
136
+
137
+ sonar_findings = sonar_vulnerabilities + sonar_hotspots
138
+
139
+ for finding in filtered_findings:
140
+ related_sonar_finding = self.sonar_gateway.search_finding_by_id(
141
+ sonar_findings,
142
+ finding.unique_id_from_tool
143
+ )
144
+ status = None
145
+ if related_sonar_finding:
146
+ if related_sonar_finding.get("type") == "VULNERABILITY":
147
+ if finding.active and related_sonar_finding["status"] == "RESOLVED": status = "reopen"
148
+ elif related_sonar_finding["status"] != "RESOLVED":
149
+ if finding.false_p: status = "falsepositive"
150
+ elif finding.risk_accepted: status = "close"
151
+ elif finding.risk_accepted or finding.out_of_scope: status = "wontfix"
152
+ if status:
153
+ self.sonar_gateway.change_finding_status(
154
+ args["sonar_url"],
155
+ secret["token_sonar"],
156
+ "/api/issues/do_transition",
157
+ {
158
+ "issue": related_sonar_finding["key"],
159
+ "transition": status
160
+ },
161
+ "issue"
162
+ )
163
+ else:
164
+ resolution = None
165
+ if finding.active and related_sonar_finding["status"] == "REVIEWED": status = "TO_REVIEW"
166
+ elif related_sonar_finding["status"] == "TO_REVIEW":
167
+ if finding.false_p: resolution = "SAFE"
168
+ elif finding.risk_accepted or finding.out_of_scope: resolution = "ACKNOWLEDGED"
169
+ if resolution: status = "REVIEWED"
170
+ if status:
171
+ data = {
172
+ "hotspot": related_sonar_finding["key"],
173
+ "status": status,
174
+ "resolution": resolution
175
+ }
176
+ if not resolution: data.pop("resolution")
177
+ self.sonar_gateway.change_finding_status(
178
+ args["sonar_url"],
179
+ secret["token_sonar"],
180
+ "/api/hotspots/change_status",
181
+ data,
182
+ "hotspot"
183
+ )
184
+
185
+ except Exception as e:
186
+ logger.warning(f"It was not possible to synchronize Sonar and Vulnerability Manager: {e}")
187
+
188
+ input_core.scope_pipeline = project_key
189
+ self.vulnerability_management_gateway.send_vulnerability_management(
190
+ vulnerability_management=vulnerability_manager
191
+ )
192
+
193
+ input_core.scope_pipeline = pipeline_name
194
+ return input_core
@@ -0,0 +1,112 @@
1
+ from devsecops_engine_tools.engine_utilities.utils.utils import (
2
+ Utils
3
+ )
4
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.model.gateways.sonar_gateway import (
5
+ SonarGateway
6
+ )
7
+ import os
8
+ import re
9
+ import requests
10
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
11
+ from devsecops_engine_tools.engine_utilities import settings
12
+
13
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
14
+
15
+ class SonarAdapter(SonarGateway):
16
+ def get_project_keys(self, pipeline_name):
17
+ project_keys = [pipeline_name]
18
+ sonar_scanner_params = os.getenv("SONARQUBE_SCANNER_PARAMS", "")
19
+ pattern = r'"sonar\.scanner\.metadataFilePath":"(.*?)"'
20
+ match_result = re.search(pattern, sonar_scanner_params)
21
+
22
+ if match_result and match_result.group(1):
23
+ metadata_file_path = match_result.group(1)
24
+ project_key_found = self.parse_project_key(metadata_file_path)
25
+
26
+ if project_key_found:
27
+ print(f"ProjectKey scanner params: {project_key_found}")
28
+ project_keys = [project_key_found]
29
+
30
+ return project_keys
31
+
32
+ def parse_project_key(self, file_path):
33
+ try:
34
+ with open(file_path, 'r', encoding='utf-8') as f:
35
+ file_content = f.read()
36
+ print(f"[SQ] Parse Task report file:\n{file_content}")
37
+ if not file_content or len(file_content) <= 0:
38
+ print("[SQ] Error reading file")
39
+ logger.warning("[SQ] Error reading file")
40
+ return None
41
+ try:
42
+ settings = self.create_task_report_from_string(file_content)
43
+ return settings.get("projectKey")
44
+ except Exception as err:
45
+ print(f"[SQ] Parse Task report error: {err}")
46
+ logger.warning(f"[SQ] Parse Task report error: {err}")
47
+ return None
48
+ except Exception as err:
49
+ logger.warning(f"[SQ] Error reading file: {str(err)}")
50
+ return None
51
+
52
+ def create_task_report_from_string(self, file_content):
53
+ lines = file_content.replace('\r\n', '\n').split('\n')
54
+ settings = {}
55
+ for line in lines:
56
+ split_line = line.split('=')
57
+ if len(split_line) > 1:
58
+ settings[split_line[0]] = '='.join(split_line[1:])
59
+ return settings
60
+
61
+ def filter_by_sonarqube_tag(self, findings):
62
+ return [finding for finding in findings if "sonarqube" in finding.tags]
63
+
64
+ def change_finding_status(self, sonar_url, sonar_token, endpoint, data, finding_type):
65
+ try:
66
+ response = requests.post(
67
+ f"{sonar_url}{endpoint}",
68
+ headers={
69
+ "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
70
+ },
71
+ data=data
72
+ )
73
+ response.raise_for_status()
74
+
75
+ if finding_type == "issue":
76
+ info = data["transition"]
77
+ else:
78
+ resolution_info = ""
79
+ if data.get("resolution"): resolution_info = f" ({data['resolution']})"
80
+
81
+ info = f"{data['status']}{resolution_info}"
82
+
83
+ print(f"The state of the {finding_type} {data[finding_type]} was changed to {info}.")
84
+ except Exception as e:
85
+ logger.warning(f"Unable to change the status of {finding_type} {data[finding_type]}. Error: {e}")
86
+ pass
87
+
88
+ def get_findings(self, sonar_url, sonar_token, endpoint, params, finding_type):
89
+ findings = []
90
+ try:
91
+ while True:
92
+ response = requests.get(
93
+ f"{sonar_url}{endpoint}",
94
+ headers={
95
+ "Authorization": f"Basic {Utils().encode_token_to_base64(sonar_token)}"
96
+ },
97
+ params=params
98
+ )
99
+ response.raise_for_status()
100
+ data = response.json()
101
+
102
+ findings.extend(data[finding_type])
103
+ if len(data[finding_type]) < params["ps"]: break
104
+ params["p"] = params["p"] + 1
105
+
106
+ return findings
107
+ except Exception as e:
108
+ logger.warning(f"It was not possible to obtain the {finding_type}: {str(e)}")
109
+ return []
110
+
111
+ def search_finding_by_id(self, issues, issue_id):
112
+ return next((issue for issue in issues if issue["key"] in issue_id), None)
@@ -0,0 +1,37 @@
1
+ from devsecops_engine_tools.engine_utilities.sonarqube.src.domain.usecases.report_sonar import (
2
+ ReportSonar
3
+ )
4
+ from devsecops_engine_tools.engine_utilities.utils.printers import (
5
+ Printers,
6
+ )
7
+ from devsecops_engine_tools.engine_core.src.domain.usecases.metrics_manager import (
8
+ MetricsManager,
9
+ )
10
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
11
+ from devsecops_engine_tools.engine_utilities import settings
12
+
13
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
14
+
15
+ def init_report_sonar(vulnerability_management_gateway, secrets_manager_gateway, devops_platform_gateway, sonar_gateway, metrics_manager_gateway, args):
16
+ config_tool = devops_platform_gateway.get_remote_config(
17
+ args["remote_config_repo"], "/engine_core/ConfigTool.json"
18
+ )
19
+ Printers.print_logo_tool(config_tool["BANNER"])
20
+
21
+ if config_tool["REPORT_SONAR"]["ENABLED"] == "true":
22
+ input_core = ReportSonar(
23
+ vulnerability_management_gateway,
24
+ secrets_manager_gateway,
25
+ devops_platform_gateway,
26
+ sonar_gateway
27
+ ).process(args)
28
+
29
+ if args["send_metrics"] == "true":
30
+ MetricsManager(devops_platform_gateway, metrics_manager_gateway).process(
31
+ config_tool, input_core, {"tool": "report_sonar"}, ""
32
+ )
33
+ else:
34
+ print(
35
+ devops_platform_gateway.message(
36
+ "warning", "DevSecOps Engine Tool - {0} in maintenance...".format("report_sonar")),
37
+ )
@@ -0,0 +1,8 @@
1
+ import re
2
+
3
+ def set_repository(pipeline_name, source_code_management):
4
+ if re.search('_MR_', pipeline_name) is None:
5
+ return source_code_management
6
+ else:
7
+ splittedPipeline = pipeline_name.split('_MR_')
8
+ return source_code_management + '?path=/' + splittedPipeline[1]
@@ -1,8 +1,13 @@
1
1
  import zipfile
2
-
2
+ import base64
3
3
 
4
4
  class Utils:
5
5
 
6
6
  def unzip_file(self, zip_file_path, extract_path):
7
7
  with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
8
8
  zip_ref.extractall(extract_path)
9
+
10
+ def encode_token_to_base64(self, token):
11
+ token_bytes = f"{token}:".encode("utf-8")
12
+ base64_token = base64.b64encode(token_bytes).decode("utf-8")
13
+ return base64_token
@@ -1 +1 @@
1
- version = '1.14.6'
1
+ version = '1.15.0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.14.6
3
+ Version: 1.15.0
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -1,5 +1,5 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=cfoSMAQ3HaafznX-0T8Aha9XhybWUWmETG3FCigdLBw,19
2
+ devsecops_engine_tools/version.py,sha256=qPrSCN79LDGQE1nW80PFtFMdiMa_3P6jqc7EO1X72dg,19
3
3
  devsecops_engine_tools/engine_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  devsecops_engine_tools/engine_core/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  devsecops_engine_tools/engine_core/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -14,7 +14,7 @@ devsecops_engine_tools/engine_core/src/domain/model/finding.py,sha256=MntDksQuPt
14
14
  devsecops_engine_tools/engine_core/src/domain/model/input_core.py,sha256=hc1WMzCwsGxnrlvvk84S5iNYJRDQWbaQP9MwR3N7tVM,422
15
15
  devsecops_engine_tools/engine_core/src/domain/model/level_compliance.py,sha256=ntn_UWqHc6sT5g_LozBdjdewTQxFsp7Kt8M0xqw-k_o,98
16
16
  devsecops_engine_tools/engine_core/src/domain/model/level_vulnerability.py,sha256=0sySEnFNkS2Y8uF5GUVAYehXw-i2OglUClkVobnSTPc,257
17
- devsecops_engine_tools/engine_core/src/domain/model/report.py,sha256=SGo9bxNGVO5ymjjuFlG3Tz1X9uh2JawNaQYyHHN_NL8,1640
17
+ devsecops_engine_tools/engine_core/src/domain/model/report.py,sha256=Lsp7CuAdhW8kJkbP6VyHJmFb5rPhxY_u_mEOLHzbD8Y,1772
18
18
  devsecops_engine_tools/engine_core/src/domain/model/threshold.py,sha256=TCBECuvoC3-9g8vg3iKWGIixssNecP0iUaZ9Qzv0n7w,596
19
19
  devsecops_engine_tools/engine_core/src/domain/model/vulnerability_management.py,sha256=5RcMHpeqznrTOpkjLuqekA_Bqf2Qr-w6OZ5Eoi3b-bs,465
20
20
  devsecops_engine_tools/engine_core/src/domain/model/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -22,7 +22,7 @@ devsecops_engine_tools/engine_core/src/domain/model/gateway/devops_platform_gate
22
22
  devsecops_engine_tools/engine_core/src/domain/model/gateway/metrics_manager_gateway.py,sha256=u_ivbmCyymw0Je7gRFg0uD9iDmZfTbteH5UwcgP0JAs,191
23
23
  devsecops_engine_tools/engine_core/src/domain/model/gateway/printer_table_gateway.py,sha256=ROBsh7Lyu62a5RqZ4KgGQcwrBzbHRwxAJ9Rj3LoupQc,602
24
24
  devsecops_engine_tools/engine_core/src/domain/model/gateway/secrets_manager_gateway.py,sha256=CTwUIvUWF0NSSzdCqASUFst6KUysW53NV9eatjLGdl8,170
25
- devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py,sha256=dO3BAPovSg9Nz0RJl55yty10Qjtbz5FM3O25DUK_5Ic,1020
25
+ devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_management_gateway.py,sha256=dT2YDlWJ4Zvny_5uCTtxBojw4i77UOgGbs8p2jlRo74,1137
26
26
  devsecops_engine_tools/engine_core/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  devsecops_engine_tools/engine_core/src/domain/usecases/break_build.py,sha256=0JK4U5LGxzrLVZOw68j1PMxmLTDPru7Kts_-RtAG0jA,15965
28
28
  devsecops_engine_tools/engine_core/src/domain/usecases/handle_risk.py,sha256=1vctNN5aSPGsSgrldPiYg2Fq86q6Z9DzFdazjWAm2Do,8133
@@ -36,7 +36,7 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secret
36
36
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=blI4ZrquRE4y6DJ7N2YRx1nL0wrAXvdpx0fLSUf5qwA,4831
38
38
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=VyL_HpOYbr0dCXGus_Y0Ij5OoVFU3oDCsGjrlZ1hJ6k,17904
39
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=XKM107OQZ75sb1oeOqJKintyRAR9q8k1fkoe2sm7nBo,18190
40
40
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=pxlgjhX4-Dssn-XHKK8AdCOj6Ry6VcQtoDf5q8CxTks,3731
42
42
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -276,6 +276,24 @@ devsecops_engine_tools/engine_utilities/github/models/__init__.py,sha256=47DEQpj
276
276
  devsecops_engine_tools/engine_utilities/input_validations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
277
  devsecops_engine_tools/engine_utilities/input_validations/env_utils.py,sha256=nHp9YIuG1k-IvxssQslrE9ny62juJMovmBTzcM7PPk0,258
278
278
  devsecops_engine_tools/engine_utilities/input_validations/validate_input_with_regex_letters_number_and_only.py,sha256=uIevSfVC2Qyzc4bqR13Z7_JNr5JyiqwYYxORYW33F1s,255
279
+ devsecops_engine_tools/engine_utilities/sonarqube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
280
+ devsecops_engine_tools/engine_utilities/sonarqube/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
281
+ devsecops_engine_tools/engine_utilities/sonarqube/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
+ devsecops_engine_tools/engine_utilities/sonarqube/src/applications/runner_report_sonar.py,sha256=OdCw5wXBO9Qd6tzsHdoa_V4xt_n2cfEk4RRsl3zVIZc,3649
283
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
284
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
285
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/model/gateways/sonar_gateway.py,sha256=PCrGq7NOINAFPvmX-5V5191MGhahsnQeWXUB1-xL4Xw,1279
287
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
288
+ devsecops_engine_tools/engine_utilities/sonarqube/src/domain/usecases/report_sonar.py,sha256=Ro22sTPYKK2DYIxDEAIMUb6evHWIKPQi8ujcG6AzrWM,8828
289
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
291
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/driven_adapters/sonarqube/sonarqube_report.py,sha256=eKzxONP3pP4d2MIknC5sGVuxcHzgelt5D0Kun88WBMo,4514
293
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
294
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/entry_points/entry_point_report_sonar.py,sha256=uqHo00PCaDq7H4sce1tVKRglYy0dGQMWe9z52imVWhM,1520
295
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
+ devsecops_engine_tools/engine_utilities/sonarqube/src/infrastructure/helpers/utils.py,sha256=SGOWrkzQrvOt9bRhhSfgiMzj1695e1W0B9ox9C1ihQI,294
279
297
  devsecops_engine_tools/engine_utilities/ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
280
298
  devsecops_engine_tools/engine_utilities/ssh/managment_private_key.py,sha256=Vvrro2e_YyvtKY9WzPUVOFTd-fiibohcG6wWHjLHAWg,2369
281
299
  devsecops_engine_tools/engine_utilities/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -286,9 +304,9 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
286
304
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
287
305
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
288
306
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
289
- devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=esLnDBxP9MQBvV8noVohTrdWSVuljTKRpZgrn2kaD_c,192
290
- devsecops_engine_tools-1.14.6.dist-info/METADATA,sha256=vctmV-cu7NpZnWIq-d5XTnMy1cLuasXWqz6J8oJt2Jc,10854
291
- devsecops_engine_tools-1.14.6.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
292
- devsecops_engine_tools-1.14.6.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
293
- devsecops_engine_tools-1.14.6.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
294
- devsecops_engine_tools-1.14.6.dist-info/RECORD,,
307
+ devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=r_mng-OVWeqQyy6yIFsCeJrvH81VUPI3o1zdJO0JS0I,397
308
+ devsecops_engine_tools-1.15.0.dist-info/METADATA,sha256=hK8nqnmEBOpmgVpjp4ftTCilioBG1NBqamqKbkGduBw,10854
309
+ devsecops_engine_tools-1.15.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
310
+ devsecops_engine_tools-1.15.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
311
+ devsecops_engine_tools-1.15.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
312
+ devsecops_engine_tools-1.15.0.dist-info/RECORD,,
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ devsecops-engine-tools = devsecops_engine_tools.engine_core.src.applications.runner_engine_core:application_core
3
+ devsecops-engine-tools.report-sonar = devsecops_engine_tools.engine_utilities.sonarqube.src.applications.runner_report_sonar:runner_report_sonar
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- devsecops-engine-tools = devsecops_engine_tools.engine_core.src.applications.runner_engine_core:application_core