Skip to content

Commit 7972776

Browse files
committed
Change API V3 structure
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent c803db3 commit 7972776

38 files changed

+220
-48
lines changed

vulnerabilities/api_v2.py

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from vulnerabilities.models import VulnerabilitySeverity
4242
from vulnerabilities.models import Weakness
4343
from vulnerabilities.throttling import PermissionBasedUserRateThrottle
44+
from vulnerabilities.utils import group_advisories_by_content
4445

4546

4647
class CharInFilter(filters.BaseInFilter, filters.CharFilter):
@@ -361,19 +362,39 @@ def get_affected_by_vulnerabilities(self, package):
361362

362363
latest_advisories = AdvisoryV2.objects.latest_for_avids(avids)
363364
advisory_by_avid = {adv.avid: adv for adv in latest_advisories}
365+
impact_by_avid = {}
364366

365-
result = {}
366-
367+
advisories = []
367368
for impact in impacts:
368369
avid = impact.advisory.avid
369370
advisory = advisory_by_avid.get(avid)
370371
if not advisory:
371372
continue
372-
fixed_by_packages = [pkg.purl for pkg in impact.fixed_by_packages.all()]
373-
result[advisory.avid] = {
374-
"advisory_id": advisory.avid,
375-
"fixed_by_packages": fixed_by_packages,
376-
}
373+
advisories.append(advisory)
374+
impact_by_avid[avid] = impact
375+
376+
grouped_advisories = group_advisories_by_content(advisories=advisories)
377+
378+
advs = []
379+
380+
for hash in grouped_advisories:
381+
advs.append(grouped_advisories[hash])
382+
383+
result = []
384+
385+
for advisory in advs:
386+
primary_advisory = advisory["primary"]
387+
avid = primary_advisory.avid
388+
impact = impact_by_avid.get(avid)
389+
if not impact:
390+
continue
391+
result.append(
392+
{
393+
"advisory_id": primary_advisory.avid,
394+
"fixed_by_packages": [pkg.purl for pkg in impact.fixed_by_packages.all()],
395+
"duplicate_advisory_ids": [adv.avid for adv in advisory["secondary"]],
396+
}
397+
)
377398

378399
return result
379400

@@ -384,7 +405,25 @@ def get_fixing_vulnerabilities(self, package):
384405

385406
latest_advisories = AdvisoryV2.objects.latest_for_avids(avids)
386407

387-
return [adv.avid for adv in latest_advisories]
408+
grouped_advisories = group_advisories_by_content(advisories=latest_advisories)
409+
410+
advs = []
411+
412+
for hash in grouped_advisories:
413+
advs.append(grouped_advisories[hash])
414+
415+
result = []
416+
417+
for advisory in advs:
418+
primary_advisory = advisory["primary"]
419+
result.append(
420+
{
421+
"advisory_id": primary_advisory.avid,
422+
"duplicate_advisory_ids": [adv.avid for adv in advisory["secondary"]],
423+
}
424+
)
425+
426+
return result
388427

389428
def get_next_non_vulnerable_version(self, package):
390429
if next_non_vulnerable := package.get_non_vulnerable_versions()[0]:
@@ -1078,14 +1117,14 @@ def list(self, request, *args, **kwargs):
10781117
return self.get_paginated_response(
10791118
{
10801119
"packages": serializer.data,
1081-
"advisories": advisory_data,
1120+
"advisories_by_id": advisory_data,
10821121
}
10831122
)
10841123

10851124
return Response(
10861125
{
10871126
"packages": serializer.data,
1088-
"advisories": advisory_data,
1127+
"advisories_by_id": advisory_data,
10891128
}
10901129
)
10911130

@@ -1160,7 +1199,7 @@ def bulk_lookup(self, request):
11601199
return Response(
11611200
{
11621201
"packages": package_data,
1163-
"advisories": advisory_data,
1202+
"advisories_by_id": advisory_data,
11641203
}
11651204
)
11661205

@@ -1254,7 +1293,7 @@ def bulk_search(self, request):
12541293
return Response(
12551294
{
12561295
"packages": package_data,
1257-
"advisories": advisory_data,
1296+
"advisories_by_id": advisory_data,
12581297
}
12591298
)
12601299

@@ -1308,7 +1347,7 @@ def bulk_search(self, request):
13081347
return Response(
13091348
{
13101349
"packages": package_data,
1311-
"advisories": advisory_data,
1350+
"advisories_by_id": advisory_data,
13121351
}
13131352
)
13141353

vulnerabilities/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,10 @@
6969
from vulnerabilities.importer import AdvisoryDataV2
7070
from vulnerabilities.severity_systems import EPSS
7171
from vulnerabilities.severity_systems import SCORING_SYSTEMS
72-
from vulnerabilities.utils import compute_patch_checksum, normalize_list, normalize_text
72+
from vulnerabilities.utils import compute_patch_checksum
73+
from vulnerabilities.utils import normalize_list
7374
from vulnerabilities.utils import normalize_purl
75+
from vulnerabilities.utils import normalize_text
7476
from vulnerabilities.utils import purl_to_dict
7577
from vulnerablecode import __version__ as VULNERABLECODE_VERSION
7678
from vulnerablecode.settings import VULNERABLECODE_PIPELINE_TIMEOUT
@@ -3058,7 +3060,7 @@ def get_aliases(self):
30583060
Return a queryset of all Aliases for this vulnerability.
30593061
"""
30603062
return self.aliases.all()
3061-
3063+
30623064
def compute_advisory_content(self):
30633065
"""
30643066
Compute a unique content hash for an advisory by normalizing its data and hashing it.

vulnerabilities/pipelines/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ class VulnerableCodeBaseImporterPipelineV2(VulnerableCodePipeline):
265265
spdx_license_expression = None
266266
repo_url = None
267267
ignorable_versions = []
268+
precedence = 0
268269

269270
# Control how often progress log is shown (range: 1–100, higher value = less frequent log)
270271
progress_step = 10
@@ -318,6 +319,7 @@ def collect_and_store_advisories(self):
318319
advisory=advisory,
319320
pipeline_id=self.pipeline_id,
320321
logger=self.log,
322+
precedence=self.precedence,
321323
):
322324
collected_advisory_count += 1
323325
except Exception as e:

vulnerabilities/pipelines/v2_importers/alpine_linux_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class AlpineLinuxImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
3838
license_url = "https://secdb.alpinelinux.org/license.txt"
3939
repo_url = "git+https://github.com/aboutcode-org/aboutcode-mirror-alpine-secdb/"
4040

41+
precedence = 200
42+
4143
@classmethod
4244
def steps(cls):
4345
return (

vulnerabilities/pipelines/v2_importers/aosp_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class AospImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
3131
spdx_license_expression = "Apache-2.0"
3232
license_url = "https://github.com/quarkslab/aosp_dataset/blob/master/LICENSE"
3333

34+
precedence = 200
35+
3436
@classmethod
3537
def steps(cls):
3638
return (

vulnerabilities/pipelines/v2_importers/apache_httpd_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class ApacheHTTPDImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
152152
license_url = "https://www.apache.org/licenses/LICENSE-2.0"
153153
base_url = "https://httpd.apache.org/security/json/"
154154

155+
precedence = 200
156+
155157
links = []
156158

157159
ignorable_versions = frozenset(

vulnerabilities/pipelines/v2_importers/apache_kafka_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class ApacheKafkaImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
4848
"CVE-2021-4104",
4949
]
5050

51+
precedence = 200
52+
5153
@classmethod
5254
def steps(cls):
5355
return (

vulnerabilities/pipelines/v2_importers/apache_tomcat_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class ApacheTomcatImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
4040
license_url = "https://www.apache.org/licenses/LICENSE-2.0"
4141
base_url = "https://tomcat.apache.org/security"
4242

43+
precedence = 200
44+
4345
def fetch_advisory_links(self):
4446
"""
4547
Yield the URLs of each Tomcat version security-related page.

vulnerabilities/pipelines/v2_importers/archlinux_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class ArchLinuxImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
2828
spdx_license_expression = "MIT"
2929
license_url = "https://github.com/archlinux/arch-security-tracker/blob/master/LICENSE"
3030

31+
precedence = 200
32+
3133
@classmethod
3234
def steps(cls):
3335
return (

vulnerabilities/pipelines/v2_importers/curl_importer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class CurlImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
3737
repo_url = "https://github.com/curl/curl-www/"
3838
url = "https://curl.se/docs/vuln.json"
3939

40+
precedence = 200
41+
4042
@classmethod
4143
def steps(cls):
4244
return (cls.collect_and_store_advisories,)

0 commit comments

Comments
 (0)