123 行
3.9 KiB
Python
123 行
3.9 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)
|
|
entity_refs: List[Dict[str, Any]] = field(default_factory=list)
|
|
affected_components: List[Dict[str, Any]] = field(default_factory=list)
|
|
affected_version_ranges: List[str] = field(default_factory=list)
|
|
fixed_version_ranges: List[str] = field(default_factory=list)
|
|
introduced_version: Optional[str] = None
|
|
patched_version: Optional[str] = None
|
|
version_evidence_sources: List[str] = field(default_factory=list)
|
|
affected_version_refs: List[str] = field(default_factory=list)
|
|
fixed_version_refs: List[str] = field(default_factory=list)
|
|
patched_version_refs: List[str] = field(default_factory=list)
|
|
version_sync_confidence: str = "low"
|
|
advisory_scope: str = "core"
|
|
version_confidence: str = "low"
|
|
version_gap_reason: str = ""
|
|
version_resolution_needed: bool = False
|
|
workflow: Dict[str, Any] = field(default_factory=dict)
|
|
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
|
|
historical_status: Optional[str] = None
|
|
latest_status: 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)
|
|
|
|
|
|
@dataclass
|
|
class VersionRecord:
|
|
version_id: str
|
|
entity_id: str
|
|
root_system_id: str
|
|
version: str
|
|
released_at: Optional[str] = None
|
|
release_url: Optional[str] = None
|
|
source_name: str = ""
|
|
source_confidence: str = "unknown"
|
|
security_relevant: bool = True
|
|
reason: str = ""
|
|
advisory_refs: List[str] = field(default_factory=list)
|
|
is_latest_snapshot: bool = False
|
|
|
|
def to_dict(self) -> Dict[str, Any]:
|
|
return asdict(self)
|