- Agregar atributo data-bs-theme al HTML - Implementar botón toggle con íconos sol/luna en navegación - Agregar estilos CSS para modo oscuro (variables, componentes, tablas) - Implementar JavaScript para funcionalidad toggle con persistencia localStorage - Agregar detección automática del tema del sistema - Fix específico para columna "Contenido (Previo)" en sent_messages.php - Mejorar Content Security Policy para archivos .map de Bootstrap - Configuración de entorno automática para .env.pruebas Características: - Toggle claro/oscuro con persistencia - Detección automática de preferencias del sistema - Estilos personalizados para componentes en modo oscuro - Compatibilidad con todas las páginas del sistema
75 lines
2.3 KiB
PHP
Executable File
75 lines
2.3 KiB
PHP
Executable File
<?php
|
|
// Incluir el archivo de configuración
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
|
|
/**
|
|
* Establece las cabeceras de seguridad, incluida la Content-Security-Policy.
|
|
* Debe llamarse antes de cualquier salida HTML.
|
|
*/
|
|
function set_security_headers() {
|
|
// CSP para permitir recursos solo del propio dominio y CDNs de confianza
|
|
$csp = "default-src 'self'; "
|
|
. "script-src 'self' https://cdn.jsdelivr.net https://code.jquery.com 'unsafe-inline'; " // unsafe-inline para scripts de bootstrap si es necesario
|
|
. "style-src 'self' https://cdn.jsdelivr.net 'unsafe-inline'; " // unsafe-inline para estilos de bootstrap
|
|
. "img-src 'self' data: " . BOT_BASE_URL . "; " // permitir imágenes del propio dominio, data URIs y el dominio externo
|
|
. "font-src 'self' https://cdn.jsdelivr.net; "
|
|
. "connect-src 'self' https://cdn.jsdelivr.net;"; // Para archivos .map de Bootstrap
|
|
header("Content-Security-Policy: " . $csp);
|
|
header("X-Content-Type-Options: nosniff");
|
|
header("X-Frame-Options: DENY");
|
|
header("X-XSS-Protection: 1; mode=block");
|
|
}
|
|
|
|
|
|
/**
|
|
* Genera una URL absoluta para el sitio
|
|
*
|
|
* @param string $path Ruta relativa
|
|
* @return string URL completa
|
|
*/
|
|
function site_url($path = '') {
|
|
return rtrim(BOT_BASE_URL, '/') . '/' . ltrim($path, '/');
|
|
}
|
|
|
|
/**
|
|
* Genera una URL para los assets (CSS, JS, imágenes, etc.)
|
|
*
|
|
* @param string $path Ruta relativa al archivo de asset
|
|
* @return string URL completa al asset
|
|
*/
|
|
function asset($path) {
|
|
return site_url('assets/' . ltrim($path, '/'));
|
|
}
|
|
|
|
/**
|
|
* Redirige al usuario a una URL específica
|
|
*
|
|
* @param string $url URL a la que redirigir
|
|
* @param int $statusCode Código de estado HTTP (por defecto 302)
|
|
*/
|
|
function redirect($url, $statusCode = 302) {
|
|
header('Location: ' . $url, true, $statusCode);
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Obtiene la URL actual completa
|
|
*
|
|
* @param string $path Ruta relativa
|
|
* @return string URL completa
|
|
*/
|
|
function current_url() {
|
|
$protocol = "http://";
|
|
return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
|
}
|
|
|
|
/**
|
|
* Verifica si la URL actual coincide con el patrón dado
|
|
*
|
|
* @param string $pattern Patrón a verificar
|
|
* @return bool Verdadero si coincide, falso en caso contrario
|
|
*/
|
|
function is_current_url($pattern) {
|
|
$current = current_url();
|
|
return (strpos($current, $pattern) !== false);
|
|
} |