|
1 | | -# Copyright (c) 2017 nexB Inc. and others. All rights reserved. |
| 1 | +# Copyright (c) nexB Inc. and others. All rights reserved. |
2 | 2 | # http://nexb.com and https://github.com/nexB/vulnerablecode/ |
3 | 3 | # The VulnerableCode software is licensed under the Apache License version 2.0. |
4 | 4 | # Data generated with VulnerableCode require an acknowledgment. |
|
26 | 26 | import requests |
27 | 27 | from typing import Set |
28 | 28 | from typing import List |
29 | | - |
| 29 | +from dephell_specifier import RangeSpecifier |
30 | 30 | from packageurl import PackageURL |
31 | 31 |
|
32 | 32 | from vulnerabilities.data_source import GitDataSource |
@@ -63,32 +63,24 @@ def added_advisories(self) -> Set[Advisory]: |
63 | 63 | return self.batch_advisories(advisories) |
64 | 64 |
|
65 | 65 | @staticmethod |
66 | | - def generate_all_versions_list(pkg_name): |
| 66 | + def generate_all_version_list(pkg_name): |
67 | 67 | resp = requests.get(f"https://hex.pm/api/packages/{pkg_name}") |
68 | 68 | resp = resp.content |
69 | 69 | json_resp = json.loads(resp) |
70 | | - versions_list = [] |
| 70 | + version_list = [] |
71 | 71 | for release in json_resp["releases"]: |
72 | | - versions_list.append(release["version"]) |
73 | | - return versions_list |
| 72 | + version_list.append(release["version"]) |
| 73 | + return version_list |
74 | 74 |
|
75 | | - def get_pkg_from_range(self, versions_list, pkg_name): |
| 75 | + def get_pkg_from_range(self, version_list, pkg_name): |
76 | 76 | pkg_versions = [] |
77 | | - all_versions_list = self.generate_all_versions_list(pkg_name) |
78 | | - if versions_list is None: |
| 77 | + all_version_list = self.generate_all_version_list(pkg_name) |
| 78 | + if version_list is None: |
79 | 79 | return |
80 | | - for version in versions_list: |
81 | | - if re.match("^>=", version): |
82 | | - index = all_versions_list.index(version[3:]) |
83 | | - pkg_versions = pkg_versions + all_versions_list[0: index + 1] |
84 | | - elif re.match("^>", version): |
85 | | - index = all_versions_list.index(version[2:]) |
86 | | - pkg_versions = pkg_versions + all_versions_list[0:index] |
87 | | - elif re.match("^<", version): |
88 | | - index = all_versions_list.index(version[2:]) |
89 | | - pkg_versions = pkg_versions + all_versions_list[index + 1: -1] |
90 | | - else: |
91 | | - pkg_versions.append(version[3:]) |
| 80 | + version_ranges = {RangeSpecifier(r) for r in version_list} |
| 81 | + for version in all_version_list: |
| 82 | + if any([version in v for v in version_ranges]): |
| 83 | + pkg_versions.append(version) |
92 | 84 | return pkg_versions |
93 | 85 |
|
94 | 86 | def process_file(self, path): |
|
0 commit comments