2323
2424import json
2525from urllib .request import urlopen
26+ from schema import Regex , Or , Schema , Optional
2627
2728DEBIAN_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+
71109def scrape_vulnerabilities ():
72110 """
73111 Scrape debian' security tracker.
0 commit comments