""" Mixins for authentication views. """ from django.core.exceptions import ValidationError from apps.core.utils.turnstile import validate_turnstile_token, get_client_ip 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)