"""Soumission d'un rapport à AbuseIPDB (Phase 4, REPORT_ABUSE) — fonction pure, sans effet de bord hors l'appel réseau, appelée directement par management/commands/publish_command.py (jamais diffusée en MQTT, voir sa docstring pour le pourquoi : un rapport par IP suffit, le diffuser à chaque noeud produirait des doublons vus comme du bruit par le service). """ import requests from django.conf import settings ABUSEIPDB_REPORT_URL = 'https://api.abuseipdb.com/api/v2/report' def submit_report(ip: str, categories: str, comment: str) -> tuple[bool, str]: """POST vers l'API v2 AbuseIPDB. Retourne (succès, detail — message d'erreur si échec), jamais d'exception laissée remonter — même forme que master_client.py::_banip_via_jail, pour un traitement uniforme côté appelant.""" try: response = requests.post( ABUSEIPDB_REPORT_URL, headers={'Key': settings.ABUSEIPDB_API_KEY, 'Accept': 'application/json'}, data={'ip': ip, 'categories': categories, 'comment': comment}, timeout=10, ) response.raise_for_status() except requests.RequestException as e: return False, str(e) return True, ''