2222
2323import asyncio
2424from typing import List , Set
25+ import yaml
2526
2627from dephell_specifier import RangeSpecifier
2728from packageurl import PackageURL
@@ -80,31 +81,27 @@ def get_versions_for_pkg_from_range_list(self, version_range_list):
8081 safe_pkg_versions = set (all_version_list ) - set (vuln_pkg_versions )
8182 return safe_pkg_versions , vuln_pkg_versions
8283
83- def get_data_from_md (self , file ):
84- data = {}
85- for line in file :
84+ def get_data_from_yaml_lines (self , yaml_lines ):
85+
86+ return yaml .safe_load ("\n " .join (yaml_lines ))
87+
88+ def get_yaml_lines (self , lines ):
89+
90+ for line in lines :
8691 line = line .strip ()
87- line = line .split ()
88- if len (line ) > 0 and line is not None :
89-
90- start = line [0 ]
91-
92- if start == "title:" :
93- data ["title" ] = " " .join (line [1 :])
94- elif start == "description:" :
95- data ["description" ] = " " .join (line [1 :])
96- elif start == "cves:" :
97- data ["cves" ] = " " .join (line [1 :])
98- data ["cves" ] = data ["cves" ].replace ("[" , "" )
99- data ["cves" ] = data ["cves" ].replace ("]" , "" )
100- data ["cves" ] = data ["cves" ].split ("," )
101-
102- elif start == "releases:" :
103- data ["releases" ] = " " .join (line [1 :])
104- data ["releases" ] = data ["releases" ].replace ("[" , "" )
105- data ["releases" ] = data ["releases" ].replace ("]" , "" )
106- data ["releases" ] = data ["releases" ].replace ('"' , "" )
107- data ["releases" ] = data ["releases" ].split ("," )
92+ if line .startswith ("---" ):
93+ continue
94+ elif line .endswith ("---" ):
95+ break
96+ else :
97+ yield line
98+
99+ def process_file (self , path ):
100+
101+ advisories = []
102+
103+ data = self .get_data_from_md (path )
104+
108105 releases = []
109106 if data .get ("releases" ):
110107 for release in data ["releases" ]:
@@ -114,60 +111,54 @@ def get_data_from_md(self, file):
114111 lbound = ">=" + release [0 ]
115112 ubound = "<=" + release [2 ]
116113 releases .append (lbound + "," + ubound )
117- data ["releases" ] = releases
118-
119- return data
120114
121- def process_file (self , path ):
122-
123- advisories = []
124-
125- with open (path ) as f :
126- data = {}
127-
128- data = self .get_data_from_md (f )
115+ data ["releases" ] = releases
129116
130- if not data .get ("cves" ):
131- data ["cves" ] = ["" ]
117+ if not data .get ("cves" ):
118+ data ["cves" ] = ["" ]
132119
133- for cve_id in data ["cves" ]:
120+ for cve_id in data ["cves" ]:
134121
135- if not cve_id .startswith ("CVE" ):
136- continue
122+ if not cve_id .startswith ("CVE" ):
123+ continue
137124
138- safe_pkg_versions = []
139- vuln_pkg_versions = []
125+ safe_pkg_versions = []
126+ vuln_pkg_versions = []
140127
141- if not data .get ("releases" ):
142- data ["releases" ] = []
128+ if not data .get ("releases" ):
129+ data ["releases" ] = []
143130
144- (
145- safe_pkg_versions ,
146- vuln_pkg_versions ,
147- ) = self .get_versions_for_pkg_from_range_list (data ["releases" ])
131+ safe_pkg_versions , vuln_pkg_versions = self .get_versions_for_pkg_from_range_list (
132+ data ["releases" ]
133+ )
148134
149- safe_purls = []
150- vuln_purls = []
135+ safe_purls = []
136+ vuln_purls = []
151137
152- cve_id = cve_id
138+ cve_id = cve_id
153139
154- safe_purls = {
155- PackageURL (name = "istio" , type = "golang" , version = version )
156- for version in safe_pkg_versions
157- }
140+ safe_purls = {
141+ PackageURL (name = "istio" , type = "golang" , version = version )
142+ for version in safe_pkg_versions
143+ }
158144
159- vuln_purls = {
160- PackageURL (name = "istio" , type = "golang" , version = version )
161- for version in vuln_pkg_versions
162- }
145+ vuln_purls = {
146+ PackageURL (name = "istio" , type = "golang" , version = version )
147+ for version in vuln_pkg_versions
148+ }
163149
164- advisories .append (
165- Advisory (
166- summary = data ["description" ],
167- impacted_package_urls = vuln_purls ,
168- resolved_package_urls = safe_purls ,
169- cve_id = cve_id ,
170- )
150+ advisories .append (
151+ Advisory (
152+ summary = data ["description" ],
153+ impacted_package_urls = vuln_purls ,
154+ resolved_package_urls = safe_purls ,
155+ cve_id = cve_id ,
171156 )
157+ )
172158
173159 return advisories
160+
161+ def get_data_from_md (self , path ):
162+ with open (path ) as f :
163+ yaml_lines = self .get_yaml_lines (f )
164+ return self .get_data_from_yaml_lines (yaml_lines )
0 commit comments