Skip to content

Commit 905a899

Browse files
committed
Consider "status" field in Debian data import
Currently only two status values are recognized: "open" maps to ImpactedPackage "resolved" maps to ResolvedPackage Signed-off-by: Haiko Schol <hs@haikoschol.com>
1 parent de03111 commit 905a899

4 files changed

Lines changed: 76 additions & 76 deletions

File tree

vulnerabilities/data_dump.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,36 @@ def debian_dump(extract_data):
4141
vulnerability=vulnerability,
4242
reference_id=data.get('vulnerability_id', ''),
4343
)
44+
45+
pkg_name = data.get('package_name', '')
4446
package = Package.objects.create(
45-
name=data.get('package_name', ''),
46-
version=data.get('fixed_version', ''),
47-
)
48-
ImpactedPackage.objects.create(
49-
vulnerability=vulnerability,
50-
package=package
47+
name=pkg_name,
48+
version=data.get('version', ''),
5149
)
5250

51+
if data['status'] == 'open':
52+
ImpactedPackage.objects.create(
53+
vulnerability=vulnerability,
54+
package=package
55+
)
56+
else:
57+
ResolvedPackage.objects.create(
58+
vulnerability=vulnerability,
59+
package=package
60+
)
61+
62+
fixed_version = data.get('fixed_version')
63+
if fixed_version:
64+
package = Package.objects.create(
65+
name=pkg_name,
66+
version=fixed_version,
67+
)
68+
69+
ResolvedPackage.objects.create(
70+
vulnerability=vulnerability,
71+
package=package
72+
)
73+
5374

5475
def ubuntu_dump(html):
5576
"""

vulnerabilities/scraper/debian.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,18 @@ def extract_vulnerabilities(debian_data, base_release='jessie'):
4848
if not release:
4949
continue
5050

51+
status = release.get('status')
52+
if status not in ('open', 'resolved'):
53+
continue
54+
5155
# the latest version of this package in base_release
5256
version = release.get('repositories', {}).get(base_release, '')
5357

5458
package_vulnerabilities.append({
5559
'package_name': package_name,
5660
'vulnerability_id': vulnerability,
5761
'description': details.get('description', ''),
58-
'status': release.get('status', ''),
62+
'status': status,
5963
'urgency': release.get('urgency', ''),
6064
'version': version,
6165
'fixed_version': release.get('fixed_version', '')

vulnerabilities/tests/test_api.py

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -41,43 +41,20 @@
4141
class TestResponse(TestCase):
4242
def test_debian_response(self):
4343
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
44-
test_data = json.loads(f.read())
44+
test_data = json.load(f)
4545

4646
extract_data = debian.extract_vulnerabilities(test_data)
4747
debian_dump(extract_data)
48-
response = self.client.get('/api/packages/?name=mimetex', format='json')
48+
response = self.client.get('/api/packages/?name=mimetex', format='json').data
4949

50-
expected = [{
51-
"name": "mimetex",
52-
"version": "1.50-1.1",
53-
"platform": "",
54-
"vulnerabilities": [{
55-
"summary": "Multiple stack-based buffer overflows in mimetex.cgi in mimeTeX",
56-
"cvss": None,
57-
"references": [{
58-
"reference_id": "CVE-2009-1382",
59-
"source": "",
60-
"url": "",
61-
}]
62-
}],
63-
"references": [],
64-
}, {
65-
"name": "mimetex",
66-
"version": "1.50-1.1",
67-
"platform": "",
68-
"vulnerabilities": [{
69-
"summary": "Multiple unspecified vulnerabilities in mimeTeX",
70-
"cvss": None,
71-
"references": [{
72-
"reference_id": "CVE-2009-2459",
73-
"source": "",
74-
"url": "",
75-
}]
76-
}],
77-
"references": [],
78-
}]
50+
self.assertEqual(4, response['count'])
7951

80-
self.assertEqual(expected, response.data.get('results'))
52+
first_result = response['results'][0]
53+
self.assertEqual('mimetex', first_result['name'])
54+
55+
versions = {r['version'] for r in response['results']}
56+
self.assertIn('1.50-1.1', versions)
57+
self.assertIn('1.74-1', versions)
8158

8259
def test_ubuntu_response(self):
8360
with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f:
@@ -109,44 +86,18 @@ def test_ubuntu_response(self):
10986
class TestSerializers(TestCase):
11087
def test_serializers(self):
11188
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
112-
test_data = json.loads(f.read())
89+
test_data = json.load(f)
11390
extract_data = debian.extract_vulnerabilities(test_data)
11491
debian_dump(extract_data)
11592

11693
pk = Package.objects.filter(name="mimetex")
11794
response = PackageSerializer(pk, many=True).data
11895

119-
expected = [
120-
{
121-
"name": "mimetex",
122-
"version": "1.50-1.1",
123-
"platform": "",
124-
"vulnerabilities": [{
125-
"summary": "Multiple stack-based buffer overflows in mimetex.cgi in mimeTeX",
126-
"cvss": None,
127-
"references": [{
128-
"reference_id": "CVE-2009-1382",
129-
"source": "",
130-
"url": "",
131-
}]
132-
}],
133-
"references": [],
134-
},
135-
{
136-
"name": "mimetex",
137-
"version": "1.50-1.1",
138-
"platform": "",
139-
"vulnerabilities": [{
140-
"summary": "Multiple unspecified vulnerabilities in mimeTeX",
141-
"cvss": None,
142-
"references": [{
143-
"reference_id": "CVE-2009-2459",
144-
"source": "",
145-
"url": "",
146-
}]
147-
}],
148-
"references": [],
149-
}
150-
]
151-
152-
self.assertEqual(expected, response)
96+
self.assertEqual(4, len(response))
97+
98+
first_result = response[0]
99+
self.assertEqual('mimetex', first_result['name'])
100+
101+
versions = {r['version'] for r in response}
102+
self.assertIn('1.50-1.1', versions)
103+
self.assertIn('1.74-1', versions)

vulnerabilities/tests/test_data_dump.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,37 @@ def test_Package(self):
8383
"""
8484
Check that all packages from the test data are stored in the database
8585
"""
86-
# There are three rows in Package because currently the models allow duplicates
86+
# There are five rows in Package because currently the models allow duplicates
8787
# (see issue #28).
88-
self.assertEqual(3, Package.objects.count())
88+
self.assertEqual(5, Package.objects.count())
8989

9090
self.assertTrue(Package.objects.filter(name='mimetex'))
9191
self.assertTrue(Package.objects.get(name='librsync'))
9292

93+
def test_ImpactedPackage(self):
94+
"""
95+
Check that all impacted packages from the test data are stored in the database
96+
"""
97+
impacted_pkgs = ImpactedPackage.objects.all()
98+
impacted_pkg = impacted_pkgs[0]
99+
100+
self.assertEqual(1, len(impacted_pkgs))
101+
self.assertEqual('librsync', impacted_pkg.package.name)
102+
self.assertEqual('0.9.7-10', impacted_pkg.package.version)
103+
104+
def test_ResolvedPackage(self):
105+
"""
106+
Check that all resolved packages from the test data are stored in the database
107+
"""
108+
resolved_pkgs = ResolvedPackage.objects.all()
109+
resolved_pkg = resolved_pkgs[0]
110+
versions = [rp.package.version for rp in resolved_pkgs]
111+
112+
self.assertEqual(4, len(resolved_pkgs))
113+
self.assertEqual('mimetex', resolved_pkg.package.name)
114+
self.assertIn('1.50-1.1', versions)
115+
self.assertIn('1.74-1', versions)
116+
93117

94118
class TestUbuntuDataDump(TestCase):
95119
@classmethod

0 commit comments

Comments
 (0)