Skip to content

Commit a6be088

Browse files
committed
Fix package filtering by PURL and Advisory ID
Fixes: #1960 Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent c5b78ef commit a6be088

File tree

1 file changed

+43
-33
lines changed

1 file changed

+43
-33
lines changed

vulnerabilities/api_v2.py

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
from vulnerabilities.throttling import PermissionBasedUserRateThrottle
4444

4545

46+
class CharInFilter(filters.BaseInFilter, filters.CharFilter):
47+
pass
48+
49+
4650
class WeaknessV2Serializer(serializers.ModelSerializer):
4751
cwe_id = serializers.CharField()
4852
name = serializers.CharField()
@@ -374,9 +378,24 @@ class PackageV2FilterSet(filters.FilterSet):
374378

375379

376380
class AdvisoryPackageV2FilterSet(filters.FilterSet):
377-
affected_by_vulnerability = filters.CharFilter(field_name="affected_by_advisory__advisory_id")
378-
fixing_vulnerability = filters.CharFilter(field_name="fixing_advisories__advisory_id")
379-
purl = filters.CharFilter(field_name="package_url")
381+
affected_by_advisory = filters.CharFilter(
382+
field_name="affected_in_impacts__advisory__avid",
383+
label="Affected By Advisory ID",
384+
help_text="Filter packages affected by a specific Advisory ID.",
385+
)
386+
387+
fixing_advisory = filters.CharFilter(
388+
field_name="fixed_in_impacts__advisory__avid",
389+
label="Fixed By Advisory ID",
390+
help_text="Filter packages fixed by a specific Advisory ID.",
391+
)
392+
393+
purls = CharInFilter(
394+
field_name="package_url",
395+
lookup_expr="in",
396+
label="Package URL",
397+
help_text="Filter by one or more Package URLs. Multi-value supported (comma-separated).",
398+
)
380399

381400

382401
class PackageV2ViewSet(viewsets.ReadOnlyModelViewSet):
@@ -961,42 +980,33 @@ def get_view_name(self):
961980

962981

963982
class AdvisoriesPackageV2ViewSet(viewsets.ReadOnlyModelViewSet):
964-
queryset = (
965-
PackageV2.objects.all()
966-
.prefetch_related(
967-
Prefetch(
968-
"affected_in_impacts",
969-
queryset=ImpactedPackage.objects.select_related("advisory").prefetch_related(
970-
"fixed_by_packages",
971-
),
972-
),
973-
Prefetch(
974-
"fixed_in_impacts",
975-
queryset=ImpactedPackage.objects.select_related("advisory"),
976-
),
977-
)
978-
.with_is_vulnerable()
979-
)
983+
queryset = PackageV2.objects.all()
980984
serializer_class = AdvisoryPackageV2Serializer
981-
filter_backends = (filters.DjangoFilterBackend,)
985+
filter_backends = [filters.DjangoFilterBackend]
982986
filterset_class = AdvisoryPackageV2FilterSet
983987

984988
def get_queryset(self):
985-
queryset = super().get_queryset()
986-
package_purls = self.request.query_params.getlist("purl")
987-
affected_by_advisory = self.request.query_params.get("affected_by_advisory")
988-
fixing_advisory = self.request.query_params.get("fixing_advisory")
989-
if package_purls:
990-
queryset = queryset.filter(package_url__in=package_purls)
991-
if affected_by_advisory:
992-
queryset = queryset.filter(affected_by_advisories__advisory_id=affected_by_advisory)
993-
if fixing_advisory:
994-
queryset = queryset.filter(fixing_advisories__advisory=fixing_advisory)
995-
return queryset.with_is_vulnerable()
989+
return (
990+
super()
991+
.get_queryset()
992+
.prefetch_related(
993+
Prefetch(
994+
"affected_in_impacts",
995+
queryset=ImpactedPackage.objects.select_related("advisory").prefetch_related(
996+
"fixed_by_packages",
997+
),
998+
),
999+
Prefetch(
1000+
"fixed_in_impacts",
1001+
queryset=ImpactedPackage.objects.select_related("advisory"),
1002+
),
1003+
)
1004+
.with_is_vulnerable()
1005+
)
9961006

9971007
def list(self, request, *args, **kwargs):
998-
queryset = self.get_queryset()
999-
page = self.paginate_queryset(queryset)
1008+
filtered_queryset = self.filter_queryset(self.get_queryset())
1009+
page = self.paginate_queryset(filtered_queryset)
10001010

10011011
advisories = set()
10021012
if page is not None:

0 commit comments

Comments
 (0)