Skip to content

Commit 3c73e6f

Browse files
committed
Fix bugs
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 12d6754 commit 3c73e6f

2 files changed

Lines changed: 65 additions & 54 deletions

File tree

vulnerabilities/api_v3.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,10 @@
3131
from vulnerabilities.models import AdvisoryAlias
3232
from vulnerabilities.models import AdvisoryReference
3333
from vulnerabilities.models import AdvisorySet
34-
from vulnerabilities.models import AdvisorySetMember
3534
from vulnerabilities.models import AdvisorySeverity
3635
from vulnerabilities.models import AdvisoryV2
3736
from vulnerabilities.models import AdvisoryWeakness
38-
from vulnerabilities.models import GroupedAdvisory
3937
from vulnerabilities.models import ImpactedPackageAffecting
40-
from vulnerabilities.models import ImpactedPackageFixedBy
4138
from vulnerabilities.models import PackageV2
4239
from vulnerabilities.throttling import PermissionBasedUserRateThrottle
4340
from vulnerabilities.utils import TYPES_WITH_MULTIPLE_IMPORTERS
@@ -46,8 +43,7 @@
4643
class PackageQuerySerializer(serializers.Serializer):
4744
purls = serializers.ListField(
4845
child=serializers.CharField(),
49-
required=False,
50-
default=list,
46+
required=True,
5147
)
5248
details = serializers.BooleanField(default=False)
5349
ignore_qualifiers_subpath = serializers.BooleanField(default=False)
@@ -61,6 +57,14 @@ def validate(self, data):
6157
)
6258
return data
6359

60+
def to_internal_value(self, data):
61+
unknown = set(data.keys()) - set(self.fields.keys())
62+
63+
if unknown:
64+
raise serializers.ValidationError({field: ["Unknown field."] for field in unknown})
65+
66+
return super().to_internal_value(data)
67+
6468

6569
class AdvisoryQuerySerializer(serializers.Serializer):
6670
purls = serializers.ListField(
@@ -397,8 +401,26 @@ def create(self, request, *args, **kwargs):
397401
),
398402
"weaknesses",
399403
"aliases",
400-
"related_ssvcs__source_advisory",
401-
"source_ssvcs__source_advisory",
404+
Prefetch(
405+
"related_ssvcs",
406+
queryset=SSVC.objects.only(
407+
"id",
408+
"vector",
409+
"decision",
410+
"options",
411+
"source_advisory__url",
412+
),
413+
),
414+
Prefetch(
415+
"source_ssvcs",
416+
queryset=SSVC.objects.only(
417+
"id",
418+
"vector",
419+
"decision",
420+
"options",
421+
"source_advisory__url",
422+
),
423+
),
402424
)
403425

404426
page = self.paginate_queryset(latest_advisories)

vulnerabilities/models.py

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,83 +2944,72 @@ def latest_for_avids_completely_imported_advisories(self, avids):
29442944
return self.get(avid__in=avids, is_latest=True, _all_impacts_unfurled_at__isnull=False)
29452945

29462946
def latest_affecting_advisories_for_purl(self, purl):
2947-
adv_ids = ImpactedPackage.objects.filter(
2948-
affecting_packages__package_url=purl,
2949-
advisory__is_latest=True,
2950-
advisory___all_impacts_unfurled_at__isnull=False,
2951-
).values_list("advisory_id", flat=True)
2947+
adv_ids = ImpactedPackageAffecting.objects.filter(
2948+
package__package_url=purl,
2949+
impacted_package__advisory__is_latest=True,
2950+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
2951+
).values_list("impacted_package__advisory_id", flat=True)
29522952

29532953
return self.filter(id__in=Subquery(adv_ids))
29542954

29552955
def latest_affecting_advisories_for_purls(self, purls):
2956-
adv_ids = ImpactedPackage.objects.filter(
2957-
affecting_packages__package_url__in=purls,
2958-
advisory__is_latest=True,
2959-
advisory___all_impacts_unfurled_at__isnull=False,
2956+
adv_ids = ImpactedPackageAffecting.objects.filter(
2957+
package__package_url__in=purls,
2958+
impacted_package__advisory__is_latest=True,
2959+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
29602960
).values_list(
2961-
"advisory_id",
2961+
"impacted_package__advisory_id",
29622962
flat=True,
29632963
)
29642964
return self.filter(id__in=Subquery(adv_ids))
29652965

29662966
def latest_affecting_advisory_purls_pairs(self, purls):
29672967
return (
2968-
ImpactedPackage.objects.filter(
2969-
affecting_packages__package_url__in=purls,
2970-
advisory__is_latest=True,
2971-
advisory___all_impacts_unfurled_at__isnull=False,
2968+
ImpactedPackageAffecting.objects.filter(
2969+
package__package_url__in=purls,
2970+
impacted_package__advisory__is_latest=True,
2971+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
29722972
)
29732973
.values_list(
2974-
"affecting_packages__package_url",
2975-
"advisory_id",
2974+
"package__package_url",
2975+
"impacted_package__advisory_id",
29762976
)
29772977
.distinct()
29782978
)
29792979

2980-
def latest_affecting_advisories_for_packages(self, packages):
2981-
adv_ids = ImpactedPackage.objects.filter(
2982-
affecting_packages__in=packages,
2983-
advisory__is_latest=True,
2984-
advisory___all_impacts_unfurled_at__isnull=False,
2985-
).values_list(
2986-
"advisory_id",
2987-
flat=True,
2988-
)
2989-
return self.filter(id__in=Subquery(adv_ids))
2990-
29912980
def latest_fixed_by_advisories_for_purl(self, purl):
2992-
adv_ids = ImpactedPackage.objects.filter(
2993-
fixed_by_packages__package_url=purl,
2994-
advisory__is_latest=True,
2995-
advisory___all_impacts_unfurled_at__isnull=False,
2981+
adv_ids = ImpactedPackageFixedBy.objects.filter(
2982+
package__package_url=purl,
2983+
impacted_package__advisory__is_latest=True,
2984+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
29962985
).values_list(
2997-
"advisory_id",
2986+
"impacted_package__advisory_id",
29982987
flat=True,
29992988
)
30002989
return self.filter(id__in=Subquery(adv_ids))
30012990

30022991
def latest_fixed_by_advisories_for_purls(self, purls):
3003-
adv_ids = ImpactedPackage.objects.filter(
3004-
fixed_by_packages__package_url__in=purls,
3005-
advisory__is_latest=True,
3006-
advisory___all_impacts_unfurled_at__isnull=False,
2992+
adv_ids = ImpactedPackageFixedBy.objects.filter(
2993+
package_url__in=purls,
2994+
impacted_package__advisory__is_latest=True,
2995+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
30072996
).values_list(
3008-
"advisory_id",
2997+
"impacted_package__advisory_id",
30092998
flat=True,
30102999
)
30113000

30123001
return self.filter(id__in=Subquery(adv_ids))
30133002

30143003
def latest_fixed_by_advisory_purls_pairs(self, purls):
30153004
return (
3016-
ImpactedPackage.objects.filter(
3017-
fixed_by_packages__package_url__in=purls,
3018-
advisory__is_latest=True,
3019-
advisory___all_impacts_unfurled_at__isnull=False,
3005+
ImpactedPackageFixedBy.objects.filter(
3006+
package__package_url__in=purls,
3007+
impacted_package__advisory__is_latest=True,
3008+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
30203009
)
30213010
.values_list(
3022-
"fixed_by_packages__package_url",
3023-
"advisory_id",
3011+
"package__package_url",
3012+
"impacted_package__advisory_id",
30243013
)
30253014
.distinct()
30263015
)
@@ -3621,10 +3610,10 @@ def with_is_vulnerable(self):
36213610
"""
36223611
return self.annotate(
36233612
is_vulnerable=Exists(
3624-
ImpactedPackage.objects.filter(
3625-
affecting_packages__pk=OuterRef("pk"),
3626-
advisory__is_latest=True,
3627-
advisory___all_impacts_unfurled_at__isnull=False,
3613+
ImpactedPackageAffecting.objects.filter(
3614+
package__pk=OuterRef("pk"),
3615+
impacted_package__advisory__is_latest=True,
3616+
impacted_package__advisory___all_impacts_unfurled_at__isnull=False,
36283617
)
36293618
)
36303619
)

0 commit comments

Comments
 (0)