Skip to content

Commit 80a7b6e

Browse files
authored
Merge pull request #161 from EslamHiko/rust-test
Test: add tests for rust scraper
2 parents 39df9ea + 5781a78 commit 80a7b6e

2 files changed

Lines changed: 100 additions & 56 deletions

File tree

vulnerabilities/scraper/rust.py

Lines changed: 62 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -28,66 +28,72 @@ def all_versions_of_crate(crate):
2828
yield version_info['num']
2929

3030

31+
def load_advisory(advisory):
32+
affected_version_range_lists = list(advisory.get(
33+
'affected', {}).get('functions', {}).values())
34+
unaffected_version_range_list = advisory['versions'].get(
35+
'unaffected', [])
36+
37+
patched_version_range_list = advisory['versions']['patched']
38+
# FIXME: Make distinction between unaffected and patched packages
39+
# Check https://github.com/nexB/vulnerablecode/issues/144
40+
unaffected_version_range_list += patched_version_range_list
41+
42+
have_unaffected_version_range = len(unaffected_version_range_list) != 0
43+
have_affected_version_range = len(affected_version_range_lists) != 0
44+
45+
if not (have_affected_version_range or have_unaffected_version_range):
46+
return False
47+
48+
vuln_id = advisory['advisory']['id']
49+
crate_name = advisory['advisory']['package']
50+
description = advisory['advisory']['description']
51+
reference = advisory['advisory'].get('url', '')
52+
53+
all_versions = set(all_versions_of_crate(crate_name))
54+
affected_versions = set()
55+
unaffected_versions = set()
56+
57+
for version in all_versions:
58+
categorised = False
59+
for affected_version_range_list in affected_version_range_lists:
60+
for affected_version_range in affected_version_range_list:
61+
affected_version_range = RangeSpecifier(
62+
affected_version_range)
63+
if version in affected_version_range:
64+
affected_versions.add(version)
65+
categorised = True
66+
break
67+
68+
if have_unaffected_version_range and not categorised:
69+
for unaffected_version_range in unaffected_version_range_list:
70+
if version in RangeSpecifier(unaffected_version_range):
71+
unaffected_versions.add(version)
72+
break
73+
74+
if not have_unaffected_version_range:
75+
unaffected_versions = all_versions - affected_versions
76+
77+
elif not have_affected_version_range:
78+
affected_versions = all_versions - unaffected_versions
79+
80+
return {
81+
'package_name': crate_name,
82+
'vuln_id': vuln_id,
83+
'fixed_versions': unaffected_versions,
84+
'affected_versions': affected_versions,
85+
'advisory': reference,
86+
'description': description
87+
}
88+
89+
3190
def import_vulnerabilities():
3291

3392
vulnerability_package_dicts = []
3493
for advisory in rust_crate_advisories(RUSTSEC_DB_URL):
3594

36-
affected_version_range_lists = list(advisory.get(
37-
'affected', {}).get('functions', {}).values())
38-
unaffected_version_range_list = advisory['versions'].get(
39-
'unaffected', [])
40-
41-
patched_version_range_list = advisory['versions']['patched']
42-
# FIXME: Make distinction between unaffected and patched packages
43-
# Check https://github.com/nexB/vulnerablecode/issues/144
44-
unaffected_version_range_list += patched_version_range_list
45-
46-
have_unaffected_version_range = len(unaffected_version_range_list) != 0
47-
have_affected_version_range = len(affected_version_range_lists) != 0
48-
49-
if not (have_affected_version_range or have_unaffected_version_range):
50-
continue
51-
52-
vuln_id = advisory['advisory']['id']
53-
crate_name = advisory['advisory']['package']
54-
description = advisory['advisory']['description']
55-
reference = advisory['advisory'].get('url', '')
56-
57-
all_versions = set(all_versions_of_crate(crate_name))
58-
affected_versions = set()
59-
unaffected_versions = set()
60-
61-
for version in all_versions:
62-
categorised = False
63-
for affected_version_range_list in affected_version_range_lists:
64-
for affected_version_range in affected_version_range_list:
65-
affected_version_range = RangeSpecifier(
66-
affected_version_range)
67-
if version in affected_version_range:
68-
affected_versions.add(version)
69-
categorised = True
70-
break
71-
72-
if have_unaffected_version_range and not categorised:
73-
for unaffected_version_range in unaffected_version_range_list:
74-
if version in RangeSpecifier(unaffected_version_range):
75-
unaffected_versions.add(version)
76-
break
77-
78-
if not have_unaffected_version_range:
79-
unaffected_versions = all_versions - affected_versions
80-
81-
elif not have_affected_version_range:
82-
affected_versions = all_versions - unaffected_versions
83-
84-
vulnerability_package_dicts.append({
85-
'package_name': crate_name,
86-
'vuln_id': vuln_id,
87-
'fixed_versions': unaffected_versions,
88-
'affected_versions': affected_versions,
89-
'advisory': reference,
90-
'description': description
91-
})
95+
loaded_advisory = load_advisory(advisory)
96+
if loaded_advisory:
97+
vulnerability_package_dicts.append(loaded_advisory)
9298

9399
return vulnerability_package_dicts

vulnerabilities/tests/test_rust.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Author: Islam ElHakmi (@EslamHiko)
2+
# Copyright (c) 2017 nexB Inc. and others. All rights reserved.
3+
# http://nexb.com and https://github.com/nexB/vulnerablecode/
4+
# The VulnerableCode software is licensed under the Apache License version 2.0.
5+
# Data generated with VulnerableCode require an acknowledgment.
6+
#
7+
# You may not use this software except in compliance with the License.
8+
# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0
9+
# Unless required by applicable law or agreed to in writing, software distributed
10+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
11+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
12+
# specific language governing permissions and limitations under the License.
13+
#
14+
# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode
15+
# derivative work, you must accompany this data with the following acknowledgment:
16+
#
17+
# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES
18+
# OR CONDITIONS OF ANY KIND, either express or implied. No content created from
19+
# VulnerableCode should be considered or used as legal advice. Consult an Attorney
20+
# for any legal advice.
21+
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
22+
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
23+
24+
from vulnerabilities.scraper.rust import rust_crate_advisories
25+
from vulnerabilities.scraper.rust import load_advisory
26+
27+
RUSTSEC_DB_URL = 'https://github.com/RustSec/advisory-db/archive/master.zip'
28+
29+
30+
def test_extract_data():
31+
for advisory in rust_crate_advisories(RUSTSEC_DB_URL):
32+
loaded_advisory = load_advisory(advisory)
33+
assert len(loaded_advisory['package_name']) != 0
34+
assert len(loaded_advisory['vuln_id']) != 0
35+
assert len(loaded_advisory['advisory']) != 0
36+
assert len(loaded_advisory['description']) != 0
37+
assert len(loaded_advisory['affected_versions']) != 0
38+
break

0 commit comments

Comments
 (0)