diff --git a/docker-compose.yml b/docker-compose.yml index 87578d5..5bb0267 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,6 @@ services: volumes: - ./pagos:/var/www/html - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf - - ./docker/htpasswd:/etc/nginx/.htpasswd:ro depends_on: - app networks: diff --git a/docker/htpasswd b/docker/htpasswd deleted file mode 100644 index f12f6cc..0000000 --- a/docker/htpasswd +++ /dev/null @@ -1 +0,0 @@ -root:$apr1$69HFcTHn$9hHiieirPfFe3M.lo87O21 diff --git a/docker/nginx.conf b/docker/nginx.conf index de7c45a..544634f 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -5,9 +5,6 @@ server { resolver 127.0.0.11 valid=10s; - auth_basic "Quiet Wealth"; - auth_basic_user_file /etc/nginx/.htpasswd; - location / { try_files $uri $uri/ =404; } @@ -18,8 +15,6 @@ server { fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param PHP_AUTH_USER $remote_user; - fastcgi_param PHP_AUTH_PW $http_authorization; } location ~ /db/ { diff --git a/pagos/api/auth.php b/pagos/api/auth.php index 132ea9f..456552a 100644 --- a/pagos/api/auth.php +++ b/pagos/api/auth.php @@ -1,11 +1,10 @@ 'error', 'message' => 'No autenticado'])); } -?> diff --git a/pagos/api/login.php b/pagos/api/login.php new file mode 100644 index 0000000..89f3d01 --- /dev/null +++ b/pagos/api/login.php @@ -0,0 +1,27 @@ + 'success']); + } else { + http_response_code(401); + echo json_encode(['status' => 'error', 'message' => 'Usuario o contraseña incorrectos']); + } + exit; +} + +if (($_GET['action'] ?? '') === 'logout') { + session_destroy(); + echo json_encode(['status' => 'success']); + exit; +} + +http_response_code(405); +echo json_encode(['status' => 'error', 'message' => 'Método no permitido']); diff --git a/pagos/js/add.js b/pagos/js/add.js index f609b34..4c0f7f9 100644 --- a/pagos/js/add.js +++ b/pagos/js/add.js @@ -13,7 +13,7 @@ document.addEventListener('DOMContentLoaded', () => { iptFecha.valueAsDate = new Date(); // Cargar categorías desde la API - fetch('api/movimientos.php') + apiFetch('api/movimientos.php') .then(r => r.json()) .then(data => { if (data.categorias) { @@ -98,7 +98,7 @@ document.addEventListener('DOMContentLoaded', () => { btnSave.innerHTML = 'Guardando...'; btnSave.disabled = true; - const r = await fetch('api/movimientos.php', { + const r = await apiFetch('api/movimientos.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) diff --git a/pagos/js/dashboard.js b/pagos/js/dashboard.js index 4883a95..e498614 100644 --- a/pagos/js/dashboard.js +++ b/pagos/js/dashboard.js @@ -1,6 +1,6 @@ document.addEventListener('DOMContentLoaded', async () => { try { - const response = await fetch('api/movimientos.php'); + const response = await apiFetch('api/movimientos.php'); const data = await response.json(); if (data.status === 'success') { diff --git a/pagos/js/historial.js b/pagos/js/historial.js index 0816b55..c403b02 100644 --- a/pagos/js/historial.js +++ b/pagos/js/historial.js @@ -8,7 +8,7 @@ async function cargarHistorial() { const lista = document.getElementById('ui-lista'); try { - const r = await fetch('api/movimientos.php?view=historial'); + const r = await apiFetch('api/movimientos.php?view=historial'); const data = await r.json(); loading.classList.add('hidden'); @@ -83,7 +83,7 @@ async function eliminar(id, titulo) { if (!ok) return; try { - const r = await fetch('api/movimientos.php', { + const r = await apiFetch('api/movimientos.php', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: parseInt(id) }) diff --git a/pagos/js/ui.js b/pagos/js/ui.js index c8a0029..345cd72 100644 --- a/pagos/js/ui.js +++ b/pagos/js/ui.js @@ -1,3 +1,13 @@ +// Wrapper de fetch que redirige al login si la sesión expiró +window.apiFetch = async function (url, options = {}) { + const r = await fetch(url, options); + if (r.status === 401) { + window.location.href = 'login.html'; + return null; + } + return r; +}; + (function () { const MODAL_HTML = `