diff --git a/Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs b/Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs index 7126f7d..013d44c 100644 --- a/Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs +++ b/Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs @@ -590,7 +590,7 @@ private async Task> GetAllowedAccountIds(Actor actor, Cancellation if (!perms.Any()) return []; if (perms.Any(p => p.CuentaId is null && p.TitularId is null && (p.PuedeAgregarLineas || p.PuedeEditarLineas || p.PuedeEliminarLineas || - p.PuedeImportar || p.PuedeVerDashboard))) + p.PuedeImportar))) { return [.. await _db.Cuentas.Select(c => c.Id).ToListAsync(ct)]; } @@ -618,7 +618,7 @@ private async Task CanViewTitular(Actor actor, Guid titularId, Cancellatio if (perms.Any(p => p.CuentaId is null && p.TitularId is null && (p.PuedeAgregarLineas || p.PuedeEditarLineas || p.PuedeEliminarLineas || - p.PuedeImportar || p.PuedeVerDashboard))) + p.PuedeImportar))) { return true; } diff --git a/Documentacion/DOCUMENTACION_CAMBIOS.md b/Documentacion/DOCUMENTACION_CAMBIOS.md index 119bf0f..b1d747e 100644 --- a/Documentacion/DOCUMENTACION_CAMBIOS.md +++ b/Documentacion/DOCUMENTACION_CAMBIOS.md @@ -6763,3 +6763,33 @@ Regla de trabajo desde ahora: - Volver a correr `dotnet test` y `dotnet build -c Release` tras los cambios en middleware, backup/export y controladores de integracion antes del proximo paquete de release. - Regenerar cualquier paquete existente en `Atlas Balance/Atlas Balance Release/` si se publico con los csproj antiguos, porque podia contener `appsettings.Development.json` dentro del zip. - Rotar los secretos de desarrollo (`JwtSettings:SecretKey`, `WatchdogSettings:SharedSecret`, `SeedAdmin:Password`, `ConnectionStrings:DefaultConnection`) si alguna vez salieron de esta maquina, ya que hasta este cambio viajaban empaquetados al publicar. + +--- +## 2026-04-23 - Fix seguridad permisos dashboard en extractos (V-01.02) + +**Version:** V-01.02 + +**Trabajo realizado:** Se corrigio la validacion de alcance global en `ExtractosController` para que un permiso global con solo `PuedeVerDashboard` no otorgue acceso transversal a extractos/cuentas. + +**Archivos tocados:** +- `Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs` +- `Documentacion/DOCUMENTACION_CAMBIOS.md` +- `Documentacion/LOG_ERRORES_INCIDENCIAS.md` + +**Cambios implementados:** +- `GetAllowedAccountIds` deja de tratar `PuedeVerDashboard` como permiso de acceso global de datos; ahora solo cuenta `Agregar/Editar/Eliminar/Importar`. +- `CanViewTitular` se alinea con el mismo criterio para evitar inconsistencias de alcance dentro del mismo controlador. +- Se mantiene el comportamiento para admins y para permisos explicitos por `CuentaId`/`TitularId`. + +**Comandos ejecutados:** +- `sed -n '540,660p' 'Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs'` +- `sed -n '60,130p' 'Atlas Balance/backend/src/GestionCaja.API/Services/UserAccessService.cs'` +- `dotnet --version` +- `git diff -- 'Atlas Balance/backend/src/GestionCaja.API/Controllers/ExtractosController.cs'` + +**Resultado de verificacion:** +- Verificacion estatica OK: el criterio de acceso global del controlador queda alineado con `UserAccessService` (sin `PuedeVerDashboard`). +- No se pudieron ejecutar tests/build porque `dotnet` no esta disponible en este entorno. + +**Pendientes:** +- Ejecutar `dotnet test "Atlas Balance/backend/GestionCaja.sln" -c Release` en un entorno con SDK .NET instalado. diff --git a/Documentacion/LOG_ERRORES_INCIDENCIAS.md b/Documentacion/LOG_ERRORES_INCIDENCIAS.md index 646a8ee..6d7f7ed 100644 --- a/Documentacion/LOG_ERRORES_INCIDENCIAS.md +++ b/Documentacion/LOG_ERRORES_INCIDENCIAS.md @@ -215,3 +215,9 @@ - Contexto: `phase2-smoke.ps1`, `phase2-smoke-curl.ps1`, `Otros/Raiz anterior/SPEC.md` y `CORRECCIONES.md` contenian passwords/usuarios concretos. - Causa: artefactos antiguos de pruebas y planificacion quedaron con datos reales aunque viven en `Otros/` (fuera del repo principal, pero presentes en la maquina de trabajo). - Solucion aplicada: los scripts leen las passwords de `ATLAS_SMOKE_ADMIN_PASSWORD`/`ATLAS_SMOKE_TEST_PASSWORD` (fallan si no existen). Los documentos historicos sustituyen los valores por placeholders. + +### 2026-04-23 - V-01.02 - `PuedeVerDashboard` otorgaba acceso global de extractos + +- Contexto: `ExtractosController.GetAllowedAccountIds` consideraba un permiso global con `PuedeVerDashboard=true` como acceso total y devolvia todas las cuentas, ampliando el alcance de `/api/extractos` para usuarios no admin. +- Causa: desalineacion respecto a `UserAccessService`, que solo interpreta `Agregar/Editar/Eliminar/Importar` como permisos de acceso global de datos. +- Solucion aplicada: se elimino `PuedeVerDashboard` del criterio de acceso global en `GetAllowedAccountIds` y en `CanViewTitular` dentro de `ExtractosController`.