Skip to content

Commit 64187f8

Browse files
committed
Remove is_latest from ImpactedPackage
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent cad5488 commit 64187f8

12 files changed

Lines changed: 105 additions & 100 deletions

File tree

CHANGELOG.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ next release
55
---------------------
66

77
- WARNING: Vulnerablecode V1 API and UI has stopped supporting Ubuntu OVAL advisories, please shift to V3 API for new Ubuntu advisories.
8-
- WARNING: We will deprecate improver pipelines for calculating package version rank, grouping advisories for packages and calculating risk scores in the next release, we are doing it at advisory import time instead of as separate pipelines, this will improve the performance and consistency of the data.
8+
- WARNING: We will deprecate improver pipelines for calculating package version rank and grouping advisories for packages in the next release, we are doing it at advisory import time instead of as separate pipelines, this will improve the performance and consistency of the data.
99
- Calculate package verion rank, group advisories for packages and package risk score and advisory risk score during import of advisories.
10-
- Add attribute ``pipeline_id`` to AdvisoryV2 to track the pipeline that created the advisory, also rename existing ``datasource_id`` and AVIDs.
10+
- Add attribute ``pipeline_id`` to AdvisoryV2 to track the pipeline that created the advisory, also rename existing ``datasource_id`` and AVIDs.
11+
1112

1213
Version v38.6.0
1314
---------------------

vulnerabilities/api_v3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ def get_impacts_bulk(packages):
721721

722722
impacts = (
723723
ImpactedPackageAffecting.objects.filter(
724-
package_id__in=package_ids, impacted_package__is_latest=True
724+
package_id__in=package_ids, impacted_package__advisory__is_latest=True
725725
)
726726
.select_related("impacted_package__advisory")
727727
.prefetch_related(

vulnerabilities/improvers/__init__.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,17 @@
99

1010
from vulnerabilities.improvers import valid_versions
1111
from vulnerabilities.improvers import vulnerability_status
12-
from vulnerabilities.pipelines import add_cvss31_to_CVEs
1312
from vulnerabilities.pipelines import compute_package_risk
13+
from vulnerabilities.pipelines import compute_package_version_rank
1414
from vulnerabilities.pipelines import enhance_with_exploitdb
1515
from vulnerabilities.pipelines import enhance_with_kev
1616
from vulnerabilities.pipelines import enhance_with_metasploit
1717
from vulnerabilities.pipelines import flag_ghost_packages
1818
from vulnerabilities.pipelines import populate_vulnerability_summary_pipeline
19-
from vulnerabilities.pipelines import remove_duplicate_advisories
2019
from vulnerabilities.pipelines.v2_improvers import archive_urls
2120
from vulnerabilities.pipelines.v2_improvers import collect_ssvc_trees
2221
from vulnerabilities.pipelines.v2_improvers import compute_advisory_todo as compute_advisory_todo_v2
2322
from vulnerabilities.pipelines.v2_improvers import compute_package_risk as compute_package_risk_v2
24-
from vulnerabilities.pipelines.v2_improvers import (
25-
computer_package_version_rank as compute_version_rank_v2,
26-
)
2723
from vulnerabilities.pipelines.v2_improvers import enhance_with_exploitdb as exploitdb_v2
2824
from vulnerabilities.pipelines.v2_improvers import enhance_with_github_poc
2925
from vulnerabilities.pipelines.v2_improvers import enhance_with_kev as enhance_with_kev_v2
@@ -59,15 +55,13 @@
5955
enhance_with_metasploit.MetasploitImproverPipeline,
6056
enhance_with_exploitdb.ExploitDBImproverPipeline,
6157
compute_package_risk.ComputePackageRiskPipeline,
62-
add_cvss31_to_CVEs.CVEAdvisoryMappingPipeline,
63-
remove_duplicate_advisories.RemoveDuplicateAdvisoriesPipeline,
58+
compute_package_version_rank.ComputeVersionRankPipeline,
6459
populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
6560
exploitdb_v2.ExploitDBImproverPipeline,
6661
enhance_with_kev_v2.VulnerabilityKevPipeline,
6762
flag_ghost_packages_v2.FlagGhostPackagePipeline,
6863
enhance_with_metasploit_v2.MetasploitImproverPipeline,
6964
compute_package_risk_v2.ComputePackageRiskPipeline,
70-
compute_version_rank_v2.ComputeVersionRankPipeline,
7165
unfurl_version_range_v2.UnfurlVersionRangePipeline,
7266
collect_ssvc_trees.CollectSSVCPipeline,
7367
relate_severities.RelateSeveritiesPipeline,

vulnerabilities/migrations/0135_impactedpackage_is_latest.py renamed to vulnerabilities/migrations/0135_advisoryv2__all_impacts_unfurled.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.2.11 on 2026-05-30 17:49
1+
# Generated by Django 5.2.11 on 2026-06-01 10:56
22

33
from django.db import migrations, models
44

@@ -11,12 +11,11 @@ class Migration(migrations.Migration):
1111

1212
operations = [
1313
migrations.AddField(
14-
model_name="impactedpackage",
15-
name="is_latest",
14+
model_name="advisoryv2",
15+
name="_all_impacts_unfurled",
1616
field=models.BooleanField(
17-
db_index=True,
1817
default=False,
19-
help_text="Indicates whether this is the latest impact for the advisory.",
18+
help_text="Indicates whether all impacts for this advisory have been unfurled.",
2019
),
2120
),
2221
]

vulnerabilities/migrations/0136_populate_impactedpackage_is_latest.py

Lines changed: 0 additions & 22 deletions
This file was deleted.

vulnerabilities/models.py

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,14 +2935,14 @@ def latest_for_avids(self, avids):
29352935

29362936
def latest_affecting_advisories_for_purl(self, purl):
29372937
adv_ids = ImpactedPackage.objects.filter(
2938-
affecting_packages__package_url=purl, is_latest=True
2938+
affecting_packages__package_url=purl, advisory__is_latest=True
29392939
).values_list("advisory_id", flat=True)
29402940

29412941
return self.filter(id__in=Subquery(adv_ids)).latest_per_avid()
29422942

29432943
def latest_affecting_advisories_for_purls(self, purls):
29442944
adv_ids = ImpactedPackage.objects.filter(
2945-
affecting_packages__package_url__in=purls, is_latest=True
2945+
affecting_packages__package_url__in=purls, advisory__is_latest=True
29462946
).values_list(
29472947
"advisory_id",
29482948
flat=True,
@@ -2951,7 +2951,7 @@ def latest_affecting_advisories_for_purls(self, purls):
29512951

29522952
def latest_affecting_advisories_for_packages(self, packages):
29532953
adv_ids = ImpactedPackage.objects.filter(
2954-
affecting_packages__in=packages, is_latest=True
2954+
affecting_packages__in=packages, advisory__is_latest=True
29552955
).values_list(
29562956
"advisory_id",
29572957
flat=True,
@@ -2960,7 +2960,7 @@ def latest_affecting_advisories_for_packages(self, packages):
29602960

29612961
def latest_fixed_by_advisories_for_purl(self, purl):
29622962
adv_ids = ImpactedPackage.objects.filter(
2963-
fixed_by_packages__package_url=purl, is_latest=True
2963+
fixed_by_packages__package_url=purl, advisory__is_latest=True
29642964
).values_list(
29652965
"advisory_id",
29662966
flat=True,
@@ -2969,7 +2969,7 @@ def latest_fixed_by_advisories_for_purl(self, purl):
29692969

29702970
def latest_fixed_by_advisories_for_purls(self, purls):
29712971
adv_ids = ImpactedPackage.objects.filter(
2972-
fixed_by_packages__package_url__in=purls, is_latest=True
2972+
fixed_by_packages__package_url__in=purls, advisory__is_latest=True
29732973
).values_list(
29742974
"advisory_id",
29752975
flat=True,
@@ -2980,15 +2980,15 @@ def latest_fixed_by_advisories_for_purls(self, purls):
29802980
def latest_advisories_for_purls(self, purls):
29812981
adv_ids = (
29822982
ImpactedPackage.objects.filter(
2983-
affecting_packages__package_url__in=purls, is_latest=True
2983+
affecting_packages__package_url__in=purls, advisory__is_latest=True
29842984
)
29852985
.values_list(
29862986
"advisory_id",
29872987
flat=True,
29882988
)
29892989
.union(
29902990
ImpactedPackage.objects.filter(
2991-
fixed_by_packages__package_url__in=purls, is_latest=True
2991+
fixed_by_packages__package_url__in=purls, advisory__is_latest=True
29922992
).values_list(
29932993
"advisory_id",
29942994
flat=True,
@@ -3001,14 +3001,16 @@ def latest_advisories_for_purls(self, purls):
30013001

30023002
def latest_advisories_for_purl(self, purl):
30033003
adv_ids = (
3004-
ImpactedPackage.objects.filter(affecting_packages__package_url=purl, is_latest=True)
3004+
ImpactedPackage.objects.filter(
3005+
affecting_packages__package_url=purl, advisory__is_latest=True
3006+
)
30053007
.values_list(
30063008
"advisory_id",
30073009
flat=True,
30083010
)
30093011
.union(
30103012
ImpactedPackage.objects.filter(
3011-
fixed_by_packages__package_url=purl, is_latest=True
3013+
fixed_by_packages__package_url=purl, advisory__is_latest=True
30123014
).values_list(
30133015
"advisory_id",
30143016
flat=True,
@@ -3221,6 +3223,11 @@ class AdvisoryV2(models.Model):
32213223
help_text="Risk expressed as a number ranging from 0 to 10. Risk is calculated from weighted severity and exploitability values. It is the maximum value of (the weighted severity multiplied by its exploitability) or 10. Risk = min(weighted severity * exploitability, 10)",
32223224
)
32233225

3226+
_all_impacts_unfurled = models.BooleanField(
3227+
default=False,
3228+
help_text="Indicates whether all impacts for this advisory have been unfurled.",
3229+
)
3230+
32243231
objects = AdvisoryV2QuerySet.as_manager()
32253232

32263233
class Meta:
@@ -3364,14 +3371,6 @@ class ImpactedPackage(models.Model):
33643371
help_text="Timestamp of the last successful vers range unfurl.",
33653372
)
33663373

3367-
is_latest = models.BooleanField(
3368-
default=False,
3369-
blank=False,
3370-
null=False,
3371-
db_index=True,
3372-
help_text="Indicates whether this is the latest impact for the advisory.",
3373-
)
3374-
33753374
def to_dict(self):
33763375
from vulnerabilities.utils import purl_to_dict
33773376

@@ -3536,26 +3535,22 @@ def _vulnerable(self, vulnerable=True):
35363535
"""
35373536
return self.with_is_vulnerable().filter(is_vulnerable=vulnerable)
35383537

3539-
def vulnerable(self):
3540-
"""
3541-
Return only packages that are vulnerable.
3542-
"""
3543-
return self.filter(id__in=ImpactedPackageAffecting.objects.values("package_id").distinct())
3544-
35453538
def with_is_vulnerable(self):
35463539
"""
35473540
Annotate Package with ``is_vulnerable`` boolean attribute.
35483541
"""
35493542
return self.annotate(
35503543
is_vulnerable=Exists(
3551-
ImpactedPackage.objects.filter(affecting_packages__pk=OuterRef("pk"))
3544+
ImpactedPackage.objects.filter(
3545+
affecting_packages__pk=OuterRef("pk"), advisory__is_latest=True
3546+
)
35523547
)
35533548
)
35543549

35553550
def all_vulnerable(self):
35563551
latest_impacts = ImpactedPackageAffecting.objects.filter(
35573552
package_id=OuterRef("pk"),
3558-
impacted_package__is_latest=True,
3553+
impacted_package__advisory__is_latest=True,
35593554
)
35603555

35613556
query = PackageV2.objects.filter(Exists(latest_impacts))

vulnerabilities/pipelines/v2_improvers/unfurl_version_range.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def unfurl_version_range(self):
5858
cached_versions = {}
5959
update_unfurl_date = []
6060
update_successful_unfurl_date = []
61-
update_batch_size = 5000
62-
chunk_size = 5000
61+
update_batch_size = 500
62+
chunk_size = 500
6363

6464
impacted_packages = impacted_package_qs(cutoff_day=self.reunfurl_after_days)
6565
impacted_packages_count = impacted_packages.count()

vulnerabilities/pipes/advisory.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,6 @@ def insert_advisory_v2(
374374
advisory_obj.risk_score = round(risk_score, 1) if risk_score is not None else None
375375
advisory_obj.save()
376376

377-
# Set all impacts as is_latest=False for the advisory before creating new impacts with is_latest=True. This ensures that only the impacts related to the latest advisory are marked as latest.
378-
ImpactedPackage.objects.filter(advisory__avid=advisory_obj.avid).update(is_latest=False)
379377
for affected_pkg in advisory.affected_packages:
380378
impact = ImpactedPackage.objects.create(
381379
advisory=advisory_obj,
@@ -388,7 +386,6 @@ def insert_advisory_v2(
388386
fixed_vers=(
389387
str(affected_pkg.fixed_version_range) if affected_pkg.fixed_version_range else None
390388
),
391-
is_latest=True,
392389
)
393390
package_affected_purls, package_fixed_purls = get_exact_purls_v2(
394391
affected_package=affected_pkg,

vulnerabilities/pipes/export.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def package_prefetched_qs(checkpoint):
2525
.prefetch_related(
2626
Prefetch(
2727
"affected_in_impacts",
28-
queryset=ImpactedPackage.objects.filter(is_latest=True)
28+
queryset=ImpactedPackage.objects.filter(advisory__is_latest=True)
2929
.only("advisory_id")
3030
.prefetch_related(
3131
Prefetch(
@@ -36,7 +36,7 @@ def package_prefetched_qs(checkpoint):
3636
),
3737
Prefetch(
3838
"fixed_in_impacts",
39-
queryset=ImpactedPackage.objects.filter(is_latest=True)
39+
queryset=ImpactedPackage.objects.filter(advisory__is_latest=True)
4040
.only("advisory_id")
4141
.prefetch_related(
4242
Prefetch(

0 commit comments

Comments
 (0)