import uuid from enum import Enum from typing import List, Optional, Dict, Any from pydantic import BaseModel, HttpUrl, Field, field_validator from datetime import datetime class ScanStatus(str, Enum): PENDING = "pending" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" class VulnerabilitySeverity(str, Enum): INFO = "info" LOW = "low" MEDIUM = "medium" HIGH = "high" CRITICAL = "critical" class ScanRequest(BaseModel): target_url: HttpUrl scan_types: List[str] = Field(default_factory=lambda: ["recon", "injection", "xss", "auth", "ssrf", "ssl", "cloud"]) project_id: Optional[str] = None class VulnerabilityStatus(str, Enum): SUSPECTED = "suspected" VERIFIED = "verified" FALSE_POSITIVE = "false_positive" class Vulnerability(BaseModel): id: str type: str severity: VulnerabilitySeverity status: VulnerabilityStatus = VulnerabilityStatus.SUSPECTED description: str evidence: Optional[str] = None remediation: Optional[str] = None ttp_id: Optional[str] = None cves: List[str] = Field(default_factory=list) class ScanTask(BaseModel): id: str name: str status: ScanStatus progress: int = 0 logs: List[str] = Field(default_factory=list) class ProjectMode(str, Enum): AUTONOMOUS = "autonomous" COPILOT = "copilot" TACTICAL = "tactical" DEEP_DIVE = "deep_dive" MANUAL = "manual" class TestType(str, Enum): AGENTIC_RED_TEAM = "agentic_red_team" STEALTH_RECON = "stealth_recon" API_SECURITY = "api_security" CLOUD_AUDIT = "cloud_audit" COMPLIANCE_OWASP = "compliance_owasp" FULL_PENTEST = "full_pentest" GENERAL = "general" class Project(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) name: str target: str test_type: TestType description: Optional[str] = None mode: ProjectMode = ProjectMode.AUTONOMOUS filter_api_risks: bool = False analysis_depth: int = 1 created_at: datetime = Field(default_factory=datetime.now) @field_validator('test_type', mode='before') @classmethod def validate_test_type(cls, v: Any) -> str: if v == "agent": return TestType.AGENTIC_RED_TEAM return v @field_validator('mode', mode='before') @classmethod def validate_mode(cls, v: Any) -> str: if v == "ai": return ProjectMode.AUTONOMOUS return v class TTP(BaseModel): id: str name: str category: str description: str steps: List[str] class ScanResult(BaseModel): scan_id: str project_id: Optional[str] = None target: str status: ScanStatus vulnerabilities: List[Vulnerability] = Field(default_factory=list) created_at: datetime = Field(default_factory=datetime.now) class IntelSource(BaseModel): id: str = Field(default_factory=lambda: str(datetime.now().timestamp())) name: str url: str source_type: str = "CVE" # CVE, RSS, GITHUB active: bool = True class VulnerabilityIntel(BaseModel): sources: List[IntelSource] = Field(default_factory=list) last_update: Optional[datetime] = None class AIAgent(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) name: str provider: str model_name: str api_key: str is_active: bool = True class User(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) username: str password: str role: str = "admin" created_at: datetime = Field(default_factory=datetime.now) class LoginRequest(BaseModel): username: str password: str