Files
project.linkedcorp.net/backend/src/modules/vault/routes.js
T
Milton Gonzalez 7139f1604e feat: version 2.14.0 -- compartir grupo completo y destruir con cascada
Contraseñas: "Compartir grupo" aplica el mismo share de solo lectura a todas
las credenciales de un grupo de una vez (el grupo sigue sin ser una unidad
de permiso -- es una accion de conveniencia). El grupo y cada credencial se
marcan con el icono de compartido. "Destruir grupo" ahora tiene dos
opciones: solo desagrupar (como antes) o destruir tambien las N credenciales,
con advertencia explicita del conteo.

Fix de paso en ComboBox (afecta a toda la app): el panel se cerraba solo al
abrirse si el trigger estaba cerca del borde de un contenedor con scroll,
por un micro-scroll automatico del navegador al enfocar el boton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 17:42:39 -05:00

44 lines
1.9 KiB
JavaScript

import { Router } from 'express';
import rateLimit from 'express-rate-limit';
import { requireAuth } from '../../middleware/auth.js';
import { requireVaultUnlock } from './middleware.js';
import {
getStatus, postPin, postUnlock, postChangePin, postForgotPin, postResetPin,
getEntries, getEntry, postEntry, putEntry, deleteEntry,
getGroups, postGroup, putGroup, deleteGroup, postGroupShare,
getEntryShares, postEntryShare, deleteEntryShare,
} from './controller.js';
const router = Router();
// PIN de 4 digitos: 10,000 combinaciones -- sin este limiter seria trivial de forzar.
const unlockLimiter = rateLimit({ windowMs: 15 * 60 * 1000, limit: 8, standardHeaders: true, legacyHeaders: false });
// Publico, como auth/reset-password: el link del correo puede abrirse sin sesion activa.
router.post('/reset-pin', unlockLimiter, postResetPin);
router.use(requireAuth);
router.get('/status', getStatus);
router.post('/pin', postPin);
router.post('/unlock', unlockLimiter, postUnlock);
router.post('/change-pin', unlockLimiter, postChangePin);
router.post('/forgot-pin', unlockLimiter, postForgotPin);
router.get('/groups', requireVaultUnlock, getGroups);
router.post('/groups', requireVaultUnlock, postGroup);
router.put('/groups/:id', requireVaultUnlock, putGroup);
router.delete('/groups/:id', requireVaultUnlock, deleteGroup);
router.post('/groups/:id/share', requireVaultUnlock, postGroupShare);
router.get('/entries', requireVaultUnlock, getEntries);
router.get('/entries/:id', requireVaultUnlock, getEntry);
router.post('/entries', requireVaultUnlock, postEntry);
router.put('/entries/:id', requireVaultUnlock, putEntry);
router.delete('/entries/:id', requireVaultUnlock, deleteEntry);
router.get('/entries/:id/shares', requireVaultUnlock, getEntryShares);
router.post('/entries/:id/shares', requireVaultUnlock, postEntryShare);
router.delete('/entries/:id/shares/:userId', requireVaultUnlock, deleteEntryShare);
export default router;