211 lines
6.5 KiB
PHP
211 lines
6.5 KiB
PHP
<?php
|
|
/**
|
|
* Configuración del sistema WhatsApp Bot Manager
|
|
* Desarrollado por U-Site.app
|
|
* Fecha: 13 de noviembre de 2025
|
|
*/
|
|
|
|
// Configuración de la base de datos (compatible con cPanel)
|
|
define('DB_HOST', 'localhost');
|
|
define('DB_PORT', '3306');
|
|
define('DB_NAME', 'whatsapp_bot');
|
|
define('DB_USER', 'whatsapp_user');
|
|
define('DB_PASS', ''); // Se generará automáticamente en la instalación
|
|
define('DB_CHARSET', 'utf8mb4');
|
|
|
|
// WhatsApp Business API (se configurará después de la instalación)
|
|
define('WHATSAPP_TOKEN', 'TU_TOKEN_DE_WHATSAPP_AQUI');
|
|
define('WHATSAPP_PHONE_NUMBER_ID', 'TU_PHONE_ID_AQUI');
|
|
define('WHATSAPP_API_URL', 'https://graph.facebook.com/v22.0/');
|
|
define('WEBHOOK_VERIFY_TOKEN', 'mi_token_secreto_123');
|
|
|
|
// Configuración general
|
|
define('APP_NAME', 'WhatsApp Bot System');
|
|
define('APP_VERSION', '1.0.0');
|
|
define('APP_URL', 'https://tudominio.com'); // Se auto-detectará
|
|
define('TIMEZONE', 'America/Bogota');
|
|
|
|
// Información del desarrollador
|
|
define('DEVELOPER_NAME', 'U-Site.app');
|
|
define('DEVELOPER_URL', 'https://u-site.app');
|
|
define('DEVELOPER_EMAIL', 'support@u-site.app');
|
|
define('DEVELOPER_SUPPORT', 'https://u-site.app/support');
|
|
|
|
// Configuración de seguridad
|
|
define('INSTALLATION_LOCK', '.installation_completed'); // Archivo de bloqueo
|
|
define('ADMIN_USERNAME', 'admin'); // Usuario administrador por defecto
|
|
define('ADMIN_PASSWORD', ''); // Se configurará en instalación
|
|
define('SESSION_TIMEOUT', 1800); // 30 minutos
|
|
define('MAX_LOGIN_ATTEMPTS', 3); // Intentos máximos de login
|
|
define('LOGIN_LOCKOUT_TIME', 900); // 15 minutos de bloqueo tras fallos
|
|
|
|
// Configuración de logs
|
|
define('ENABLE_LOGGING', true);
|
|
define('LOG_LEVEL', 'INFO'); // DEBUG, INFO, WARNING, ERROR
|
|
define('LOG_FILE', 'logs/system.log');
|
|
|
|
// Configuración de archivos
|
|
define('UPLOAD_MAX_SIZE', 10485760); // 10MB
|
|
define('ALLOWED_FILE_TYPES', ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx']);
|
|
|
|
// Configurar zona horaria
|
|
date_default_timezone_set(TIMEZONE);
|
|
|
|
// Configurar errores para desarrollo (se desactivará en producción)
|
|
if (!file_exists(dirname(__DIR__) . '/' . 'installation_completed')) {
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 1);
|
|
} else {
|
|
error_reporting(0);
|
|
ini_set('display_errors', 0);
|
|
}
|
|
|
|
ini_set('log_errors', 1);
|
|
|
|
// Headers de seguridad
|
|
header('X-Content-Type-Options: nosniff');
|
|
header('X-Frame-Options: SAMEORIGIN');
|
|
header('X-XSS-Protection: 1; mode=block');
|
|
|
|
// Auto-detectar URL base si no está configurada
|
|
if (!defined('AUTO_DETECTED_URL')) {
|
|
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
|
|
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
|
|
$path = dirname($_SERVER['SCRIPT_NAME'] ?? '');
|
|
define('AUTO_DETECTED_URL', $protocol . $host . $path);
|
|
}
|
|
|
|
// Función para verificar si la instalación está completada
|
|
function isInstallationCompleted() {
|
|
return file_exists(dirname(__DIR__) . '/.installation_completed');
|
|
}
|
|
|
|
// Función para verificar login
|
|
function isUserLoggedIn() {
|
|
return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
|
|
}
|
|
|
|
// Función para verificar intentos de login
|
|
function checkLoginAttempts($ip) {
|
|
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
|
|
|
|
if (!file_exists($attemptsFile)) {
|
|
return true;
|
|
}
|
|
|
|
$attempts = json_decode(file_get_contents($attemptsFile), true);
|
|
|
|
if (!isset($attempts[$ip])) {
|
|
return true;
|
|
}
|
|
|
|
$ipData = $attempts[$ip];
|
|
|
|
if (time() > $ipData['locked_until']) {
|
|
unset($attempts[$ip]);
|
|
file_put_contents($attemptsFile, json_encode($attempts));
|
|
return true;
|
|
}
|
|
|
|
return $ipData['attempts'] < MAX_LOGIN_ATTEMPTS;
|
|
}
|
|
|
|
// Función para registrar intento de login fallido
|
|
function recordFailedLogin($ip) {
|
|
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
|
|
|
|
$attempts = [];
|
|
if (file_exists($attemptsFile)) {
|
|
$attempts = json_decode(file_get_contents($attemptsFile), true);
|
|
}
|
|
|
|
if (!isset($attempts[$ip])) {
|
|
$attempts[$ip] = ['attempts' => 0, 'locked_until' => 0];
|
|
}
|
|
|
|
$attempts[$ip]['attempts']++;
|
|
|
|
if ($attempts[$ip]['attempts'] >= MAX_LOGIN_ATTEMPTS) {
|
|
$attempts[$ip]['locked_until'] = time() + LOGIN_LOCKOUT_TIME;
|
|
}
|
|
|
|
file_put_contents($attemptsFile, json_encode($attempts));
|
|
}
|
|
|
|
// Función para limpiar intentos de login exitoso
|
|
function clearLoginAttempts($ip) {
|
|
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
|
|
|
|
if (file_exists($attemptsFile)) {
|
|
$attempts = json_decode(file_get_contents($attemptsFile), true);
|
|
unset($attempts[$ip]);
|
|
file_put_contents($attemptsFile, json_encode($attempts));
|
|
}
|
|
}
|
|
|
|
// Autoloader
|
|
spl_autoload_register(function ($class) {
|
|
$directories = [
|
|
dirname(__DIR__) . '/classes/',
|
|
dirname(__DIR__) . '/services/',
|
|
dirname(__DIR__) . '/controllers/'
|
|
];
|
|
|
|
foreach ($directories as $directory) {
|
|
$file = $directory . $class . '.php';
|
|
if (file_exists($file)) {
|
|
require_once $file;
|
|
return;
|
|
}
|
|
}
|
|
});
|
|
|
|
// Función para obtener configuración desde base de datos
|
|
function getConfigFromDB($key, $default = null) {
|
|
static $configs = null;
|
|
|
|
if ($configs === null && isInstallationCompleted()) {
|
|
try {
|
|
$pdo = new PDO(
|
|
"mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET,
|
|
DB_USER,
|
|
DB_PASS,
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]
|
|
);
|
|
|
|
$stmt = $pdo->query("SELECT config_key, config_value FROM system_config");
|
|
$configs = [];
|
|
while ($row = $stmt->fetch()) {
|
|
$configs[$row['config_key']] = $row['config_value'];
|
|
}
|
|
} catch (PDOException $e) {
|
|
error_log("Error loading config: " . $e->getMessage());
|
|
$configs = [];
|
|
}
|
|
}
|
|
|
|
return $configs[$key] ?? $default;
|
|
}
|
|
|
|
// Inicializar sesión si no está activa
|
|
if (session_status() == PHP_SESSION_NONE) {
|
|
session_start();
|
|
}
|
|
|
|
// Verificar timeout de sesión
|
|
if (isUserLoggedIn() && isset($_SESSION['last_activity'])) {
|
|
if (time() - $_SESSION['last_activity'] > SESSION_TIMEOUT) {
|
|
session_destroy();
|
|
session_start();
|
|
}
|
|
}
|
|
|
|
// Actualizar última actividad
|
|
if (isUserLoggedIn()) {
|
|
$_SESSION['last_activity'] = time();
|
|
}
|
|
?>
|