Skip to content

Commit b647d21

Browse files
authored
Merge pull request #1354 from nexB/1349-use-fetchcode-package-versions
Drop package_managers in favour of fetchcode.package_versions
2 parents 5fb36dc + 2326a09 commit b647d21

File tree

16 files changed

+578
-14071
lines changed

16 files changed

+578
-14071
lines changed

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ websocket-client==0.59.0
113113
yarl==1.7.2
114114
zipp==3.8.0
115115
dateparser==1.1.1
116-
fetchcode==0.2.0
116+
fetchcode==0.3.0
117117
cwe2==2.0.0
118118
drf-spectacular-sidecar==2022.10.1
119119
drf-spectacular==0.24.2

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ install_requires =
9090
# networking
9191
GitPython>=3.1.17
9292
requests>=2.25.1
93-
fetchcode>=0.2.0
93+
fetchcode>=0.3.0
9494

9595
#vulntotal
9696
python-dotenv

vulnerabilities/importers/istio.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
from vulnerabilities.improver import Improver
3535
from vulnerabilities.improver import Inference
3636
from vulnerabilities.models import Advisory
37-
from vulnerabilities.package_managers import GitHubTagsAPI
38-
from vulnerabilities.package_managers import VersionAPI
3937
from vulnerabilities.utils import AffectedPackage as LegacyAffectedPackage
4038
from vulnerabilities.utils import get_affected_packages_by_patched_package
4139
from vulnerabilities.utils import nearest_patched_package

vulnerabilities/improvers/valid_versions.py

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from django.db.models import Q
1919
from django.db.models.query import QuerySet
20+
from fetchcode import package_versions
2021
from packageurl import PackageURL
2122
from univers.versions import NginxVersion
2223

@@ -41,12 +42,6 @@
4142
from vulnerabilities.improver import Improver
4243
from vulnerabilities.improver import Inference
4344
from vulnerabilities.models import Advisory
44-
from vulnerabilities.package_managers import GitHubTagsAPI
45-
from vulnerabilities.package_managers import GoproxyVersionAPI
46-
from vulnerabilities.package_managers import PackageVersion
47-
from vulnerabilities.package_managers import VersionAPI
48-
from vulnerabilities.package_managers import get_api_package_name
49-
from vulnerabilities.package_managers import get_version_fetcher
5045
from vulnerabilities.utils import AffectedPackage as LegacyAffectedPackage
5146
from vulnerabilities.utils import clean_nginx_git_tag
5247
from vulnerabilities.utils import evolve_purl
@@ -58,14 +53,11 @@
5853
logger = logging.getLogger(__name__)
5954

6055

61-
@dataclasses.dataclass(order=True)
56+
@dataclasses.dataclass(order=True, init=False)
6257
class ValidVersionImprover(Improver):
6358
importer: Importer
6459
ignorable_versions: List[str] = dataclasses.field(default_factory=list)
6560

66-
def __init__(self) -> None:
67-
self.versions_fetcher_by_purl: Mapping[str, VersionAPI] = {}
68-
6961
@property
7062
def interesting_advisories(self) -> QuerySet:
7163
return Advisory.objects.filter(Q(created_by=self.importer.qualified_name)).paginated()
@@ -74,21 +66,16 @@ def get_package_versions(
7466
self, package_url: PackageURL, until: Optional[datetime] = None
7567
) -> List[str]:
7668
"""
77-
Return a list of `valid_versions` for the `package_url`
69+
Return a list of versions published before `until` for the `package_url`
7870
"""
79-
api_name = get_api_package_name(package_url)
80-
if not api_name:
81-
logger.error(f"Could not get versions for {package_url!r}")
82-
return []
83-
versions_fetcher = self.versions_fetcher_by_purl.get(package_url)
84-
if not versions_fetcher:
85-
versions_fetcher = get_version_fetcher(package_url)
86-
self.versions_fetcher_by_purl[package_url] = versions_fetcher()
87-
88-
versions_fetcher = self.versions_fetcher_by_purl[package_url]
71+
versions = package_versions.versions(str(package_url))
72+
versions_before_until = []
73+
for version in versions or []:
74+
if until and version.release_date and version.release_date > until:
75+
continue
76+
versions_before_until.append(version.value)
8977

90-
self.versions_fetcher_by_purl[package_url] = versions_fetcher
91-
return versions_fetcher.get_until(package_name=api_name, until=until).valid_versions
78+
return versions_before_until
9279

9380
def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
9481
"""
@@ -163,15 +150,6 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
163150
fixed_purl=fixed_purl,
164151
)
165152
else:
166-
if purl.type == "golang":
167-
# Problem with the Golang and Go that they provide full path
168-
# FIXME: We need to get the PURL subpath for Go module
169-
versions_fetcher = self.versions_fetcher_by_purl.get(purl)
170-
if not versions_fetcher:
171-
versions_fetcher = GoproxyVersionAPI()
172-
self.versions_fetcher_by_purl[purl] = versions_fetcher
173-
pkg_name = versions_fetcher.module_name_by_package_name.get(pkg_name, pkg_name)
174-
175153
valid_versions = self.get_package_versions(
176154
package_url=purl, until=advisory_data.date_published
177155
)
@@ -248,11 +226,10 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
248226
)
249227

250228
def get_inferences_from_versions(
251-
self, advisory_data: AdvisoryData, all_versions: List[PackageVersion]
229+
self, advisory_data: AdvisoryData, all_versions: List[str]
252230
) -> Iterable[Inference]:
253231
"""
254-
Yield inferences given an ``advisory_data`` and a ``all_versions`` of
255-
PackageVersion.
232+
Yield inferences given an ``advisory_data`` and a ``all_versions``.
256233
"""
257234

258235
try:
@@ -268,9 +245,9 @@ def get_inferences_from_versions(
268245

269246
affected_purls = []
270247
for affected_version_range in affected_version_ranges:
271-
for package_version in all_versions:
248+
for version in all_versions:
272249
# FIXME: we should reference an NginxVersion tbd in univers
273-
version = NginxVersion(package_version.value)
250+
version = NginxVersion(version)
274251
if is_vulnerable_nginx_version(
275252
version=version,
276253
affected_version_range=affected_version_range,
@@ -294,12 +271,12 @@ def get_inferences_from_versions(
294271

295272
def fetch_nginx_version_from_git_tags(self):
296273
"""
297-
Yield all nginx PackageVersion from its git tags.
274+
Yield all nginx version from its git tags.
298275
"""
299-
nginx_versions = GitHubTagsAPI().fetch("nginx/nginx")
300-
for version in nginx_versions:
276+
nginx_versions = package_versions.versions("pkg:github/nginx/nginx")
277+
for version in nginx_versions or []:
301278
cleaned = clean_nginx_git_tag(version.value)
302-
yield PackageVersion(value=cleaned, release_date=version.release_date)
279+
yield cleaned
303280

304281

305282
class ApacheHTTPDImprover(ValidVersionImprover):

0 commit comments

Comments
 (0)