Skip to content

Commit 37b1eda

Browse files
authored
Merge pull request #172 from sbs2001/schema-validation
Add schema validators for debian, archlinux importers
2 parents 7b62763 + 1052f02 commit 37b1eda

2 files changed

Lines changed: 62 additions & 2 deletions

File tree

vulnerabilities/scraper/archlinux.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,36 @@
2323

2424
import json
2525
from urllib.request import urlopen
26-
26+
from schema import Regex, Schema, Or
2727
ARCHLINUX_TRACKER_URL = 'https://security.archlinux.org/json'
2828

2929

30+
def validate_schema(advisory_dict):
31+
scheme = {
32+
33+
'advisories': list,
34+
'affected': str,
35+
'fixed': Or(None, str),
36+
'issues': [Regex(r'CVE-\d+-\d+')],
37+
'name': str,
38+
'packages': [str],
39+
'status': str,
40+
'ticket': object,
41+
'type': str,
42+
'severity': str,
43+
44+
}
45+
46+
Schema(scheme).validate(advisory_dict)
47+
48+
3049
def scrape_vulnerabilities():
3150
"""
3251
Fetch and return data scraped from archlinux security tracker.
3352
"""
3453
json_content = urlopen(ARCHLINUX_TRACKER_URL).read()
3554
arch_data = json.loads(json_content)
55+
for advisory in arch_data:
56+
validate_schema(advisory)
57+
3658
return arch_data

vulnerabilities/scraper/debian.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import json
2525
from urllib.request import urlopen
26+
from schema import Regex, Or, Schema, Optional
2627

2728
DEBIAN_TRACKER_URL = 'https://security-tracker.debian.org/tracker/data/json'
2829

@@ -33,8 +34,10 @@ def extract_vulnerabilities(debian_data, base_release='jessie'):
3334
package and vulnerability from a mapping of Debian vulnerabilities
3435
data.
3536
"""
36-
package_vulnerabilities = []
3737

38+
validate_schema(debian_data)
39+
40+
package_vulnerabilities = []
3841
for package_name, vulnerabilities in debian_data.items():
3942
if not vulnerabilities or not package_name:
4043
continue
@@ -68,6 +71,41 @@ def extract_vulnerabilities(debian_data, base_release='jessie'):
6871
return package_vulnerabilities
6972

7073

74+
def validate_schema(advisory_dict):
75+
76+
deb_versions = ['bullseye', 'buster', 'buster-security', 'sid',
77+
'stretch', 'stretch-security', 'jessie', 'jessie-security']
78+
scheme = {
79+
str:
80+
{
81+
Or(Regex(r"CVE-\d+-\d+"), Regex(r"TEMP-.+-.+")):
82+
{
83+
'releases':
84+
{
85+
Or(*deb_versions):
86+
{
87+
'repositories':
88+
{
89+
Or(*deb_versions): str
90+
},
91+
'status': str,
92+
'urgency': str,
93+
Optional('fixed_version'): str,
94+
Optional(str): object,
95+
}
96+
97+
},
98+
Optional('description'): str,
99+
Optional('debianbug'): int,
100+
Optional(str): object,
101+
}
102+
}
103+
104+
}
105+
106+
Schema(scheme).validate(advisory_dict)
107+
108+
71109
def scrape_vulnerabilities():
72110
"""
73111
Scrape debian' security tracker.

0 commit comments

Comments
 (0)