Skip to content

Commit 18f5850

Browse files
committed
Fix pysec importer
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent f71776b commit 18f5850

2 files changed

Lines changed: 468 additions & 151 deletions

File tree

vulnerabilities/importers/pysec.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,18 @@
2323
import logging
2424
from io import BytesIO
2525
from typing import Iterable
26+
from typing import List
2627
from typing import Optional
2728
from zipfile import ZipFile
2829

2930
import dateparser
3031
import requests
3132
from packageurl import PackageURL
32-
from univers.version_range import InvalidVersionRange
3333
from univers.version_range import PypiVersionRange
3434
from univers.versions import InvalidVersion
3535
from univers.versions import PypiVersion
3636
from univers.versions import SemverVersion
37+
from univers.versions import Version
3738

3839
from vulnerabilities.helpers import dedupe
3940
from 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

Comments
 (0)