owasp-dependency-track-cli 5.1.2__tar.gz → 5.1.3__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.
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/PKG-INFO +1 -1
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/PKG-INFO +1 -1
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/SOURCES.txt +1 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/report.py +41 -17
- owasp_dependency_track_cli-5.1.3/test/test_formats.py +46 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/LICENSE +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/README.md +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/dependency_links.txt +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/entry_points.txt +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/requires.txt +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/top_level.txt +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/__init__.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/analyze.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/api.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/arguments.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/cli.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/common.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/config.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/log.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/metrics.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/models.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/project.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/prometheus.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/test.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/upload.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/pyproject.toml +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/setup.cfg +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/setup.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_api.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_cli.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_keep_active.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_metrics.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_project.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_test.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_trivy.py +0 -0
- {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_upload_analyze_report.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owasp-dependency-track-cli
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.3
|
|
4
4
|
Summary: Inofficial OWASP Dependency Track CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/mreiche/owasp-dependency-track-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/mreiche/owasp-dependency-track-cli
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owasp-dependency-track-cli
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.3
|
|
4
4
|
Summary: Inofficial OWASP Dependency Track CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/mreiche/owasp-dependency-track-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/mreiche/owasp-dependency-track-cli
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/report.py
RENAMED
|
@@ -8,10 +8,11 @@ from owasp_dt.models import (
|
|
|
8
8
|
Finding,
|
|
9
9
|
FindingComponent,
|
|
10
10
|
FindingVulnerability,
|
|
11
|
-
PolicyViolation,
|
|
11
|
+
PolicyViolation, PolicyCondition,
|
|
12
12
|
)
|
|
13
|
+
from owasp_dt.types import Unset
|
|
13
14
|
from tabulate import tabulate
|
|
14
|
-
from tinystream import Stream
|
|
15
|
+
from tinystream import Stream, Opt
|
|
15
16
|
|
|
16
17
|
from owasp_dt_cli import common, config, models
|
|
17
18
|
|
|
@@ -30,7 +31,10 @@ __state_color_map: dict[str, str] = {
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
|
|
33
|
-
def shorten(text: str, max_length: int = 100):
|
|
34
|
+
def shorten(text: str | Unset, max_length: int = 100) -> str:
|
|
35
|
+
if isinstance(text, Unset):
|
|
36
|
+
return ""
|
|
37
|
+
|
|
34
38
|
if len(text) > max_length:
|
|
35
39
|
return text[:97] + "..."
|
|
36
40
|
return text
|
|
@@ -46,7 +50,10 @@ def format_severity(severity: str):
|
|
|
46
50
|
return color + severity + Style.RESET_ALL
|
|
47
51
|
|
|
48
52
|
|
|
49
|
-
def format_violation_state(state: str):
|
|
53
|
+
def format_violation_state(state: str | Unset):
|
|
54
|
+
if isinstance(state, Unset):
|
|
55
|
+
return "?"
|
|
56
|
+
|
|
50
57
|
normalized = state.upper()
|
|
51
58
|
if normalized in __state_color_map:
|
|
52
59
|
color = __state_color_map[normalized]
|
|
@@ -55,29 +62,46 @@ def format_violation_state(state: str):
|
|
|
55
62
|
|
|
56
63
|
return color + state + Style.RESET_ALL
|
|
57
64
|
|
|
65
|
+
def filter_unset(param: any | Unset, default = None):
|
|
66
|
+
return Opt(param).filter(lambda x: not isinstance(x, Unset)).get(default)
|
|
58
67
|
|
|
59
|
-
def format_component_version(component: FindingComponent | Component):
|
|
60
|
-
|
|
68
|
+
def format_component_version(component: FindingComponent | Component | Unset):
|
|
69
|
+
if isinstance(component, Unset):
|
|
70
|
+
return "?"
|
|
71
|
+
|
|
72
|
+
version = filter_unset(component.version, "?")
|
|
61
73
|
if isinstance(component, FindingComponent):
|
|
62
|
-
version += f" ({component.latest_version
|
|
74
|
+
version += f" ({filter_unset(component.latest_version, "?")})"
|
|
63
75
|
|
|
64
76
|
return version
|
|
65
77
|
|
|
66
78
|
|
|
67
|
-
def format_component_identifier(component: FindingComponent | Component):
|
|
68
|
-
|
|
69
|
-
|
|
79
|
+
def format_component_identifier(component: FindingComponent | Component | Unset):
|
|
80
|
+
if isinstance(component, Unset):
|
|
81
|
+
return "?"
|
|
82
|
+
|
|
83
|
+
name = filter_unset(component.name, "?")
|
|
84
|
+
if not isinstance(component.group, Unset):
|
|
70
85
|
name = f"{component.group}.{name}"
|
|
71
86
|
|
|
72
87
|
return name
|
|
73
88
|
|
|
74
89
|
|
|
75
|
-
def format_scoring(vulnerability: FindingVulnerability):
|
|
90
|
+
def format_scoring(vulnerability: FindingVulnerability|Unset):
|
|
91
|
+
if isinstance(vulnerability, Unset):
|
|
92
|
+
return "?"
|
|
93
|
+
|
|
76
94
|
scores = [
|
|
77
|
-
str(vulnerability.cvss_v3_base_score
|
|
78
|
-
str(vulnerability.cvss_v2_base_score
|
|
95
|
+
str(filter_unset(vulnerability.cvss_v3_base_score, "?")),
|
|
96
|
+
str(filter_unset(vulnerability.cvss_v2_base_score, "?")),
|
|
79
97
|
]
|
|
80
|
-
return f"{format_severity(vulnerability.severity)} ({', '.join(scores)})"
|
|
98
|
+
return f"{format_severity(filter_unset(vulnerability.severity, "?"))} ({', '.join(scores)})"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def format_policy_name(policy_condition: PolicyCondition | Unset):
|
|
102
|
+
if isinstance(policy_condition, Unset):
|
|
103
|
+
return "?"
|
|
104
|
+
return filter_unset(policy_condition.policy.name, "?") if policy_condition.policy else "?"
|
|
81
105
|
|
|
82
106
|
|
|
83
107
|
def print_findings_table(findings: list[Finding]):
|
|
@@ -92,7 +116,7 @@ def print_findings_table(findings: list[Finding]):
|
|
|
92
116
|
data.append([
|
|
93
117
|
format_component_identifier(finding.component),
|
|
94
118
|
format_component_version(finding.component),
|
|
95
|
-
f"{finding.vulnerability.vuln_id} ({shorten(finding.vulnerability.description)})",
|
|
119
|
+
f"{filter_unset(finding.vulnerability.vuln_id, "?")} ({shorten(finding.vulnerability.description)})" if finding.vulnerability else "?",
|
|
96
120
|
format_scoring(finding.vulnerability),
|
|
97
121
|
])
|
|
98
122
|
if len(data) > 0:
|
|
@@ -114,8 +138,8 @@ def print_violations_table(violations: list[PolicyViolation]):
|
|
|
114
138
|
data.append([
|
|
115
139
|
format_component_identifier(violation.component),
|
|
116
140
|
format_component_version(violation.component),
|
|
117
|
-
violation.policy_condition.policy.name,
|
|
118
|
-
format_violation_state(violation.policy_condition.policy.violation_state.name),
|
|
141
|
+
violation.policy_condition.policy.name if violation.policy_condition and violation.policy_condition.policy and violation.policy_condition.policy.name else "?",
|
|
142
|
+
format_violation_state(violation.policy_condition.policy.violation_state.name) if violation.policy_condition and violation.policy_condition.policy and violation.policy_condition.policy.violation_state else "?",
|
|
119
143
|
])
|
|
120
144
|
if len(data) > 0:
|
|
121
145
|
print("POLICY VIOLATIONS")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
|
|
3
|
+
from owasp_dt.models import PolicyCondition, PolicyConditionOperator, PolicyConditionSubject, Component
|
|
4
|
+
from owasp_dt.types import UNSET
|
|
5
|
+
|
|
6
|
+
from owasp_dt_cli.report import filter_unset, shorten, format_violation_state, format_component_version, \
|
|
7
|
+
format_component_identifier, format_scoring, format_policy_name
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_filter_unset():
|
|
11
|
+
assert filter_unset(1) == 1
|
|
12
|
+
assert filter_unset(None) is None
|
|
13
|
+
assert filter_unset("something") == "something"
|
|
14
|
+
assert filter_unset(False) == False
|
|
15
|
+
assert filter_unset(True) == True
|
|
16
|
+
assert filter_unset(UNSET) is None
|
|
17
|
+
|
|
18
|
+
def test_shorten():
|
|
19
|
+
assert shorten("something") == "something"
|
|
20
|
+
assert shorten(UNSET) == ""
|
|
21
|
+
long_text = "abc"*40
|
|
22
|
+
assert shorten(long_text) == f"{long_text[:97]}..."
|
|
23
|
+
|
|
24
|
+
def test_format_violation_state():
|
|
25
|
+
assert format_violation_state(UNSET) == "?"
|
|
26
|
+
|
|
27
|
+
def test_format_component_version():
|
|
28
|
+
assert format_component_version(UNSET) == "?"
|
|
29
|
+
|
|
30
|
+
def test_format_component_identifier():
|
|
31
|
+
assert format_component_identifier(UNSET) == "?"
|
|
32
|
+
component = Component(name="test",group="katze")
|
|
33
|
+
assert format_component_identifier(component) == "katze.test"
|
|
34
|
+
|
|
35
|
+
def test_format_scoring():
|
|
36
|
+
assert format_scoring(UNSET) == "?"
|
|
37
|
+
|
|
38
|
+
def test_format_policy_name():
|
|
39
|
+
assert format_policy_name(UNSET) == "?"
|
|
40
|
+
policy_condition = PolicyCondition(
|
|
41
|
+
operator=PolicyConditionOperator.CONTAINS_ALL,
|
|
42
|
+
subject=PolicyConditionSubject.AGE,
|
|
43
|
+
uuid=uuid.uuid4(),
|
|
44
|
+
value=""
|
|
45
|
+
)
|
|
46
|
+
assert format_policy_name(policy_condition) == "?"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/__init__.py
RENAMED
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/analyze.py
RENAMED
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/arguments.py
RENAMED
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/common.py
RENAMED
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/config.py
RENAMED
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/metrics.py
RENAMED
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/models.py
RENAMED
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/project.py
RENAMED
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/prometheus.py
RENAMED
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/upload.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_keep_active.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|