|
13 | 13 |
|
14 | 14 | from vulnerabilities.importer import AdvisoryData |
15 | 15 | from vulnerabilities.importer import Importer |
16 | | -from vulnerabilities.importer import Reference |
17 | | -from vulnerabilities.utils import create_etag |
| 16 | +from vulnerabilities.references import XsaReference |
| 17 | +from vulnerabilities.utils import fetch_response |
18 | 18 | from vulnerabilities.utils import is_cve |
19 | 19 |
|
20 | 20 |
|
21 | 21 | class XenImporter(Importer): |
22 | | - # CONFIG_CLASS = XenDBConfiguration |
23 | 22 |
|
24 | | - def updated_advisories(self): |
25 | | - advisories = [] |
26 | | - if create_etag(data_src=self, url=self.config.db_url, etag_key="etag"): |
27 | | - advisories.extend(self.to_advisories(fetch(self.config.db_url))) |
28 | | - |
29 | | - return self.batch_advisories(advisories) |
30 | | - |
31 | | - def create_etag(self, url): |
32 | | - etag = requests.head(url).headers.get("etag") |
33 | | - if not etag: |
34 | | - return True |
35 | | - |
36 | | - elif url in self.config.etags: |
37 | | - if self.config.etags[url] == etag: |
38 | | - return False |
39 | | - |
40 | | - self.config.etags[url] = etag |
41 | | - return True |
42 | | - |
43 | | - @staticmethod |
44 | | - def to_advisories(xen_db): |
45 | | - advisories = [] |
46 | | - for xsa in xen_db[0]["xsas"]: |
47 | | - reference = get_xen_references(xsa["xsa"]) |
48 | | - title = xsa.get("title", [""]) |
49 | | - for cve in xsa.get("cve", [""]): |
50 | | - if not is_cve(cve): |
51 | | - cve = "" |
52 | | - |
53 | | - advisories.append( |
54 | | - AdvisoryData( |
55 | | - vulnerability_id=cve, |
56 | | - summary=title, |
57 | | - references=[reference], |
58 | | - ) |
59 | | - ) |
60 | | - return advisories |
61 | | - |
62 | | - |
63 | | -def get_xen_references(xsa_id): |
64 | | - return Reference( |
65 | | - reference_id="XSA-" + xsa_id, |
66 | | - url="https://xenbits.xen.org/xsa/advisory-{}.html".format(xsa_id), |
67 | | - ) |
68 | | - |
69 | | - |
70 | | -def fetch(url): |
71 | | - response = requests.get(url).content |
72 | | - return json.loads(response) |
| 23 | + url = "https://xenbits.xen.org/xsa/xsa.json" |
| 24 | + spdx_license_expression = "" |
| 25 | + license_url = "" |
| 26 | + |
| 27 | + def advisory_data(self): |
| 28 | + data = fetch_response(self.url).json() |
| 29 | + if not len(data): |
| 30 | + return [] |
| 31 | + xsas = data[0].get("xsas") or [] |
| 32 | + for xsa in xsas: |
| 33 | + yield from self.to_advisories(xsa) |
| 34 | + |
| 35 | + def to_advisories(self, xsa): |
| 36 | + xsa_id = xsa.get("xsa") |
| 37 | + references = [] |
| 38 | + if xsa_id: |
| 39 | + references.append(XsaReference.from_num_id(num_id=xsa_id)) |
| 40 | + title = xsa.get("title") |
| 41 | + for cve in xsa.get("cve") or []: |
| 42 | + if not is_cve(cve): |
| 43 | + continue |
| 44 | + yield AdvisoryData( |
| 45 | + aliases=[cve], |
| 46 | + summary=title, |
| 47 | + references=references, |
| 48 | + ) |
0 commit comments