Files
vuln-builder/importers/common.py
T

37 lines
1.3 KiB
Python

"""Shared validation and insertion helpers. No external Python dependencies."""
import hashlib
import json
import re
CVE = re.compile(r'^CVE-\d{4}-\d{4,}$', re.I)
OTHER_PREFIXES = ('GHSA-', 'OSV-', 'PYSEC-', 'RUSTSEC-', 'GO-', 'DSA-', 'USN-')
def canonical(obj):
return json.dumps(obj, ensure_ascii=False, sort_keys=True, separators=(',', ':'))
def sha(value):
return hashlib.sha256(value.encode('utf-8')).hexdigest()[:32]
def is_vulnerability_id(value):
return isinstance(value, str) and (bool(CVE.fullmatch(value)) or value.startswith(OTHER_PREFIXES))
def valid_date(value):
return value if isinstance(value, str) and value else None
def upsert_vuln(db, vid, published=None, modified=None, state=None, summary=None):
if not is_vulnerability_id(vid):
return False
db.execute('''INSERT INTO vulnerabilities(id,published,modified,state,summary) VALUES(?,?,?,?,?)
ON CONFLICT(id) DO UPDATE SET
published=COALESCE(excluded.published,vulnerabilities.published),
modified=COALESCE(excluded.modified,vulnerabilities.modified),
state=COALESCE(excluded.state,vulnerabilities.state),
summary=COALESCE(excluded.summary,vulnerabilities.summary)''',
(vid, published, modified, state, summary[:500] if isinstance(summary, str) else None))
return True