Skip to content

Commit db628f0

Browse files
committed
Refactor safetydb wrt new models and simplify tests
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 677e18e commit db628f0

4 files changed

Lines changed: 129 additions & 187 deletions

File tree

vulnerabilities/importers/safety_db.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
from vulnerabilities.data_source import DataSourceConfiguration
4747
from vulnerabilities.data_source import Reference
4848
from vulnerabilities.package_managers import PypiVersionAPI
49+
from vulnerabilities.helpers import nearest_patched_package
4950

5051
logger = logging.getLogger(__name__)
5152

@@ -75,11 +76,8 @@ class SafetyDbDataSource(DataSource):
7576

7677
CONFIG_CLASS = SafetyDbConfiguration
7778

78-
def __init__(self, *args, **kwargs):
79-
super().__init__(*args, **kwargs)
80-
self._api_response = self._fetch()
81-
8279
def __enter__(self):
80+
self._api_response = self._fetch()
8381
self._versions = PypiVersionAPI()
8482
self.set_api(self.collect_packages())
8583

@@ -138,13 +136,15 @@ def updated_advisories(self) -> Set[Advisory]:
138136
vulnerability_id=cve_id,
139137
summary=advisory["advisory"],
140138
references=reference,
141-
impacted_package_urls=impacted_purls,
142-
resolved_package_urls=resolved_purls,
139+
affected_packages_with_patched_package=nearest_patched_package(
140+
impacted_purls, resolved_purls
141+
),
143142
)
144143
)
145144

146-
return self.batch_advisories(advisories)
145+
return advisories
147146

147+
# FIXME: This is duplicate code. Use the the helper instead.
148148
def create_etag(self, url):
149149
etag = requests.head(url).headers.get("ETag")
150150
if not etag:
@@ -158,6 +158,7 @@ def create_etag(self, url):
158158
return True
159159

160160

161+
# FIXME: This function is horribly named incorretly.
161162
def categorize_versions(
162163
package_name: str,
163164
all_versions: Set[str],
@@ -166,9 +167,7 @@ def categorize_versions(
166167
"""
167168
:return: impacted, resolved purls
168169
"""
169-
impacted_versions, impacted_purls = set(), set()
170-
# vurl_spec = f"pypi:{ ','.join(version_specs) }"
171-
# vurl_spec = VersionSpecifier.from_version_spec_string(vurl_spec)
170+
impacted_versions, impacted_purls = set(), []
172171
vurl_specs = []
173172
for version_spec in version_specs:
174173
vurl_specs.append(VersionSpecifier.from_scheme_version_spec_string("pypi", version_spec))
@@ -181,15 +180,15 @@ def categorize_versions(
181180

182181
if any([version_object in vurl_spec for vurl_spec in vurl_specs]):
183182
impacted_versions.add(version)
184-
impacted_purls.add(
183+
impacted_purls.append(
185184
PackageURL(
186185
name=package_name,
187186
type="pypi",
188187
version=version,
189188
)
190189
)
191190

192-
resolved_purls = set()
191+
resolved_purls = []
193192
for version in all_versions - impacted_versions:
194-
resolved_purls.add(PackageURL(name=package_name, type="pypi", version=version))
193+
resolved_purls.append(PackageURL(name=package_name, type="pypi", version=version))
195194
return impacted_purls, resolved_purls
Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,4 @@
11
{
2-
"ampache": [
3-
{
4-
"advisory": "ampache 4.0.0:\r\n* Resolves CVE-2019-12385 for the SQL Injection\r\n* Resolves CVE-2019-12386 for the persistent XSS\r\n* Resolves NS-18-046 Multiple Reflected Cross-site Scripting Vulnerabilities in Ampache 3.9.0",
5-
"cve": "CVE-2019-12385, CVE-2019-12386",
6-
"id": "pyup.io-37863",
7-
"specs": [
8-
"<4.0.0"
9-
],
10-
"v": "<4.0.0"
11-
}
12-
],
132
"django": [
143
{
154
"advisory": "The utils.http.is_safe_url function in Django before 1.4.20, 1.5.x, 1.6.x before 1.6.11, 1.7.x before 1.7.7, and 1.8.x before 1.8c1 does not properly validate URLs, which allows remote attackers to conduct cross-site scripting (XSS) attacks via a control character in a URL, as demonstrated by a \\x08javascript: URL.",
@@ -35,34 +24,5 @@
3524
],
3625
"v": ">=1.9,<1.9.8,==1.8.14,>=1.10,<1.10.2"
3726
}
38-
],
39-
"zulip": [
40-
{
41-
"advisory": "Zulip 2.1.0 improves default nginx TLS settings for stronger security.",
42-
"cve": null,
43-
"id": "pyup.io-38115",
44-
"specs": [
45-
"<2.1.0"
46-
],
47-
"v": "<2.1.0"
48-
},
49-
{
50-
"advisory": "Zulip 2.1.2 includes a corrected fix for CVE-2019-19775 (the original fix was affected by an unfixed security bug in Python's urllib, CVE-2015-2104). It also adds authentication for redis and memcached even in configurations where these are running on localhost, for add hardening against attacks from malicious processes running on the Zulip server.",
51-
"cve": "CVE-2019-19775,CVE-2015-2104",
52-
"id": "pyup.io-38114",
53-
"specs": [
54-
"<2.1.2"
55-
],
56-
"v": "<2.1.2"
57-
},
58-
{
59-
"advisory": "Zulip 2.1.3 includes fixes for:\r\n- CVE-2020-9444: Prevent reverse tabnapping attacks. \r\n- CVE-2020-9445: Remove unused and insecure modal_link feature. \r\n- CVE-2020-10935: Fix XSS vulnerability in local link rewriting.",
60-
"cve": "CVE-2020-9444,CVE-2020-10935",
61-
"id": "pyup.io-38200",
62-
"specs": [
63-
"<2.1.3"
64-
],
65-
"v": "<2.1.3"
66-
}
6727
]
6828
}

vulnerabilities/tests/test_npm.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,7 @@ def test_import(self, _):
9090
assert models.VulnerabilityReference.objects.count() == 3
9191
assert models.PackageRelatedVulnerability.objects.all().count() == 4
9292

93-
expected_package_count = (
94-
models.PackageRelatedVulnerability.objects.all().count()
95-
+ models.PackageRelatedVulnerability.objects.filter(
96-
patched_package__isnull=False
97-
).count()
98-
)
99-
assert models.Package.objects.count() == expected_package_count
93+
assert models.Package.objects.count() == 8
10094

10195
self.assert_for_package(
10296
"jquery", {"3.4.0"}, {"3.8.0"}, "1518", vulnerability_id="CVE-2020-11022"

0 commit comments

Comments
 (0)