Skip to content

Commit 912f6a6

Browse files
authored
Universal PyPI package checker (#1199)
* Let progress bar run only for a package list * Add universal checker for almost all python packages
1 parent 4e13b8e commit 912f6a6

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

cve_bin_tool/package_list_parser/vendor_fetch.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,33 @@ def get_vendor_product_pairs(self, package_names):
2323
SELECT DISTINCT vendor FROM cve_range
2424
WHERE product=?
2525
"""
26-
for package_name in track(
27-
package_names, description="Processing the given list...."
28-
):
29-
self.cursor.execute(query, [package_name["name"].lower()])
26+
# For python package checkers we don't need the progress bar running
27+
if type(package_names) != list:
28+
package_name = package_names # Since package names will only have the 'package name' in it
29+
self.cursor.execute(query, [package_name])
3030
vendors = list(map(lambda x: x[0], self.cursor.fetchall()))
3131
for vendor in vendors:
3232
if vendor != "":
3333
vendor_package_pairs.append(
3434
{
3535
"vendor": vendor,
36-
"product": package_name["name"],
36+
"product": package_name,
3737
}
3838
)
39+
else:
40+
for package_name in track(
41+
package_names, description="Processing the given list...."
42+
):
43+
self.cursor.execute(query, [package_name["name"].lower()])
44+
vendors = list(map(lambda x: x[0], self.cursor.fetchall()))
45+
for vendor in vendors:
46+
if vendor != "":
47+
vendor_package_pairs.append(
48+
{
49+
"vendor": vendor,
50+
"product": package_name["name"],
51+
}
52+
)
3953
return vendor_package_pairs
4054

4155
def __enter__(self):

cve_bin_tool/version_scanner.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import os
55
import subprocess
66
import sys
7+
from re import search
78

89
import pkg_resources
910

@@ -12,6 +13,7 @@
1213
from cve_bin_tool.extractor import Extractor
1314
from cve_bin_tool.file import is_binary
1415
from cve_bin_tool.log import LOGGER
16+
from cve_bin_tool.package_list_parser.vendor_fetch import VendorFetch
1517
from cve_bin_tool.strings import Strings
1618
from cve_bin_tool.util import DirWalk, ProductInfo, inpath
1719

@@ -145,9 +147,34 @@ def scan_file(self, filename):
145147
lines[0] = (
146148
"--generated pattern for cve-bin-tool " + lines[0] + " " + lines[1]
147149
)
150+
yield from self.run_python_package_checkers(filename, lines)
148151

149152
yield from self.run_checkers(filename, lines)
150153

154+
def run_python_package_checkers(self, filename, lines):
155+
"""
156+
This function runs only for python packages.
157+
There are no actual checkers.
158+
The ProductInfo is computed without the help of any checkers from PKG-INFO or METADATA.
159+
"""
160+
product = search(
161+
r"--generated pattern for cve-bin-tool Name: (.+?) Version:", lines[0]
162+
).group(1)
163+
version = search(r"Version: (.+?)$", lines[1]).group(1)
164+
165+
with VendorFetch() as vendor_fetch:
166+
vendor_package_pair = vendor_fetch.get_vendor_product_pairs(product)
167+
168+
if vendor_package_pair != []:
169+
vendor = vendor_package_pair[0]["vendor"]
170+
file_path = "".join(self.file_stack)
171+
172+
self.logger.info(f"{file_path} is {product} {version}")
173+
174+
yield ProductInfo(vendor, product, version), file_path
175+
176+
self.logger.debug(f"Done scanning file: {filename}")
177+
151178
def run_checkers(self, filename, lines):
152179
# tko
153180
for (dummy_checker_name, checker) in self.checkers.items():

0 commit comments

Comments
 (0)