86 行
2.5 KiB
Python
86 行
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import asdict, dataclass, field
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
@dataclass
|
|
class Candidate:
|
|
system_id: str
|
|
display_name: str
|
|
category: str
|
|
advisory_mode: str
|
|
source_kind: str
|
|
source_name: str
|
|
source_confidence: str
|
|
source_url: str
|
|
title: str
|
|
published_at: Optional[str] = None
|
|
updated_at: Optional[str] = None
|
|
summary: str = ""
|
|
severity: str = "unknown"
|
|
cvss_score: Optional[float] = None
|
|
exploit_status: str = "unknown"
|
|
aliases: List[str] = field(default_factory=list)
|
|
cve_ids: List[str] = field(default_factory=list)
|
|
ghsa_ids: List[str] = field(default_factory=list)
|
|
osv_ids: List[str] = field(default_factory=list)
|
|
affected_versions: List[str] = field(default_factory=list)
|
|
fixed_versions: List[str] = field(default_factory=list)
|
|
package_name: Optional[str] = None
|
|
references: List[str] = field(default_factory=list)
|
|
raw: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> Dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass
|
|
class AdvisoryRecord:
|
|
canonical_id: str
|
|
system_id: str
|
|
display_name: str
|
|
category: str
|
|
advisory_mode: str
|
|
title: str
|
|
summary: str
|
|
published_at: Optional[str]
|
|
updated_at: Optional[str]
|
|
severity: str
|
|
cvss_score: Optional[float]
|
|
exploit_status: str
|
|
source_confidence: str
|
|
official_source_url: Optional[str]
|
|
secondary_source_urls: List[str]
|
|
aliases: List[str]
|
|
cve_ids: List[str]
|
|
ghsa_ids: List[str]
|
|
osv_ids: List[str]
|
|
affected_versions: List[str]
|
|
fixed_versions: List[str]
|
|
package_name: Optional[str]
|
|
render_markdown: bool
|
|
case_path: Optional[str]
|
|
secure_code_topics: List[str]
|
|
status: str
|
|
triage_reasons: List[str] = field(default_factory=list)
|
|
verification_status: str = "triage-manual"
|
|
verification_mode: str = "synthetic"
|
|
last_verified_at: Optional[str] = None
|
|
last_run_id: Optional[str] = None
|
|
evidence_bundle: Optional[str] = None
|
|
browser_evidence: Dict[str, Any] = field(
|
|
default_factory=lambda: {
|
|
"required": False,
|
|
"present": False,
|
|
"refs": [],
|
|
}
|
|
)
|
|
repro_profile_id: Optional[str] = None
|
|
artifact_mode: Optional[str] = None
|
|
blocked_reason: Optional[str] = None
|
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> Dict[str, Any]:
|
|
return asdict(self)
|