""" Mixins for authentication views. """ from django.core.exceptions import ValidationError from apps.core.utils.turnstile import get_client_ip, validate_turnstile_token class TurnstileMixin: """ Mixin to handle Cloudflare Turnstile validation. Works with both form POST data and JSON request bodies. """ def validate_turnstile(self, request): """ Validate the Turnstile response token. The token can be provided as: - 'cf-turnstile-response' in POST data (form submission) - 'turnstile_token' in JSON body (API request) """ # Try to get token from various sources token = None # Check POST data (form submissions) if hasattr(request, "POST"): token = request.POST.get("cf-turnstile-response") # Check JSON body (API requests) if not token and hasattr(request, "data"): data = getattr(request, "data", {}) if hasattr(data, "get"): token = data.get("turnstile_token") or data.get("cf-turnstile-response") # Get client IP ip = get_client_ip(request) # Validate the token result = validate_turnstile_token(token, ip) if not result.get("success"): error_msg = result.get("error", "Captcha verification failed. Please try again.") raise ValidationError(error_msg)