devsecops-engine-tools 1.8.11__py3-none-any.whl → 1.8.13__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.
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/git_gateway.py +2 -6
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py +1 -2
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py +2 -8
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/git_run.py +17 -51
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py +3 -6
- devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/cmdb.py +11 -10
- devsecops_engine_tools/version.py +1 -1
- {devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/METADATA +1 -1
- {devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/RECORD +12 -12
- {devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/WHEEL +0 -0
- {devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/entry_points.txt +0 -0
- {devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/top_level.txt +0 -0
|
@@ -5,11 +5,7 @@ class GitGateway(metaclass=ABCMeta):
|
|
|
5
5
|
@abstractmethod
|
|
6
6
|
def get_files_pull_request(self, sys_working_dir: str,
|
|
7
7
|
target_branch: str,
|
|
8
|
-
config_target_branch: dict,
|
|
9
8
|
source_branch: str,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
team_project: str,
|
|
13
|
-
repository_name: str,
|
|
14
|
-
repository_provider: str) -> dict:
|
|
9
|
+
message_info_engine_secret: str
|
|
10
|
+
) -> dict:
|
|
15
11
|
"get_files_pull_request"
|
|
@@ -36,20 +36,14 @@ class SecretScan:
|
|
|
36
36
|
files_pullrequest = self.git_gateway.get_files_pull_request(
|
|
37
37
|
self.devops_platform_gateway.get_variable("path_directory"),
|
|
38
38
|
self.devops_platform_gateway.get_variable("target_branch"),
|
|
39
|
-
config_tool.target_branches,
|
|
40
39
|
self.devops_platform_gateway.get_variable("source_branch"),
|
|
41
|
-
|
|
42
|
-
self.devops_platform_gateway.get_variable("organization"),
|
|
43
|
-
self.devops_platform_gateway.get_variable("project_name"),
|
|
44
|
-
self.devops_platform_gateway.get_variable("repository"),
|
|
45
|
-
self.devops_platform_gateway.get_variable("repository_provider"))
|
|
40
|
+
config_tool.message_info_engine_secret)
|
|
46
41
|
findings, file_path_findings = self.tool_gateway.run_tool_secret_scan(
|
|
47
42
|
files_pullrequest,
|
|
48
43
|
config_tool.exclude_path,
|
|
49
44
|
self.devops_platform_gateway.get_variable("os"),
|
|
50
45
|
self.devops_platform_gateway.get_variable("path_directory"),
|
|
51
|
-
config_tool.number_threads
|
|
52
|
-
self.devops_platform_gateway.get_variable("repository")
|
|
46
|
+
config_tool.number_threads
|
|
53
47
|
)
|
|
54
48
|
finding_list = self.tool_deserialize.get_list_vulnerability(
|
|
55
49
|
findings,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
import os
|
|
3
3
|
import subprocess
|
|
4
|
-
from urllib.parse import quote
|
|
5
4
|
from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.gateway.git_gateway import GitGateway
|
|
6
5
|
|
|
7
6
|
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
@@ -15,61 +14,28 @@ class GitRun(GitGateway):
|
|
|
15
14
|
def get_files_pull_request(self,
|
|
16
15
|
sys_working_dir,
|
|
17
16
|
target_branch,
|
|
18
|
-
config_target_branch,
|
|
19
17
|
source_branch,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
team_project,
|
|
23
|
-
repository_name,
|
|
24
|
-
repository_provider):
|
|
18
|
+
message_info_engine_secret
|
|
19
|
+
):
|
|
25
20
|
try:
|
|
26
|
-
if repository_provider == 'GitHub' or target_branch not in config_target_branch:
|
|
27
|
-
os.chdir(sys_working_dir)
|
|
28
|
-
subprocess.run(['git', 'checkout', '-b', source_branch, f'origin/{source_branch}'], capture_output=True, text=True)
|
|
29
|
-
env = os.environ.copy()
|
|
30
|
-
env["GIT_COMMITTER_NAME"] = "Your Name"
|
|
31
|
-
env["GIT_COMMITTER_EMAIL"] = "your.email@example.com"
|
|
32
|
-
env["GIT_AUTHOR_NAME"] = "Your Name"
|
|
33
|
-
env["GIT_AUTHOR_EMAIL"] = "your.email@example.com"
|
|
34
|
-
command = ["git", "rebase", f"origin/{target_branch}", "-X", "theirs"]
|
|
35
|
-
subprocess.run(command, env=env, capture_output=True, text=True)
|
|
36
|
-
|
|
37
|
-
diff = subprocess.run(['git', 'diff', f'origin/{target_branch}..{source_branch}', '--name-only'], capture_output=True, text=True)
|
|
38
|
-
if diff.returncode == 0:
|
|
39
|
-
diff_files = diff.stdout.strip().split("\n")
|
|
40
|
-
print("Pull Requests Associated Files:",diff_files)
|
|
41
|
-
return diff_files
|
|
42
|
-
return []
|
|
43
|
-
base_compact_url = (
|
|
44
|
-
f"https://{collection_uri.rstrip('/').split('/')[-1].replace('.visualstudio.com','')}"
|
|
45
|
-
f".visualstudio.com/{quote(team_project)}/_git/"
|
|
46
|
-
f"{repository_name}"
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
url_without_https = base_compact_url.replace("https://", "")
|
|
50
|
-
url_with_token = f"https://x-access-token:{access_token}@{url_without_https}"
|
|
51
|
-
|
|
52
|
-
path_new_folder = sys_working_dir + '/' + repository_name
|
|
53
|
-
|
|
54
|
-
if os.path.exists(path_new_folder):
|
|
55
|
-
logger.warning(f"Error: folder {repository_name} already exist")
|
|
56
|
-
return []
|
|
57
|
-
os.makedirs(path_new_folder)
|
|
58
|
-
os.chdir(sys_working_dir)
|
|
59
|
-
subprocess.run(["git", "clone", "--branch", target_branch, url_with_token, path_new_folder], capture_output=True, text=True)
|
|
60
|
-
os.chdir(path_new_folder)
|
|
61
|
-
|
|
62
21
|
source_branch = source_branch.replace("refs/heads/", "")
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
22
|
+
os.chdir(sys_working_dir)
|
|
23
|
+
subprocess.run(['git', 'checkout', '-b', source_branch, f'origin/{source_branch}'], text=True, capture_output=True, check=True)
|
|
24
|
+
env = os.environ.copy()
|
|
25
|
+
env["GIT_COMMITTER_NAME"] = "Your Name"
|
|
26
|
+
env["GIT_COMMITTER_EMAIL"] = "your.email@example.com"
|
|
27
|
+
env["GIT_AUTHOR_NAME"] = "Your Name"
|
|
28
|
+
env["GIT_AUTHOR_EMAIL"] = "your.email@example.com"
|
|
29
|
+
command = ["git", "rebase", f"origin/{target_branch}", "-X", "theirs"]
|
|
30
|
+
subprocess.run(command, env=env, text=True, capture_output=True)
|
|
66
31
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
print("Pull Requests Associated Files:",len(diff_files))
|
|
32
|
+
diff = subprocess.run(['git', 'diff', f'origin/{target_branch}..{source_branch}', '--name-only'], capture_output=True, text=True)
|
|
33
|
+
if diff.returncode == 0:
|
|
34
|
+
diff_files = diff.stdout.strip().split("\n")
|
|
35
|
+
print("Pull Requests Associated Files:",diff_files)
|
|
72
36
|
return diff_files
|
|
37
|
+
except subprocess.CalledProcessError as e:
|
|
38
|
+
raise Exception(f"Error in pipeline configuration, {message_info_engine_secret}") from e
|
|
73
39
|
except Exception as e:
|
|
74
40
|
logger.warning(f"Error getting files PullRequest: {e}")
|
|
75
41
|
return []
|
|
@@ -43,8 +43,7 @@ class TrufflehogRun(ToolGateway):
|
|
|
43
43
|
exclude_paths,
|
|
44
44
|
agent_os,
|
|
45
45
|
agent_work_folder,
|
|
46
|
-
num_threads
|
|
47
|
-
repository_name,
|
|
46
|
+
num_threads
|
|
48
47
|
):
|
|
49
48
|
trufflehog_command = "trufflehog"
|
|
50
49
|
if "Windows" in agent_os:
|
|
@@ -60,7 +59,6 @@ class TrufflehogRun(ToolGateway):
|
|
|
60
59
|
[agent_work_folder] * len(include_paths),
|
|
61
60
|
[exclude_path] * len(include_paths),
|
|
62
61
|
include_paths,
|
|
63
|
-
[repository_name] * len(include_paths),
|
|
64
62
|
)
|
|
65
63
|
findings, file_findings = self.create_file(self.decode_output(results), agent_work_folder)
|
|
66
64
|
return findings, file_findings
|
|
@@ -88,10 +86,9 @@ class TrufflehogRun(ToolGateway):
|
|
|
88
86
|
trufflehog_command,
|
|
89
87
|
agent_work_folder,
|
|
90
88
|
exclude_path,
|
|
91
|
-
include_path
|
|
92
|
-
repository_name,
|
|
89
|
+
include_path
|
|
93
90
|
):
|
|
94
|
-
command = f"{trufflehog_command} filesystem {agent_work_folder
|
|
91
|
+
command = f"{trufflehog_command} filesystem {agent_work_folder} --include-paths {include_path} --exclude-paths {exclude_path} --no-verification --json"
|
|
95
92
|
result = subprocess.run(command, capture_output=True, shell=True, text=True)
|
|
96
93
|
return result.stdout.strip()
|
|
97
94
|
|
|
@@ -21,23 +21,24 @@ class CmdbRestConsumer:
|
|
|
21
21
|
data = json.dumps({"codapp": request.code_app})
|
|
22
22
|
headers = {"tokenkey": self.__token, "Content-Type": "application/json"}
|
|
23
23
|
logger.info("Search info of name product")
|
|
24
|
+
cmdb_object = Cmdb(
|
|
25
|
+
product_type_name="ORPHAN_PRODUCT_TYPE",
|
|
26
|
+
product_name=f"{request.code_app}_Product",
|
|
27
|
+
tag_product="ORPHAN",
|
|
28
|
+
product_description="Orphan Product Description",
|
|
29
|
+
codigo_app=str(request.code_app),
|
|
30
|
+
)
|
|
24
31
|
try:
|
|
25
32
|
response = self.__session.post(self.__host, headers=headers, data=data, verify=VERIFY_CERTIFICATE)
|
|
26
33
|
if response.status_code != 200:
|
|
27
34
|
logger.error(response)
|
|
28
|
-
raise ApiError(response.
|
|
35
|
+
raise ApiError(f"Error querying cmdb: {response.reason}")
|
|
29
36
|
|
|
30
37
|
if response.json() == []:
|
|
31
38
|
e = f"Engagement: {request.code_app} not found"
|
|
32
39
|
logger.warning(e)
|
|
33
40
|
# Producto is Orphan
|
|
34
|
-
return
|
|
35
|
-
product_type_name="ORPHAN_PRODUCT_TYPE",
|
|
36
|
-
product_name=f"{request.code_app}_Product",
|
|
37
|
-
tag_product="ORPHAN",
|
|
38
|
-
product_description="Orphan Product Description",
|
|
39
|
-
codigo_app=str(request.code_app),
|
|
40
|
-
)
|
|
41
|
+
return cmdb_object
|
|
41
42
|
|
|
42
43
|
data = response.json()[-1]
|
|
43
44
|
data_map = self.mapping_cmdb(data)
|
|
@@ -45,11 +46,11 @@ class CmdbRestConsumer:
|
|
|
45
46
|
cmdb_object = Cmdb.from_dict(data_map)
|
|
46
47
|
except Exception as e:
|
|
47
48
|
logger.error(e)
|
|
48
|
-
|
|
49
|
+
return cmdb_object
|
|
49
50
|
return cmdb_object
|
|
50
51
|
|
|
51
52
|
def mapping_cmdb(self, data):
|
|
52
53
|
data_map = {}
|
|
53
54
|
for key, value in self.__mapping_cmdb.items():
|
|
54
55
|
data_map[key] = data[value] if value in data else ""
|
|
55
|
-
return data_map
|
|
56
|
+
return data_map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
version = '1.8.
|
|
1
|
+
version = '1.8.13'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
devsecops_engine_tools/version.py,sha256=
|
|
2
|
+
devsecops_engine_tools/version.py,sha256=S6HhgJQgheBBHlWAIeACo1IcPFltqmDNBAdPRB4ya-8,18
|
|
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
|
|
@@ -123,18 +123,18 @@ devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/DeserializeCon
|
|
|
123
123
|
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
124
124
|
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
125
125
|
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/gateway_deserealizator.py,sha256=4fYPengHW3K0uVP6wHgOiNu-gRb08m78E7QZayZ2LC4,441
|
|
126
|
-
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/git_gateway.py,sha256=
|
|
127
|
-
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py,sha256=
|
|
126
|
+
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/git_gateway.py,sha256=d6hT4AAyRCqckbEGKEzXRAgT8766tOyxAeUn0foJvpc,409
|
|
127
|
+
devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py,sha256=2kHgUus04M2kpFfVvwcRrhglN8JI3w3JfB-qjfJvoKk,542
|
|
128
128
|
devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
|
-
devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py,sha256=
|
|
129
|
+
devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py,sha256=I8YKSw5rsKimBukCC3eoN8TACwZFgD42okvYNeG115Y,3464
|
|
130
130
|
devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/set_input_core.py,sha256=k0LZd9PJpqEDns6DLYRGu9DzpRZeFsxAnowcjP5Rml4,2838
|
|
131
131
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
132
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
133
133
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
134
|
-
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/git_run.py,sha256=
|
|
134
|
+
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/git_cli/git_run.py,sha256=DzdBmwA2-3b5OBkjdOmiF9UcHwD8b7HJNboCdmSxJ7Q,1993
|
|
135
135
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
136
136
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_deserealizator.py,sha256=WpFFswOmP38cLvfZHCrPDiRtdwH86n1CqVNS3K4s6uA,1968
|
|
137
|
-
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=
|
|
137
|
+
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=1TvGYg65KX3Af-AxH73UNlUr0BnxmvFha0r3AZeqBYg,5210
|
|
138
138
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
139
|
devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/entry_point_tool.py,sha256=WJJVGqE0PJMoATi8ubTGsqyrx4KqEQluXCg9Hk-NiOw,982
|
|
140
140
|
devsecops_engine_tools/engine_sca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -228,7 +228,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding.py,
|
|
|
228
228
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=6Ik3_IUPgsvVQ3uXMV6nkxdT89-lVNQVdvVWzmZSxgE,6794
|
|
229
229
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
230
230
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
231
|
-
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/cmdb.py,sha256=
|
|
231
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/cmdb.py,sha256=mnd4380zxuuaK__1S4MbxfXXAiHhpsJSaHXuDu8wghM,2626
|
|
232
232
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/engagement.py,sha256=39qqmTxECRY5IoFvK_B_R0vfwfJwLbdhGt_pcdvdVIE,3571
|
|
233
233
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding.py,sha256=k-z2tg_NPKMni7rZgXMZa2-t8_8F35r8YtF1EcjMyDs,2355
|
|
234
234
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/import_scan.py,sha256=68Qd8o0oSxFG-3cRlX97BkX9muS6k64DGslGtX9sx6M,5897
|
|
@@ -256,8 +256,8 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
|
|
|
256
256
|
devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
|
|
257
257
|
devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
|
|
258
258
|
devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
|
|
259
|
-
devsecops_engine_tools-1.8.
|
|
260
|
-
devsecops_engine_tools-1.8.
|
|
261
|
-
devsecops_engine_tools-1.8.
|
|
262
|
-
devsecops_engine_tools-1.8.
|
|
263
|
-
devsecops_engine_tools-1.8.
|
|
259
|
+
devsecops_engine_tools-1.8.13.dist-info/METADATA,sha256=kB8OX0SJ7ui2I2XSWlwC8cUOZhAJ5d-Au5tPWp_DV9E,10444
|
|
260
|
+
devsecops_engine_tools-1.8.13.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
261
|
+
devsecops_engine_tools-1.8.13.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
|
|
262
|
+
devsecops_engine_tools-1.8.13.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
|
|
263
|
+
devsecops_engine_tools-1.8.13.dist-info/RECORD,,
|
|
File without changes
|
{devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{devsecops_engine_tools-1.8.11.dist-info → devsecops_engine_tools-1.8.13.dist-info}/top_level.txt
RENAMED
|
File without changes
|