""" Security Auditor Service - Anti-Cheat rendszer része. Felelős a gyanús tevékenységek (pl. Rapid Fire validációk) észleléséért. """ import logging from datetime import datetime, timedelta from typing import Optional from sqlalchemy import select, and_, func from sqlalchemy.ext.asyncio import AsyncSession from fastapi import HTTPException from app.services.config_service import ConfigService from app.models.gamification.gamification import UserContribution from app.models.system.system import ParameterScope logger = logging.getLogger(__name__) class SecurityAuditorService: """ Biztonsági audit szolgáltatás a Rapid Fire (gyorstüzelés) anomáliák detektálására. """ @staticmethod async def check_rapid_fire_validation(db: AsyncSession, user_id: int) -> None: """ Ellenőrzi, hogy a felhasználó túl sok validációt végzett-e rövid idő alatt. Args: db: Adatbázis munkamenet user_id: Ellenőrizendő felhasználó azonosítója Raises: HTTPException(429): Ha a felhasználó túllépte a megengedett limitet. """ # 1. Dinamikus limit lekérése a konfigurációból max_validations = await ConfigService.get_int( db, "ANTI_CHEAT_MAX_VALIDATIONS_PER_HOUR", default=10, scope_level=ParameterScope.GLOBAL, scope_id=None ) # 2. Az elmúlt 1 órában végzett validációk számának lekérdezése one_hour_ago = datetime.utcnow() - timedelta(hours=1) stmt = select(func.count(UserContribution.id)).where( and_( UserContribution.user_id == user_id, UserContribution.contribution_type == 'service_validation', UserContribution.created_at >= one_hour_ago, UserContribution.status == 'approved' # csak jóváhagyott validációk ) ) result = await db.execute(stmt) recent_count = result.scalar() or 0 logger.debug( f"Rapid fire check for user {user_id}: {recent_count} validations " f"in last hour (limit: {max_validations})" ) # 3. Limit ellenőrzése if recent_count >= max_validations: # Opcionális: büntetőpont hozzáadása a GamificationService-en keresztül # await GamificationService.add_penalty(db, user_id, reason="Rapid fire validation") raise HTTPException( status_code=429, detail=( f"Anti-Cheat: Túl sok művelet rövid idő alatt. " f"Maximum {max_validations} validáció engedélyezett óránként. " f"Kérjük, lassíts!" ) ) @staticmethod async def log_suspicious_activity( db: AsyncSession, user_id: int, activity_type: str, details: Optional[dict] = None ) -> None: """ Gyanús tevékenység naplózása a későbbi elemzéshez. Jelenleg csak logol, de később beilleszthető egy audit táblába. """ logger.warning( f"Suspicious activity detected: user={user_id}, " f"type={activity_type}, details={details}" ) # TODO: Beszúrás egy security_audit_log táblába, ha lesz ilyen