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.
Files changed (36) hide show
  1. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/PKG-INFO +1 -1
  2. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/PKG-INFO +1 -1
  3. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/SOURCES.txt +1 -0
  4. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/report.py +41 -17
  5. owasp_dependency_track_cli-5.1.3/test/test_formats.py +46 -0
  6. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/LICENSE +0 -0
  7. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/README.md +0 -0
  8. {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
  9. {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
  10. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dependency_track_cli.egg-info/requires.txt +0 -0
  11. {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
  12. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/__init__.py +0 -0
  13. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/analyze.py +0 -0
  14. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/api.py +0 -0
  15. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/arguments.py +0 -0
  16. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/cli.py +0 -0
  17. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/common.py +0 -0
  18. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/config.py +0 -0
  19. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/log.py +0 -0
  20. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/metrics.py +0 -0
  21. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/models.py +0 -0
  22. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/project.py +0 -0
  23. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/prometheus.py +0 -0
  24. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/test.py +0 -0
  25. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/owasp_dt_cli/upload.py +0 -0
  26. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/pyproject.toml +0 -0
  27. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/setup.cfg +0 -0
  28. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/setup.py +0 -0
  29. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_api.py +0 -0
  30. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_cli.py +0 -0
  31. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_keep_active.py +0 -0
  32. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_metrics.py +0 -0
  33. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_project.py +0 -0
  34. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_test.py +0 -0
  35. {owasp_dependency_track_cli-5.1.2 → owasp_dependency_track_cli-5.1.3}/test/test_trivy.py +0 -0
  36. {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.2
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.2
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
@@ -25,6 +25,7 @@ owasp_dt_cli/test.py
25
25
  owasp_dt_cli/upload.py
26
26
  test/test_api.py
27
27
  test/test_cli.py
28
+ test/test_formats.py
28
29
  test/test_keep_active.py
29
30
  test/test_metrics.py
30
31
  test/test_project.py
@@ -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
- version = component.version
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 if component.latest_version else "?"})"
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
- name = component.name
69
- if component.group:
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) if vulnerability.cvss_v3_base_score else "?",
78
- str(vulnerability.cvss_v2_base_score) if vulnerability.cvss_v2_base_score else "?",
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) == "?"