Skip to content

Commit fbc8fed

Browse files
committed
Merge remote-tracking branch 'origin/main' into save-risk
# Conflicts: # vulnerabilities/models.py # vulnerabilities/pipelines/compute_package_risk.py # vulnerabilities/risk.py
2 parents 405bf86 + d029151 commit fbc8fed

33 files changed

+1264
-239
lines changed

CHANGELOG.rst

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
Release notes
22
=============
33

4-
Version (next)
5-
-----------------------
4+
Version v34.3.2
5+
----------------
6+
7+
- HOTFIX: Add reference score to package endpoint #1655
8+
9+
10+
Version v34.3.1
11+
----------------
12+
13+
- HOTFIX: Fix API bug #1654
14+
15+
16+
Version v34.3.0
17+
-----------------
18+
19+
- Add bulk search in v2 #1649
20+
- Refactor severity score model and fix incorrect suse scores #1636
621

722

823
Version v34.2.0

docs/source/contributing.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Helpful Resources
8989

9090
- Review our `comprehensive guide <https://scancode-toolkit.readthedocs.io/en/latest/contribute/index.html>`_
9191
for more details on how to add quality contributions to our codebase and documentation
92-
- Check this free resource on `how to contribute to an open source project on github <https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github>`_
92+
- Check this free resource on `How to contribute to an open source project on github <https://egghead.io/lessons/javascript-identifying-how-to-contribute-to-an-open-source-project-on-github>`_
9393
- Follow `this wiki page <https://aboutcode.readthedocs.io/en/latest/contributing/writing_good_commit_messages.html>`_
9494
on how to write good commit messages
9595
- `Pro Git book <https://git-scm.com/book/en/v2>`_

docs/source/tutorial_add_importer_pipeline.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,14 @@ version management from `univers <https://github.com/aboutcode-org/univers>`_.
298298
**advisories_count** should never be directly added in steps.
299299

300300

301+
.. attention::
302+
303+
Implement ``on_failure`` to handle cleanup in case of pipeline failure.
304+
Cleanup of downloaded archives or cloned repos is necessary to avoid potential resource leakage.
301305

302306
.. note::
303307

304-
| Use ``make valid`` to format your code using black and isort automatically.
308+
| Use ``make valid`` to format your new code using black and isort automatically.
305309
| Use ``make check`` to check for formatting errors.
306310
307311
Register the Importer Pipeline

docs/source/tutorial_add_improver_pipeline.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ methods.
187187
self.log(f"Successfully flagged {ghost_package_count:,d} ghost Packages")
188188
189189
190+
.. attention::
191+
192+
Implement ``on_failure`` to handle cleanup in case of pipeline failure.
193+
Cleanup of downloaded archives or cloned repos is necessary to avoid potential resource leakage.
194+
190195
.. note::
191196

192197
| Use ``make valid`` to format your new code using black and isort automatically.

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = vulnerablecode
3-
version = 34.2.0
3+
version = 34.3.2
44
license = Apache-2.0 AND CC-BY-SA-4.0
55

66
# description must be on ONE line https://github.com/pypa/setuptools/issues/1390

vulnerabilities/api.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,25 @@ def to_representation(self, instance):
5454

5555

5656
class VulnerabilityReferenceSerializer(serializers.ModelSerializer):
57-
scores = VulnerabilitySeveritySerializer(many=True, source="vulnerabilityseverity_set")
57+
scores = serializers.SerializerMethodField()
5858
reference_url = serializers.CharField(source="url")
5959

6060
class Meta:
6161
model = VulnerabilityReference
6262
fields = ["reference_url", "reference_id", "reference_type", "scores", "url"]
6363

64+
def get_scores(self, instance):
65+
severities_related_to_reference = [
66+
severity
67+
for severity in self.context.get("severities", [])
68+
if severity.url == instance.url
69+
]
70+
71+
return VulnerabilitySeveritySerializer(
72+
severities_related_to_reference,
73+
many=True,
74+
).data
75+
6476

6577
class BaseResourceSerializer(serializers.HyperlinkedModelSerializer):
6678
"""
@@ -143,14 +155,26 @@ class VulnSerializerRefsAndSummary(BaseResourceSerializer):
143155
many=True, source="filtered_fixed_packages", read_only=True
144156
)
145157

146-
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
158+
references = serializers.SerializerMethodField()
147159

148160
aliases = serializers.SerializerMethodField()
149161

150162
def get_aliases(self, obj):
151163
# Assuming `obj.aliases` is a queryset of `Alias` objects
152164
return [alias.alias for alias in obj.aliases.all()]
153165

166+
def get_references(self, vulnerability):
167+
references = vulnerability.vulnerabilityreference_set.all()
168+
severities = vulnerability.severities.all()
169+
170+
serialized_references = VulnerabilityReferenceSerializer(
171+
references,
172+
context={"severities": severities},
173+
many=True,
174+
).data
175+
176+
return serialized_references
177+
154178
class Meta:
155179
model = Vulnerability
156180
fields = ["url", "vulnerability_id", "summary", "references", "fixed_packages", "aliases"]
@@ -199,8 +223,7 @@ class VulnerabilitySerializer(BaseResourceSerializer):
199223
many=True, source="filtered_fixed_packages", read_only=True
200224
)
201225
affected_packages = MinimalPackageSerializer(many=True, read_only=True)
202-
203-
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
226+
references = serializers.SerializerMethodField()
204227
aliases = AliasSerializer(many=True, source="alias")
205228
exploits = ExploitSerializer(many=True, read_only=True)
206229
weaknesses = WeaknessSerializer(many=True)
@@ -214,10 +237,22 @@ def to_representation(self, instance):
214237

215238
return data
216239

240+
def get_references(self, vulnerability):
241+
references = vulnerability.vulnerabilityreference_set.all()
242+
severities = vulnerability.severities.all()
243+
244+
serialized_references = VulnerabilityReferenceSerializer(
245+
references,
246+
context={"severities": severities},
247+
many=True,
248+
).data
249+
250+
return serialized_references
251+
217252
def get_severity_range_score(self, instance):
218253
severity_vectors = []
219254
severity_values = set()
220-
for s in instance.severities:
255+
for s in instance.severities.all():
221256
if s.scoring_system == EPSS.identifier:
222257
continue
223258

@@ -303,7 +338,7 @@ def get_vulnerabilities_for_a_package(self, package, fix) -> dict:
303338
otherwise return vulnerabilities fixed by the `package`.
304339
"""
305340
fixed_packages = self.get_fixed_packages(package=package)
306-
if fix:
341+
if not fix:
307342
qs = package.affected_by_vulnerabilities.all()
308343
else:
309344
qs = package.fixing_vulnerabilities.all()

vulnerabilities/api_extension.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,10 @@ class Meta:
8484

8585
class V2VulnerabilitySeveritySerializer(ModelSerializer):
8686
score = CharField(source="value")
87-
reference = V2VulnerabilityReferenceSerializer()
8887

8988
class Meta:
9089
model = VulnerabilitySeverity
91-
fields = ("score", "scoring_system", "scoring_elements", "published_at", "reference")
90+
fields = ("url", "score", "scoring_system", "scoring_elements", "published_at")
9291

9392

9493
class V2WeaknessSerializer(ModelSerializer):
@@ -127,9 +126,9 @@ class V2VulnerabilitySerializer(ModelSerializer):
127126

128127
aliases = SerializerMethodField("get_aliases")
129128
weaknesses = V2WeaknessSerializer(many=True, source="weaknesses_set")
130-
scores = V2VulnerabilitySeveritySerializer(many=True, source="vulnerabilityseverity_set")
131129
references = V2VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
132130
exploits = V2ExploitSerializer(many=True, source="weaknesses")
131+
severities = V2VulnerabilitySeveritySerializer(many=True)
133132

134133
def get_aliases(self, vulnerability):
135134
return vulnerability.aliases.only("alias").values_list("alias", flat=True)
@@ -145,11 +144,11 @@ class Meta:
145144
"vulnerability_id",
146145
"aliases",
147146
"status",
148-
"scores",
149147
"weaknesses",
150148
"summary",
151149
"exploits",
152150
"references",
151+
"severities",
153152
)
154153

155154

@@ -358,7 +357,7 @@ def get_queryset(self):
358357
.get_queryset()
359358
.prefetch_related(
360359
"weaknesses",
361-
# "severities",
360+
"severities",
362361
# "exploits",
363362
)
364363
)

0 commit comments

Comments
 (0)