37 lines
1.3 KiB
Python
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
|