Lookup for vulnerable packages by Package URL.
| 462 | |
| 463 | |
| 464 | class PackageViewSet(viewsets.ReadOnlyModelViewSet): |
| 465 | """ |
| 466 | Lookup for vulnerable packages by Package URL. |
| 467 | """ |
| 468 | |
| 469 | queryset = Package.objects.all() |
| 470 | serializer_class = PackageSerializer |
| 471 | filter_backends = (filters.DjangoFilterBackend,) |
| 472 | filterset_class = PackageFilterSet |
| 473 | throttle_classes = [PermissionBasedUserRateThrottle] |
| 474 | |
| 475 | def get_queryset(self): |
| 476 | return super().get_queryset().with_is_vulnerable() |
| 477 | |
| 478 | @extend_schema( |
| 479 | request=PackageBulkSearchRequestSerializer, |
| 480 | responses={200: PackageSerializer(many=True)}, |
| 481 | ) |
| 482 | @action( |
| 483 | detail=False, |
| 484 | methods=["post"], |
| 485 | serializer_class=PackageBulkSearchRequestSerializer, |
| 486 | filter_backends=[], |
| 487 | pagination_class=None, |
| 488 | ) |
| 489 | def bulk_search(self, request): |
| 490 | """ |
| 491 | Lookup for vulnerable packages using many Package URLs at once. |
| 492 | """ |
| 493 | serializer = self.serializer_class(data=request.data) |
| 494 | if not serializer.is_valid(): |
| 495 | return Response( |
| 496 | status=status.HTTP_400_BAD_REQUEST, |
| 497 | data={ |
| 498 | "error": serializer.errors, |
| 499 | "message": "A non-empty 'purls' list of PURLs is required.", |
| 500 | }, |
| 501 | ) |
| 502 | validated_data = serializer.validated_data |
| 503 | purls = validated_data.get("purls") |
| 504 | purl_only = validated_data.get("purl_only", False) |
| 505 | plain_purl = validated_data.get("plain_purl", False) |
| 506 | |
| 507 | if plain_purl: |
| 508 | purl_objects = [PackageURL.from_string(purl) for purl in purls] |
| 509 | plain_purl_objects = [ |
| 510 | PackageURL( |
| 511 | type=purl.type, |
| 512 | namespace=purl.namespace, |
| 513 | name=purl.name, |
| 514 | version=purl.version, |
| 515 | ) |
| 516 | for purl in purl_objects |
| 517 | ] |
| 518 | plain_purls = [str(purl) for purl in plain_purl_objects] |
| 519 | |
| 520 | query = ( |
| 521 | Package.objects.filter(plain_package_url__in=plain_purls) |