77# See https://aboutcode.org for more information about nexB OSS projects.
88#
99
10+ import logging
1011from django .core .exceptions import ValidationError
1112from django .db .models import Q
1213from django_filters .rest_framework import FilterSet
4546
4647from univers import versions
4748from univers .version_range import RANGE_CLASS_BY_SCHEMES
48- from univers .version_range import InvalidVersionRange
49+ from univers .versions import InvalidVersion
4950from univers .version_range import VersionRange
51+ from univers .version_constraint import InvalidConstraintsError
5052
53+ logger = logging .getLogger (__name__ )
5154
5255class PackageResourcePurlFilter (Filter ):
5356 def filter (self , qs , value ):
@@ -405,8 +408,9 @@ def index_packages(self, request, *args, **kwargs):
405408 packages = request .data .get ('packages' ) or []
406409 queued_packages = []
407410 unqueued_packages = []
411+ supported_ecosystems = ["maven" , "npm" ]
408412
409- unique_purls , unsupported_packages , unsupported_vers = get_resolved_purls (packages )
413+ unique_purls , unsupported_packages , unsupported_vers = get_resolved_purls (packages , supported_ecosystems )
410414
411415 for purl in unique_purls :
412416 is_routable_purl = priority_router .is_routable (purl )
@@ -691,7 +695,7 @@ class PackageSetViewSet(viewsets.ReadOnlyModelViewSet):
691695 serializer_class = PackageSetAPISerializer
692696
693697
694- def get_resolved_purls (packages ):
698+ def get_resolved_purls (packages , supported_ecosystems ):
695699 """
696700 Take a list of dict containing purl or version-less purl along with vers
697701 and return a list of resolved purls, a list of unsupported purls, and a
@@ -718,7 +722,7 @@ def get_resolved_purls(packages):
718722 unique_resolved_purls .add (purl )
719723 continue
720724
721- if not vers :
725+ if not vers or parsed_purl . type not in supported_ecosystems :
722726 unsupported_purls .add (purl )
723727 continue
724728
@@ -749,18 +753,22 @@ def resolve_versions(parsed_purl, vers):
749753
750754 all_versions = get_all_versions (parsed_purl ) or []
751755
752- return [
753- str (
754- PackageURL (
755- type = parsed_purl .type ,
756- namespace = parsed_purl .namespace ,
757- name = parsed_purl .name ,
758- version = version .string ,
759- )
760- )
761- for version in all_versions
762- if version in version_range
763- ]
756+ result = []
757+ for version in all_versions :
758+ try :
759+ if version in version_range :
760+ package_url = PackageURL (
761+ type = parsed_purl .type ,
762+ namespace = parsed_purl .namespace ,
763+ name = parsed_purl .name ,
764+ version = version .string ,
765+ )
766+ result .append (str (package_url ))
767+ except InvalidConstraintsError :
768+ logger .warning (f"Invalid constraints sequence in '{ vers } ' for '{ parsed_purl } '" )
769+ return
770+
771+ return result
764772
765773def get_all_versions (purl : PackageURL ):
766774 """
@@ -778,10 +786,18 @@ def get_all_versions(purl: PackageURL):
778786 if not package_name or not versionAPI :
779787 return
780788
781- all_versions = versionAPI ().fetch (package_name )
789+ all_versions = versionAPI ().fetch (package_name ) or []
782790 versionClass = VERSION_CLASS_BY_PACKAGE_TYPE .get (purl .type )
783791
784- return [versionClass (package_version .value ) for package_version in all_versions ]
792+ result = []
793+ for package_version in all_versions :
794+ try :
795+ result .append (versionClass (package_version .value ))
796+ except InvalidVersion :
797+ logger .warning (f"Invalid version '{ package_version .value } ' for '{ purl } '" )
798+ pass
799+
800+ return result
785801
786802
787803VERSION_CLASS_BY_PACKAGE_TYPE = {pkg_type : range_class .version_class for pkg_type , range_class in RANGE_CLASS_BY_SCHEMES .items ()}
0 commit comments