127 Zeilen
3.2 KiB
Python
127 Zeilen
3.2 KiB
Python
from datetime import datetime
|
|
from typing import Optional, List, Dict, Any
|
|
from dataclasses import dataclass, field
|
|
from enum import Enum
|
|
|
|
class EventType(Enum):
|
|
"""License event types"""
|
|
ACTIVATION = "activation"
|
|
DEACTIVATION = "deactivation"
|
|
REACTIVATION = "reactivation"
|
|
TRANSFER = "transfer"
|
|
|
|
class AnomalyType(Enum):
|
|
"""Anomaly detection types"""
|
|
MULTIPLE_IPS = "multiple_ips"
|
|
RAPID_HARDWARE_CHANGE = "rapid_hardware_change"
|
|
SUSPICIOUS_PATTERN = "suspicious_pattern"
|
|
CONCURRENT_USE = "concurrent_use"
|
|
GEO_ANOMALY = "geo_anomaly"
|
|
|
|
class Severity(Enum):
|
|
"""Anomaly severity levels"""
|
|
LOW = "low"
|
|
MEDIUM = "medium"
|
|
HIGH = "high"
|
|
CRITICAL = "critical"
|
|
|
|
@dataclass
|
|
class License:
|
|
"""License domain model"""
|
|
id: str
|
|
license_key: str
|
|
customer_id: str
|
|
max_devices: int
|
|
is_active: bool
|
|
is_test: bool
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
expires_at: Optional[datetime] = None
|
|
features: List[str] = field(default_factory=list)
|
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
@dataclass
|
|
class LicenseToken:
|
|
"""Offline validation token"""
|
|
id: str
|
|
license_id: str
|
|
token: str
|
|
hardware_id: str
|
|
valid_until: datetime
|
|
created_at: datetime
|
|
last_validated: Optional[datetime] = None
|
|
validation_count: int = 0
|
|
|
|
@dataclass
|
|
class Heartbeat:
|
|
"""License heartbeat"""
|
|
id: int
|
|
license_id: str
|
|
hardware_id: str
|
|
ip_address: Optional[str]
|
|
user_agent: Optional[str]
|
|
app_version: Optional[str]
|
|
timestamp: datetime
|
|
session_data: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
@dataclass
|
|
class ActivationEvent:
|
|
"""License activation event"""
|
|
id: str
|
|
license_id: str
|
|
event_type: EventType
|
|
hardware_id: Optional[str]
|
|
previous_hardware_id: Optional[str]
|
|
ip_address: Optional[str]
|
|
user_agent: Optional[str]
|
|
success: bool
|
|
error_message: Optional[str]
|
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
created_at: datetime
|
|
|
|
@dataclass
|
|
class AnomalyDetection:
|
|
"""Detected anomaly"""
|
|
id: str
|
|
license_id: str
|
|
anomaly_type: AnomalyType
|
|
severity: Severity
|
|
details: Dict[str, Any]
|
|
detected_at: datetime
|
|
resolved: bool = False
|
|
resolved_at: Optional[datetime] = None
|
|
resolved_by: Optional[str] = None
|
|
action_taken: Optional[str] = None
|
|
|
|
@dataclass
|
|
class Session:
|
|
"""Active session"""
|
|
id: str
|
|
license_id: str
|
|
hardware_id: str
|
|
session_token: str
|
|
ip_address: Optional[str]
|
|
started_at: datetime
|
|
last_seen: datetime
|
|
expires_at: datetime
|
|
|
|
@dataclass
|
|
class ValidationRequest:
|
|
"""License validation request"""
|
|
license_key: str
|
|
hardware_id: str
|
|
app_version: Optional[str] = None
|
|
ip_address: Optional[str] = None
|
|
user_agent: Optional[str] = None
|
|
|
|
@dataclass
|
|
class ValidationResponse:
|
|
"""License validation response"""
|
|
valid: bool
|
|
license_id: Optional[str] = None
|
|
token: Optional[str] = None
|
|
expires_at: Optional[datetime] = None
|
|
features: List[str] = field(default_factory=list)
|
|
limits: Dict[str, Any] = field(default_factory=dict)
|
|
error: Optional[str] = None
|
|
error_code: Optional[str] = None |