You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.5 KiB

"""
漏洞数据模型
"""
from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, ForeignKey, Enum, Float
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
import enum
from app.database import Base
class SeverityLevel(enum.Enum):
"""严重程度枚举"""
CRITICAL = "critical"
HIGH = "high"
MEDIUM = "medium"
LOW = "low"
INFO = "info"
class VulnerabilityCategory(enum.Enum):
"""漏洞分类枚举"""
SECURITY = "security"
PERFORMANCE = "performance"
MAINTAINABILITY = "maintainability"
RELIABILITY = "reliability"
USABILITY = "usability"
class VulnerabilityStatus(enum.Enum):
"""漏洞状态枚举"""
OPEN = "open"
FIXED = "fixed"
FALSE_POSITIVE = "false_positive"
WONT_FIX = "wont_fix"
class Vulnerability(Base):
"""漏洞模型"""
__tablename__ = "vulnerabilities"
id = Column(Integer, primary_key=True, index=True)
scan_id = Column(Integer, ForeignKey("scans.id"), nullable=False)
# 漏洞基本信息
rule_id = Column(String(100), nullable=False) # 规则ID
message = Column(Text, nullable=False) # 漏洞描述
category = Column(Enum(VulnerabilityCategory), nullable=False)
severity = Column(Enum(SeverityLevel), nullable=False)
# 位置信息
file_path = Column(String(500), nullable=False)
line_number = Column(Integer)
column_number = Column(Integer)
end_line = Column(Integer)
end_column = Column(Integer)
# 代码上下文
code_snippet = Column(Text) # 相关代码片段
context_before = Column(Text) # 前置代码上下文
context_after = Column(Text) # 后置代码上下文
# AI增强信息
ai_enhanced = Column(Boolean, default=False)
ai_confidence = Column(Float) # AI置信度 0-1
ai_suggestion = Column(Text) # AI修复建议
# 状态管理
status = Column(Enum(VulnerabilityStatus), default=VulnerabilityStatus.OPEN)
assigned_to = Column(String(100)) # 分配给谁
fix_commit = Column(String(100)) # 修复的提交哈希
# 时间戳
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
fixed_at = Column(DateTime(timezone=True))
# 关联关系
scan = relationship("Scan", back_populates="vulnerabilities")
def __repr__(self):
return f"<Vulnerability(id={self.id}, rule_id='{self.rule_id}', severity='{self.severity.value}')>"