"""
State management utilities for Active Directory tools
"""
from dataclasses import dataclass, asdict
from datetime import datetime
from typing import List, Dict, Any, Optional
@dataclass
class Finding:
"""Represents a security finding"""
severity: str # INFO, LOW, MEDIUM, HIGH, CRITICAL
title: str
description: str
affected_hosts: List[str]
recommendation: Optional[str] = None
evidence: Optional[Dict[str, Any]] = None
timestamp: Optional[str] = None
tool: Optional[str] = None
def __post_init__(self):
if self.timestamp is None:
self.timestamp = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary"""
return asdict(self)
@property
def severity_level(self) -> int:
"""Get numeric severity level for sorting"""
levels = {
"INFO": 0,
"LOW": 1,
"MEDIUM": 2,
"HIGH": 3,
"CRITICAL": 4
}
return levels.get(self.severity.upper(), 0)
@dataclass
class ScanState:
"""Represents the current state of a scan"""
scan_id: str
target: str
domain: Optional[str] = None
status: str = "running" # running, completed, failed
start_time: Optional[str] = None
end_time: Optional[str] = None
findings: Optional[List[Finding]] = None
credentials: Optional[List[Dict[str, Any]]] = None
metadata: Optional[Dict[str, Any]] = None
def __post_init__(self):
if self.start_time is None:
self.start_time = datetime.now().isoformat()
if self.findings is None:
self.findings = []
if self.credentials is None:
self.credentials = []
if self.metadata is None:
self.metadata = {}
def add_finding(self, finding: Finding):
"""Add a finding to the scan"""
self.findings.append(finding)
def add_credential(self, credential: Dict[str, Any]):
"""Add a credential to the scan"""
self.credentials.append(credential)
def complete(self, status: str = "completed"):
"""Mark scan as completed"""
self.status = status
self.end_time = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary"""
data = asdict(self)
data['findings'] = [f.to_dict() for f in self.findings]
return data