Files
NovaWoW/home/context_processors.py
Inna cac0d28aa9 Añade Cloudflare Turnstile (captcha) a login, registro y recuperación
- Backend: helper verify_turnstile en _base (verifica el token contra
  challenges.cloudflare.com/siteverify; fail-closed ante error de red; si no hay
  secreto configurado, no bloquea). Se exige en el POST de login_view,
  register_view y recover_account_view -> rechazo con mensaje si falla.
- settings: TURNSTILE_SITE_KEY / TURNSTILE_SECRET_KEY desde .env (el secreto NO
  se commitea). La clave de sitio se expone a las plantillas por el context
  processor (TURNSTILE_SITE_KEY).
- Frontend: hook useTurnstile (carga el script de Cloudflare una vez y renderiza
  el widget, devuelve el token). LoginForm/RegisterForm/RecoverForm incluyen el
  widget, mandan cf-turnstile-response y deshabilitan el submit hasta tener token.
  El sitekey llega por data-sitekey en el div de montaje.

Verificado: sin token los 3 POST se rechazan; siteverify acepta la clave secreta
(error invalid-input-response con token falso, no invalid-input-secret).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 21:15:27 +00:00

41 lines
1.5 KiB
Python

from django.conf import settings
from .models import ServerSelection
from django.db import connections
import socket
def url_principal(request):
"""Devuelve la URL principal del sitio."""
current_domain = f"{request.scheme}://{request.get_host()}"
return {'URL_PRINCIPAL': current_domain}
def configuracion_global(request):
"""Devuelve configuraciones globales como el nombre del servidor y el año actual."""
return {
'NOMBRE_SERVIDOR': settings.NOMBRE_SERVIDOR,
'ANIO_ACTUAL': settings.ANIO_ACTUAL,
'TURNSTILE_SITE_KEY': settings.TURNSTILE_SITE_KEY,
}
def get_server_info(request):
"""Devuelve información del servidor para que esté disponible en todas las plantillas."""
server_selection = ServerSelection.objects.first()
online_count = 0
if server_selection:
# Obtener la cantidad de personajes en línea
try:
with connections['acore_characters'].cursor() as cursor:
cursor.execute("SELECT COUNT(*) FROM characters WHERE online = 1")
result = cursor.fetchone()
if result is not None:
online_count = result[0]
except Exception as e:
# Manejar errores de conexión o consulta
print(f"Error al obtener personajes en línea: {e}")
return {
'server': server_selection,
'online_characters': online_count,
'expansion': server_selection.expansion if server_selection else 'Unknown',
}