From e2f914d8b38b7d54194dec4e40125b84980178be Mon Sep 17 00:00:00 2001 From: Keiko Date: Tue, 30 Jun 2026 00:38:21 +0000 Subject: [PATCH] =?UTF-8?q?Migraci=C3=B3n=20a=20la=20versi=C3=B3n=20m?= =?UTF-8?q?=C3=A1s=20estable=20de=20Gitea=20en=20Del=20Austral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Keiko --- config/config.php | 158 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 config/config.php diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..9ea5ef6 --- /dev/null +++ b/config/config.php @@ -0,0 +1,158 @@ + casi siempre es "localhost" + * DB_NAME -> el nombre completo, ej: "usuario_legajos" + * DB_USER -> el usuario completo, ej: "usuario_admin" + * DB_PASS -> la contraseña que elegiste para ese usuario + * ============================================================ + */ + +define('DB_HOST', 'localhost'); +define('DB_NAME', 'TU_USUARIO_legajos'); +define('DB_USER', 'TU_USUARIO_admin'); +define('DB_PASS', 'TU_CONTRASEÑA_AQUI'); + +/** + * Clave secreta usada para firmar la sesión de acceso. + * Cambiala por cualquier texto largo y random, una sola vez, + * antes de subir el sitio. No la compartas. + */ +define('APP_SECRET', 'cambiar-esto-por-un-texto-largo-y-aleatorio-unico'); + +// ------------------------------------------------------------ +// No es necesario tocar nada debajo de esta línea +// ------------------------------------------------------------ + +function obtenerConexion() { + static $pdo = null; + if ($pdo === null) { + try { + $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4'; + $pdo = new PDO($dsn, DB_USER, DB_PASS, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]); + } catch (PDOException $e) { + http_response_code(500); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode([ + 'ok' => false, + 'error' => 'No se pudo conectar a la base de datos. Revisá config.php con los datos reales de tu cPanel.', + 'detalle' => $e->getMessage() + ]); + exit; + } + } + return $pdo; +} + +session_start(); + +function requiereSesion() { + if (empty($_SESSION['autenticado']) || $_SESSION['autenticado'] !== true) { + http_response_code(401); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['ok' => false, 'error' => 'Sesión no válida. Iniciá sesión nuevamente.']); + exit; + } +} + +/** + * Corta la ejecución con 403 si el usuario logueado no es "profesional". + * Usar en cualquier endpoint que exponga datos clínicos sensibles. + */ +function requiereRolProfesional() { + requiereSesion(); + if (($_SESSION['rol'] ?? '') !== 'profesional') { + http_response_code(403); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['ok' => false, 'error' => 'Tu usuario no tiene permiso para acceder a esta información clínica.']); + exit; + } +} + +function rolActual() { + return $_SESSION['rol'] ?? null; +} + +function esProfesional() { + return rolActual() === 'profesional'; +} + +function esDesarrollador() { + return rolActual() === 'desarrollador'; +} + +/** + * Corta la ejecución con 403 si quien está logueado no es el + * desarrollador. Se usa para altas/bajas de usuarios y sedes. + */ +function requiereDesarrollador() { + requiereSesion(); + if (!esDesarrollador()) { + http_response_code(403); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['ok' => false, 'error' => 'Esta acción solo puede hacerla el desarrollador del sistema.']); + exit; + } +} + +/** + * El "profesional activo" es el dueño de los pacientes que se + * deben ver en esta sesión. Si quien entró es un profesional, + * es su propio ID. Si es una administrativa, es el profesional + * que eligió representar al momento de loguearse (guardado en + * sesión como profesional_activo_id). + */ +function idProfesionalActivo() { + if (esProfesional()) { + return $_SESSION['usuario_id'] ?? null; + } + return $_SESSION['profesional_activo_id'] ?? null; +} + +/** + * Corta la ejecución con 400 si no hay un profesional activo + * resuelto en la sesión (no debería pasar en uso normal, pero + * protege contra estados de sesión inconsistentes). + */ +function requiereProfesionalActivo() { + requiereSesion(); + if (!idProfesionalActivo()) { + http_response_code(400); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['ok' => false, 'error' => 'No se pudo determinar a qué profesional pertenecen estos datos. Volvé a iniciar sesión.']); + exit; + } +} + +/** + * Registra una acción en el historial de cambios (auditoría). + * $accion: 'crear' | 'editar' | 'eliminar' | etc. + * $entidad: 'paciente' | 'sesion' | 'cita' | etc. + */ +function registrarAuditoria($pdo, $accion, $entidad, $entidadId, $descripcion = null) { + try { + $stmt = $pdo->prepare(' + INSERT INTO historial_cambios (usuario_id, usuario_nombre, accion, entidad, entidad_id, descripcion) + VALUES (?, ?, ?, ?, ?, ?) + '); + $stmt->execute([ + $_SESSION['usuario_id'] ?? null, + $_SESSION['nombre_usuario'] ?? null, + $accion, + $entidad, + $entidadId, + $descripcion, + ]); + } catch (Exception $e) { + // La auditoría nunca debe romper la operación principal. + } +}