class Query(): def __init__(self, api=None): self.apiurl = api if not api: self.api = API() def _query(self, url): r = requests.get(urllib.parse.urljoin(self.apiurl, url), headers={ 'Version': '2.0', 'Accept': '*/json' }) data = json.loads(r.text) if r.status_code is 200 and data['status'] == 'success': return data['data'] elif (r.status_code is 404 and data['status'] == 'success' and data['reason'] == 'cve not found'): return None else: return False def cve(self, cveid): if self.apiurl: cve = self._query("api/cve/%s" % str(cveid)) return cve and CVE.fromDict(cve) or None try: return self.api.api_cve(cveid) except: return None def cveforcpe(self, cpe): if self.apiurl: cpes = self._query("api/cvefor/%s" % str(cpe)) return cpes and [CVE.fromDict(x) for x in cpes] or cpes return self.api.api_cvesFor(cpe) def last(self, entries=None): if self.apiurl: url = "api/last" if entries: url = "%s/%s" % (url, str(entries)) cves = self._query(url) return cves and [CVE.fromDict(x) for x in cves] or cves return self.api.api_last(entries)[0] def browse(self, vendor=None): if self.apiurl: url = "api/browse" if vendor: url = "%s/%s" % (url, vendor) return self._query(url) return self.api.api_browse(vendor) def search(self, query): if self.apiurl: cves = self._query("api/search/%s" % str(query)) return cves and [CVE.fromDict(x) for x in cves['data']] or [] return self.api.api_text_search(query) or []