|
7 | 7 | # See https://aboutcode.org for more information about nexB OSS projects. |
8 | 8 | # |
9 | 9 |
|
| 10 | +from collections import defaultdict |
| 11 | + |
10 | 12 | from django.db import transaction |
11 | 13 | from django.db.models import Exists |
12 | 14 | from django.db.models import Min |
|
21 | 23 | from vulnerabilities.models import PipelineSchedule |
22 | 24 | from vulnerabilities.pipelines import VulnerableCodePipeline |
23 | 25 | from vulnerabilities.pipes.group_advisories import group_advisory_for_package |
| 26 | +from vulnerabilities.pipes.group_advisories import group_single_package_with_provided_advisories |
24 | 27 | from vulnerabilities.pipes.risk_score import compute_package_risk_score_bulk |
25 | 28 | from vulnerabilities.utils import TYPES_WITH_MULTIPLE_IMPORTERS |
26 | 29 |
|
@@ -151,7 +154,46 @@ def complete_advisories_import(advisory_ids, successful_advisory_ids=[]): |
151 | 154 |
|
152 | 155 | group_package_ids = affecting_package_ids | fixed_by_package_ids |
153 | 156 |
|
154 | | - for package in PackageV2.objects.filter( |
| 157 | + packages = PackageV2.objects.filter( |
155 | 158 | id__in=group_package_ids, type__in=TYPES_WITH_MULTIPLE_IMPORTERS |
156 | | - ).iterator(chunk_size=2000): |
157 | | - group_advisory_for_package(package) |
| 159 | + ).only("package_url", "id") |
| 160 | + |
| 161 | + group_advisories_for_packages_bulk_marking(packages) |
| 162 | + |
| 163 | + |
| 164 | +def group_advisories_for_packages_bulk_marking(packages): |
| 165 | + purls = [package.package_url for package in packages] |
| 166 | + |
| 167 | + affecting_pairs = AdvisoryV2.objects.latest_affecting_advisory_purls_pairs(purls) |
| 168 | + |
| 169 | + fixed_pairs = AdvisoryV2.objects.latest_fixed_by_advisory_purls_pairs(purls) |
| 170 | + |
| 171 | + affecting_ids = {adv_id for _, adv_id in affecting_pairs} |
| 172 | + fixed_ids = {adv_id for _, adv_id in fixed_pairs} |
| 173 | + |
| 174 | + all_adv_ids = affecting_ids | fixed_ids |
| 175 | + |
| 176 | + advisories = AdvisoryV2.objects.filter(id__in=all_adv_ids).prefetch_related( |
| 177 | + "aliases", |
| 178 | + "impacted_packages__affecting_packages", |
| 179 | + "impacted_packages__fixed_by_packages", |
| 180 | + ) |
| 181 | + |
| 182 | + advisory_map = {a.id: a for a in advisories} |
| 183 | + |
| 184 | + affecting_by_purl = defaultdict(list) |
| 185 | + |
| 186 | + for purl, advisory_id in affecting_pairs: |
| 187 | + affecting_by_purl[purl].append(advisory_map[advisory_id]) |
| 188 | + |
| 189 | + fixed_by_purl = defaultdict(list) |
| 190 | + |
| 191 | + for purl, advisory_id in fixed_pairs: |
| 192 | + fixed_by_purl[purl].append(advisory_map[advisory_id]) |
| 193 | + |
| 194 | + for package in packages: |
| 195 | + group_single_package_with_provided_advisories( |
| 196 | + package=package, |
| 197 | + affecting_advisories=affecting_by_purl.get(package.purl, []), |
| 198 | + fixed_by_advisories=fixed_by_purl.get(package.purl, []), |
| 199 | + ) |
0 commit comments