|
30 | 30 | from dateutil import parser as dateparser |
31 | 31 | from django.db.models.query import QuerySet |
32 | 32 | from packageurl import PackageURL |
| 33 | +from univers.version_range import RANGE_CLASS_BY_SCHEMES |
33 | 34 | from univers.version_range import build_range_from_github_advisory_constraint |
34 | 35 |
|
35 | 36 | from vulnerabilities import severity_systems |
|
153 | 154 | severity |
154 | 155 | publishedAt |
155 | 156 | } |
| 157 | + firstPatchedVersion{ |
| 158 | + identifier |
| 159 | + } |
156 | 160 | package { |
157 | 161 | name |
158 | 162 | } |
@@ -236,43 +240,42 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: |
236 | 240 | return |
237 | 241 |
|
238 | 242 | for vulnerability in vulnerabilities: |
239 | | - affected_packages = [] |
240 | 243 | aliases = set() |
241 | 244 | github_advisory = get_item(vulnerability, "node") |
242 | 245 | if not github_advisory: |
243 | 246 | logger.error(f"No node found in {vulnerability!r}") |
244 | 247 | continue |
245 | | - |
246 | 248 | name = get_item(github_advisory, "package", "name") |
247 | | - if not name: |
248 | | - logger.error(f"No name found in {github_advisory!r}") |
249 | | - continue |
250 | | - |
251 | | - purl = get_purl(pkg_type=package_type, github_name=name) |
252 | | - if not purl: |
253 | | - continue |
254 | | - |
255 | | - vulnerable_range = get_item(github_advisory, "vulnerableVersionRange") |
256 | | - if not vulnerable_range: |
257 | | - logger.error(f"No affected range found in {github_advisory!r}") |
258 | | - continue |
259 | | - |
260 | | - affected_range = None |
261 | | - try: |
262 | | - affected_range = build_range_from_github_advisory_constraint( |
263 | | - package_type, vulnerable_range |
264 | | - ) |
265 | | - except InvalidVersionRange: |
266 | | - logger.error(f"Could not parse affected range {vulnerable_range!r}") |
267 | | - continue |
268 | | - |
269 | | - if affected_range != NotImplementedError: |
270 | | - affected_packages.append( |
271 | | - AffectedPackage( |
272 | | - package=purl, |
273 | | - affected_version_range=affected_range, |
| 249 | + if name: |
| 250 | + purl = get_purl(pkg_type=package_type, github_name=name) |
| 251 | + if purl: |
| 252 | + affected_range = get_item(github_advisory, "vulnerableVersionRange") |
| 253 | + fixed_version = get_item(github_advisory, "firstPatchedVersion", "identifier") |
| 254 | + if affected_range: |
| 255 | + try: |
| 256 | + affected_range = build_range_from_github_advisory_constraint( |
| 257 | + package_type, affected_range |
| 258 | + ) |
| 259 | + except InvalidVersionRange as e: |
| 260 | + logger.error(f"Could not parse affected range {affected_range!r} {e!r}") |
| 261 | + affected_range = None |
| 262 | + if fixed_version: |
| 263 | + try: |
| 264 | + fixed_version = RANGE_CLASS_BY_SCHEMES[package_type].version_class( |
| 265 | + fixed_version |
| 266 | + ) |
| 267 | + except Exception as e: |
| 268 | + logger.error(f"Invalid fixed version {fixed_version!r} {e!r}") |
| 269 | + fixed_version = None |
| 270 | + affected_packages = [] |
| 271 | + if affected_range or fixed_version: |
| 272 | + affected_packages.append( |
| 273 | + AffectedPackage( |
| 274 | + package=purl, |
| 275 | + affected_version_range=affected_range, |
| 276 | + fixed_version=fixed_version, |
| 277 | + ) |
274 | 278 | ) |
275 | | - ) |
276 | 279 |
|
277 | 280 | advisory = get_item(github_advisory, "advisory") |
278 | 281 | if not advisory: |
|
0 commit comments