# Correcciones P0/P1 aplicadas

## Validación técnica

- `php -l` ejecutado sobre todos los archivos PHP: sin errores de sintaxis.
- Secretos anteriores removidos del código fuente.
- Cache JSON de DNI removido del paquete.
- Endpoints DNI/RUC protegidos por sesión, permisos y rate limit.

## Cambios P0

### Credenciales MySQL
Archivo: `includes/db.php`

- Se eliminaron credenciales hardcodeadas.
- La conexión sigue usando MySQLi procedural con `$conn` y compatibilidad `$con`.
- Las credenciales se cargan desde variables de entorno o archivo privado.

Variables:
- `CN_DB_HOST`
- `CN_DB_USER`
- `CN_DB_PASSWORD`
- `CN_DB_NAME`
- `CN_DB_PORT`

### Tokens DNI/RUC
Archivos:
- `dni/config_tokens.php`
- `dni/buscar_dni.php`
- `dni/buscar_ruc.php`

- Se eliminaron tokens reales hardcodeados.
- Se soportan variables de entorno o archivo privado.
- No se imprime detalle de token rechazado al usuario final.

Variables:
- `CN_MIAPI_TOKEN`
- `CN_MIAPI_DNI_TOKEN`
- `CN_MIAPI_RUC_TOKEN`
- `CN_PERUDEVS_TOKEN`
- `CN_DECOLECTA_TOKEN`
- `CN_AQPFACT_TOKEN`

### Cache DNI
Carpeta: `dni/dni_cache/`

- Se eliminaron 38 JSON con datos personales.
- Se agregó `.htaccess`.
- Se agregó `index.php` de bloqueo.
- El nuevo cache usa `CN_DNI_CACHE_DIR` o `sys_get_temp_dir()` por defecto.

### Debug admin
Archivo: `admin/concursos.php`

- `ADMIN_CONCURSOS_DEBUG` quedó en `false`.
- Los detalles SQL se envían a `error_log`.
- El usuario final recibe mensaje genérico si ocurre error.

## Cambios P1

### Endpoints DNI/RUC protegidos
Archivos:
- `dni/buscar_dni.php`
- `dni/buscar_ruc.php`
- `includes/concurso_contexto.php`

- Requieren sesión activa válida.
- Requieren permiso `puede_registrar_participantes` o admin.
- Incluyen rate limit por sesión.
- `nocache=1` en DNI queda permitido solo para admin.

### Duplicidad de auditoría
Archivos:
- `includes/auditoria.php`
- `includes/concurso_contexto.php`

- `cn_auditar()` queda protegido con `function_exists`.
- Se evita fatal error por redeclaración.

### Seguridad heredada
Archivo: `includes/seguridad.php`

- Se corrige `cn_redirect()` inexistente usando `cn_redirigir()`.
- Se carga `config.php`.
- Se agregan guards para evitar redeclaraciones.

### Includes heredados incompletos
Archivos:
- `includes/sidebar.php`
- `includes/cambiar_periodo.php`

- Se evita fatal error si faltan dependencias heredadas.
- `cambiar_periodo.php` ahora valida redirección interna para evitar open redirect.

### Cupos bajo concurrencia
Archivo: `asignar_salon.php`

- Se agregó bloqueo `FOR UPDATE` sobre salón dentro de transacción.
- El conteo de ocupados se valida con el salón bloqueado antes de asignar/crear.
- No se cambia el flujo visual ni las reglas de negocio.

## Importante

Después de aplicar este paquete, debes configurar credenciales y tokens en variables de entorno o archivo privado. No vuelvas a colocar secretos dentro del código fuente.
