Skip to content

Commit ee6dd62

Browse files
committed
initialize hexapi with cache and sort imports
Signed-off-by: Tushar912 <tushar.912u@gmail.com>
1 parent 922e34f commit ee6dd62

2 files changed

Lines changed: 62 additions & 97 deletions

File tree

vulnerabilities/importers/elixir_security.py

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,13 @@
1717
# OR CONDITIONS OF ANY KIND, either express or implied. No content created from
1818
# VulnerableCode should be considered or used as legal advice. Consult an Attorney
1919
# for any legal advice.
20-
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
20+
# VulnerableCode is a free software tool from nexB Inc. and others.
2121
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222

2323
import asyncio
24-
import yaml
25-
import json
26-
import requests
27-
import re
28-
from typing import Set
29-
from typing import List
24+
from typing import List, Set
3025

26+
import yaml
3127
from dephell_specifier import RangeSpecifier
3228
from packageurl import PackageURL
3329

@@ -74,23 +70,18 @@ def collect_packages(self):
7470
packages = set()
7571
files = self._updated_files.union(self._added_files)
7672
for f in files:
77-
with open(f) as file:
78-
data = yaml.safe_load(file)
79-
if data.get("package"):
80-
packages.add(data["package"])
73+
data = load_yaml(f)
74+
if data.get("package"):
75+
packages.add(data["package"])
8176

8277
return packages
8378

84-
def generate_all_version_list(self, pkg_name):
79+
def get_versions_from_range(self, version_list, pkg_name):
80+
pkg_versions = []
8581
if not getattr(self, 'pkg_manager_api', None):
8682
self.pkg_manager_api = HexVersionAPI()
87-
version_list = self.pkg_manager_api.get(
83+
all_version_list = self.pkg_manager_api.get(
8884
pkg_name)
89-
return version_list
90-
91-
def get_versions_from_range(self, version_list, pkg_name):
92-
pkg_versions = []
93-
all_version_list = self.generate_all_version_list(pkg_name)
9485
if version_list is None:
9586
return
9687
version_ranges = {RangeSpecifier(r) for r in version_list}
@@ -100,40 +91,49 @@ def get_versions_from_range(self, version_list, pkg_name):
10091
return pkg_versions
10192

10293
def process_file(self, path):
103-
with open(path) as f:
104-
yaml_file = yaml.safe_load(f)
105-
pkg_name = yaml_file["package"]
106-
safe_pkg_versions = []
107-
if yaml_file.get("unaffected_versions"):
108-
safe_pkg_versions = self.get_versions_from_range(
109-
yaml_file["patched_versions"] +
110-
yaml_file["unaffected_versions"],
111-
pkg_name,
112-
)
113-
else:
114-
safe_pkg_versions = self.get_versions_from_range(
115-
yaml_file["patched_versions"], pkg_name
116-
)
117-
118-
cve_id = "CVE-"+str(yaml_file["cve"])
119-
safe_purls = []
120-
if safe_pkg_versions is not None:
121-
safe_purls = {
122-
PackageURL(name=pkg_name, type="hex", version=version)
123-
for version in safe_pkg_versions
124-
}
125-
126-
vuln_reference = [
127-
Reference(
128-
reference_id=yaml_file["id"],
129-
url=yaml_file["link"],
130-
)
131-
]
132-
133-
return Advisory(
134-
summary=yaml_file["description"],
135-
impacted_package_urls=[],
136-
resolved_package_urls=safe_purls,
137-
cve_id=cve_id,
138-
vuln_references=vuln_reference,
94+
yaml_file = load_yaml(path)
95+
pkg_name = yaml_file["package"]
96+
safe_pkg_versions = []
97+
if yaml_file.get("unaffected_versions"):
98+
safe_pkg_versions = self.get_versions_from_range(
99+
yaml_file["patched_versions"] +
100+
yaml_file["unaffected_versions"],
101+
pkg_name,
102+
)
103+
else:
104+
safe_pkg_versions = self.get_versions_from_range(
105+
yaml_file["patched_versions"], pkg_name
106+
)
107+
if yaml_file.get('cve'):
108+
cve_id = "CVE-" + yaml_file["cve"]
109+
else:
110+
cve_id = ""
111+
112+
safe_purls = []
113+
if safe_pkg_versions is not None:
114+
safe_purls = {
115+
PackageURL(name=pkg_name, type="hex", version=version)
116+
for version in safe_pkg_versions
117+
}
118+
119+
vuln_reference = [
120+
Reference(
121+
reference_id=yaml_file["id"],
122+
),
123+
Reference(
124+
url=yaml_file["link"],
139125
)
126+
]
127+
128+
return Advisory(
129+
summary=yaml_file["description"],
130+
impacted_package_urls=[],
131+
resolved_package_urls=safe_purls,
132+
cve_id=cve_id,
133+
vuln_references=vuln_reference,
134+
)
135+
136+
137+
def load_yaml(path):
138+
with open(path) as f:
139+
return yaml.safe_load(f)

vulnerabilities/tests/test_elixir_security.py

Lines changed: 8 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,20 @@
1717
# OR CONDITIONS OF ANY KIND, either express or implied. No content created from
1818
# VulnerableCode should be considered or used as legal advice. Consult an Attorney
1919
# for any legal advice.
20-
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
20+
# VulnerableCode is a free software tool from nexB Inc. and others.
2121
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222

2323
import os
24-
from unittest import TestCase
25-
from unittest.mock import patch
2624
from collections import OrderedDict
25+
from unittest import TestCase
2726

28-
from vulnerabilities.data_source import Reference
2927
from packageurl import PackageURL
3028

3129
from vulnerabilities.data_source import Advisory
30+
from vulnerabilities.data_source import Reference
3231
from vulnerabilities.importers.elixir_security import ElixirSecurityDataSource
3332
from vulnerabilities.package_managers import HexVersionAPI
3433

35-
3634
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
3735

3836

@@ -43,26 +41,7 @@ def setUpClass(cls):
4341
"repository_url": 'https://github.com/dependabot/elixir-security-advisories',
4442
}
4543
cls.data_src = ElixirSecurityDataSource(1, config=data_source_cfg)
46-
cls.data_src.pkg_manager_api = HexVersionAPI()
47-
48-
@patch('vulnerabilities.package_managers.HexVersionAPI.get',
49-
return_value=[
50-
"0.5.2",
51-
"0.5.1",
52-
"0.5.0",
53-
"0.4.0",
54-
"0.3.1",
55-
"0.3.0",
56-
"0.2.0",
57-
"0.1.3",
58-
"0.1.2",
59-
"0.1.1",
60-
"0.1.0",
61-
])
62-
def test_generate_all_version_list(self, mock_write):
63-
package = "coherence"
64-
actual_list = self.data_src.generate_all_version_list(package)
65-
expected_list = [
44+
cls.data_src.pkg_manager_api = HexVersionAPI({'coherence': [
6645
"0.5.2",
6746
"0.5.1",
6847
"0.5.0",
@@ -74,24 +53,9 @@ def test_generate_all_version_list(self, mock_write):
7453
"0.1.2",
7554
"0.1.1",
7655
"0.1.0",
77-
]
78-
assert actual_list == expected_list
56+
]})
7957

80-
@patch('vulnerabilities.package_managers.HexVersionAPI.get',
81-
return_value=[
82-
"0.5.2",
83-
"0.5.1",
84-
"0.5.0",
85-
"0.4.0",
86-
"0.3.1",
87-
"0.3.0",
88-
"0.2.0",
89-
"0.1.3",
90-
"0.1.2",
91-
"0.1.1",
92-
"0.1.0",
93-
])
94-
def test_process_file(self, mock_write):
58+
def test_process_file(self):
9559

9660
path = os.path.join(BASE_DIR, "test_data/elixir_security/test_file.yml")
9761
expected_data = Advisory(
@@ -108,7 +72,8 @@ def test_process_file(self, mock_write):
10872
},
10973
vuln_references=[
11074
Reference(reference_id='2aae6e3a-24a3-4d5f-86ff-b964eaf7c6d1',
111-
url="https://github.com/smpallen99/coherence/issues/270")
75+
),
76+
Reference(url='https://github.com/smpallen99/coherence/issues/270')
11277
],
11378
cve_id="CVE-2018-20301",
11479
)

0 commit comments

Comments
 (0)