2323import logging
2424from io import BytesIO
2525from typing import Iterable
26+ from typing import List
2627from typing import Optional
2728from zipfile import ZipFile
2829
2930import dateparser
3031import requests
3132from packageurl import PackageURL
32- from univers .version_range import InvalidVersionRange
3333from univers .version_range import PypiVersionRange
3434from univers .versions import InvalidVersion
3535from univers .versions import PypiVersion
3636from univers .versions import SemverVersion
37+ from univers .versions import Version
3738
3839from vulnerabilities .helpers import dedupe
3940from vulnerabilities .importer import AdvisoryData
@@ -73,14 +74,22 @@ def parse_advisory_data(raw_data: dict) -> Optional[AdvisoryData]:
7374 raw_id = raw_data ["id" ]
7475 summary = raw_data .get ("summary" ) or ""
7576 aliases = get_aliases (raw_data )
77+ aliases .append (raw_id )
78+ aliases = dedupe (aliases )
7679 date_published = get_published_date (raw_data )
7780 severity = list (get_severities (raw_data ))
7881 references = get_references (raw_data , severity )
7982
8083 affected_packages = []
8184 if "affected" not in raw_data :
8285 logger .error (f"affected_packages not found - { raw_id !r} " )
83- return
86+ return AdvisoryData (
87+ aliases = aliases ,
88+ summary = summary ,
89+ references = references ,
90+ affected_packages = [],
91+ date_published = date_published ,
92+ )
8493
8594 for affected_pkg in raw_data .get ("affected" ) or []:
8695 purl = get_affected_purl (affected_pkg , raw_id )
@@ -110,7 +119,7 @@ def parse_advisory_data(raw_data: dict) -> Optional[AdvisoryData]:
110119 )
111120
112121
113- def fixed_filter (fixed_range ) -> [ ]:
122+ def fixed_filter (fixed_range ) -> Iterable [ str ]:
114123 """
115124 Return a list of fixed version strings given a ``fixed_range`` mapping of OSV data.
116125 >>> list(fixed_filter({"type": "SEMVER", "events": [{"introduced": "0"}, {"fixed": "1.6.0"}]}))
@@ -124,7 +133,7 @@ def fixed_filter(fixed_range) -> []:
124133 yield fixed
125134
126135
127- def get_aliases (raw_data ) -> [ ]:
136+ def get_aliases (raw_data ) -> List [ str ]:
128137 """
129138 aliases field is optional , id is required and these are all aliases from our perspective
130139 converting list of two fields to a dict then , convert it to a list to make sure a list is unique
@@ -147,7 +156,7 @@ def get_published_date(raw_data):
147156 return published and dateparser .parse (published )
148157
149158
150- def get_severities (raw_data ) -> [ ]:
159+ def get_severities (raw_data ) -> Iterable [ VulnerabilitySeverity ]:
151160 for sever_list in raw_data .get ("severity" ) or []:
152161 if sever_list .get ("type" ) == "CVSS_V3" :
153162 yield VulnerabilitySeverity (
@@ -173,7 +182,7 @@ def get_severities(raw_data) -> []:
173182 )
174183
175184
176- def get_references (raw_data , severities ) -> [ ]:
185+ def get_references (raw_data , severities ) -> List [ Reference ]:
177186 references = raw_data .get ("references" ) or []
178187 return [Reference (url = ref ["url" ], severities = severities ) for ref in references if ref ]
179188
@@ -199,14 +208,16 @@ def get_affected_version_range(affected_pkg, raw_id):
199208 affected_versions = affected_pkg .get ("versions" )
200209 if affected_versions :
201210 try :
202- return PypiVersionRange (affected_versions )
203- except InvalidVersionRange :
204- logger .error (f"InvalidVersionRange affected_pkg_version_range Error - { raw_id !r} " )
211+ return PypiVersionRange .from_versions (affected_versions )
212+ except Exception as e :
213+ logger .error (
214+ f"InvalidVersionRange affected_pkg_version_range Error - { raw_id !r} { e !r} "
215+ )
205216 else :
206217 logger .error (f"affected_pkg_version_range not found - { raw_id !r} " )
207218
208219
209- def get_fixed_version (fixed_range , raw_id ) -> [ ]:
220+ def get_fixed_version (fixed_range , raw_id ) -> List [ Version ]:
210221 """
211222 Return a list of fixed versions, using fixed_filter we get the list of fixed version strings,
212223 then we pass every element to their univers.versions , then we dedupe the result
0 commit comments