- Nombre: unblock
- Tipo: laravel (Laravel 12 + Livewire + Filament)
- Ruta: /Users/abkrim/SitesLR12/unblock
- Configurado: 2025-07-09
- Última actualización: 2025-11-05
@~/.claude/CLAUDE.md
Esta aplicación opera en DOS MODOS diferentes. Esta es la característica más importante del proyecto.
- Panel de administración completo
- Login con email + OTP de usuarios reales/administradores
- Acceso completo a dashboard (
/dashboard) - Gestión de hosts, dominios, usuarios, firewall
- Panel Filament activado
- Usuarios persistentes en base de datos
- Redirección post-login:
route('dashboard')
- Sistema de autoservicio público para desbloqueo rápido
- Login simplificado: dominio + email + IP
- Acceso SOLO a formulario de desbloqueo (
/simple-unblock) - NO acceso al dashboard ni panel Filament
- Usuarios temporales (
first_name='Simple', last_name='Unblock') - Rate limiting agresivo (multi-vector)
- Whitelist temporal (1 hora por defecto)
- Redirección post-login:
route('simple.unblock')
simple.mode.enabled: Protege/simple-unblockcuando simple mode está desactivado (retorna 404)simple.mode: Controla acceso de usuarios temporales vs admin (bloquea usuarios temporales del dashboard)throttle.simple.unblock: Rate limiting multi-vector para prevenir ataques
- En tests: SIEMPRE usar
config()->set('unblock.simple_mode.enabled', true/false) - En código: SIEMPRE verificar
config('unblock.simple_mode.enabled') - Cada feature que afecte auth/routing/middleware DEBE tener tests para ambos modos
Los tests NO deben depender de .env.testing. Cada test debe configurar explícitamente los parámetros con config()->set().
// 1. Test con Simple Mode ENABLED
test('feature X works in simple mode', function () {
config()->set('unblock.simple_mode.enabled', true);
// Test específico
});
// 2. Test con Admin Mode
test('feature X works in admin mode', function () {
config()->set('unblock.simple_mode.enabled', false);
// Test específico
});
// 3. Test de protección de acceso
test('feature X respects mode restrictions', function () {
config()->set('unblock.simple_mode.enabled', false);
get('/simple-unblock')->assertNotFound(); // 404, no 403
});SimpleModeTestHelper::enableSimpleMode()SimpleModeTestHelper::disableSimpleMode()- Funciones globales Pest:
enableSimpleMode(),disableSimpleMode()
- NO uses passwords reales en tests
- NO uses API keys reales en tests
- NO uses tokens reales en tests
- NO uses credenciales de servicios reales
- NO uses datos de tarjetas de crédito reales
✅ LO QUE SÍ PUEDES HACER:
// ✅ CORRECTO - Claramente marcado como test
$testPassword = 'TestP@ssw0rd!123456'; // ggignore
// ✅ CORRECTO - API key fake
$fakeApiKey = 'test_stripe_key_fake_123abc'; // ggignore
// ✅ CORRECTO - Token fake
$testToken = 'test_jwt_token_not_real_xyz789'; // ggignore🛡️ PROTECCIÓN:
- GitGuardian SÍ escanea los tests
- Solo ignora passwords documentados en
.gitguardian.yaml - Usa prefijo 'Test' o 'Fake' en todo dato sensible
- Cada dato fake debe tener comentario
// ggignore
- No almacenar claves SSH o contraseñas directamente
- Usar Laravel Vault o mecanismos seguros
- No hardcodear valores sensibles, usar variables de entorno
- Implementar rotación periódica de credenciales
- Validar y sanear todas las entradas de usuario (especialmente IPs y comandos)
- Usar Form Requests para validación compleja
- Implementar rate limiting en endpoints sensibles
- Usar Policies para verificar permisos
- Seguir el principio de mínimo privilegio
- Implementar multi-factor authentication para administradores
- Registrar todos los eventos de seguridad
- Incluir contexto completo en logs (usuario, IP, acción)
- Usar canales de log separados para eventos de seguridad
- Antes de escribir código, mapear el enfoque
- Confirmar interpretación del objetivo
- Escribir plan claro de qué módulos se tocarán y por qué
- No comenzar hasta razonar el plan completo
- Identificar archivo(s) y línea(s) precisas
- Nunca hacer edits masivos en archivos no relacionados
- Justificar explícitamente cada archivo incluido
- No crear nuevas abstracciones/refactors salvo que se solicite
- Solo escribir código directamente requerido
- Evitar agregar logging, comments, tests, TODOs, cleanup innecesarios
- No hacer cambios especulativos o "ya que estamos aquí"
- Aislar toda lógica para no romper flujos existentes
- Revisar correctitud, adherencia al scope, efectos secundarios
- Asegurar alineación con patrones existentes
- Verificar explícitamente impacto downstream
- Resumir qué cambió y por qué
- Listar cada archivo modificado y qué se hizo
- Flagear cualquier asunción o riesgo
OBLIGATORIO ejecutar: composer check-full
Este comando verifica:
- Lint (Pint)
- PHPStan
- Coverage
- El proyecto tiene reglas muy estrictas
Tests Parciales: Al terminar un refactor o nuevo aspecto
- Ejecutar tests afectados
- Nunca dar por terminado sin ejecutar tests
Tests Completos: Siempre antes de commit
php artisan testcompleto- Los tests no pasan si uno solo falla
- SQLite como base de datos principal
- Estructura documentada en
database/sql_prompts/unblock.sqlite.sql - Comando de generación:
php artisan develop:sqlite-structure
- Documentada en
instructions/structure.txt - Generada por:
scripts/generate-structure.sh - Actualizar después de cambios significativos
Las reglas completas de desarrollo están en .cursor/rules/:
main.mdc- Regla principal con referenciasunblock-dual-mode-architecture.mdc- Arquitectura dual (CRÍTICO)testing-standards.mdc- Estándares de testingsecurity-standards.mdc- Estándares de seguridadworkflow.mdc- Flujo de trabajosenior-engineer-task-execution-rule.mdc- Estándares de ejecución
Consultar estas reglas ante cualquier duda sobre implementación.
Antes de cualquier refactorización, verificar:
- ¿La feature afecta autenticación? → Probar ambos modos
- ¿La feature afecta routing? → Verificar middlewares de modo
- ¿La feature afecta emails? → Diferenciar templates por modo
- ¿Hay nuevas rutas? → Aplicar middleware correcto según modo
- ¿Hay nuevos tests? → Configurar modo explícitamente
- ¿Se modifica lógica de usuario? → Considerar usuarios temporales vs reales
- ¿Se modifica OTP? → Verificar redirección post-login según modo
- ¿Se ejecutó
composer check-full? → Obligatorio antes de commit - ¿Se ejecutaron TODOS los tests? →
php artisan testantes de commit
SimpleUnblockAction- Solo ejecuta si simple mode enabledCreateSimpleUnblockReportAction- Solo en simple mode
ProcessSimpleUnblockJob- Solo se despacha si simple mode enabled
OtpLogin- Redirección diferente según modo (isSimpleMode())SimpleUnblockForm- Solo accesible en simple mode
CheckSimpleModeEnabled(simple.mode.enabled)SimpleModeAccess(simple.mode)ThrottleSimpleUnblock(throttle.simple.unblock)
- CI (
.github/workflows/ci.yml): Se ejecuta en PRs a main. Lint + PHPStan + tests con coverage >= 80% +composer audit - CD (
.github/workflows/deploy.yml): Se ejecuta en push a main (post-merge). Deploy secuencial con health check
Merge a main → CI (quality gate) → Deploy amazzal → Health check → Deploy central → Health check
| amazzal | central | |
|---|---|---|
| URL | unblock.castris.com | desbloquear.xerintel.es |
| User | laravel |
unblock |
| Ruta | /home/laravel/domains/unblock.castris.com/unblock/ |
/home/unblock/unblock/ |
| Panel | DirectAdmin | cPanel |
| Queue | Redis + Supervisor | Redis + Supervisor |
git pull origin maincomposer install --no-dev --optimize-autoloadernpm ci && npm run buildphp artisan migrate --forcephp artisan config:cache && route:cache && view:cache && event:cachephp artisan queue:restart
- URL:
/admin/login(ruta Filament, NO/login) - Espera HTTP 200
DEPLOY_SSH_KEY— Clave ed25519 para deployAMAZZAL_HOST,AMAZZAL_PORT,CENTRAL_HOST,CENTRAL_PORT
- Config principal:
config/unblock.phplíneas 73-93 - Simple mode:
config('unblock.simple_mode.enabled')
tests/Unit/Middleware/CheckSimpleModeEnabledTest.phptests/Feature/SimpleUnblock/SimpleUnblockFormTest.phptests/Feature/SimpleUnblock/SimpleUnblockQueueConfigTest.php
php artisan develop:sqlite-structure- Regenerar estructura DBscripts/generate-structure.sh- Regenerar estructura proyectocomposer check-full- Verificación completa pre-commitphp artisan test- Tests completos
- DOS MODOS: Admin Mode y Simple Mode
- CONTROL:
config('unblock.simple_mode.enabled') - AFECTA TODO: Auth, routing, middleware, emails, tests
- EN TESTS: SIEMPRE configurar modo explícitamente
- NUNCA ASUMIR: El modo en código o tests
- SIEMPRE PROBAR: Ambos modos cuando desarrolles features
- PRE-COMMIT:
composer check-full+php artisan test - SEGURIDAD: NO usar datos reales en tests, prefijo 'Test' o 'Fake' +
// ggignore
Si ignoras la dualidad de modos o los estándares de testing, romperás la aplicación. Sin excepciones.
Última actualización: 2026-03-06 Versión: 2.1.0 Mantenedor: Equipo de desarrollo Unblock