33 lines
2.4 KiB
JSON
33 lines
2.4 KiB
JSON
{
|
|
"feature_id": "CLUB-001",
|
|
"agent": "security",
|
|
"stage": "security_gate",
|
|
"verdict": "APPROVED",
|
|
"security_check": "security",
|
|
"summary": "Aprobado: CLUB-001 mantiene autenticación, validación e integridad adecuadas; los tokens de dispositivo no se almacenan en claro y el ledger usa claves de idempotencia para evitar duplicados.",
|
|
"checks": {
|
|
"auth": "OK: /admin/club/settings exige authenticate + requireRole(admin); /club/me y /club/movements solo resuelven miembro con sesión customer o token de dispositivo válido; /club/join no expone privilegios administrativos.",
|
|
"secrets": "OK: el raw device token solo se entrega al cliente y en base de datos se persiste exclusivamente device_token_hash (SHA-256). No se introducen secretos hardcoded ni credenciales nuevas.",
|
|
"input_validation": "OK: settings admin y query de movimientos usan zod + parseJson; los errores de dominio se traducen a AppError controlados.",
|
|
"integrity": "OK: club_transactions tiene idempotency_key único; recordTransaction bloquea la fila de club_members con FOR UPDATE y rechaza balances negativos.",
|
|
"injection_xss": "OK: las consultas SQL del módulo están parametrizadas y no se introduce renderizado HTML crudo ni eval/dangerouslySetInnerHTML.",
|
|
"dependencies": "OK: no se añadieron dependencias nuevas para el módulo Club."
|
|
},
|
|
"notes": [
|
|
"La cookie mdv_club se emite como httpOnly + sameSite=lax y marca secure cuando la petición llega por HTTPS o x-forwarded-proto=https.",
|
|
"El warning de envío de email no configurado visto en la itest proviene del flujo preexistente de registro de identidad y no de la superficie nueva del Club."
|
|
],
|
|
"evidence": [
|
|
"project/src/modules/club/api/club.routes.ts",
|
|
"project/src/modules/club/application/club-service.ts",
|
|
"project/src/modules/club/infrastructure/device-token.ts",
|
|
"project/src/modules/club/infrastructure/pg-club-repository.ts",
|
|
"project/migrations/066_club_core.js",
|
|
"rg -n \"device_token_hash|x-club-device-token|mdv_club|club_enabled|club_cashback_bps|idempotency_key\" project/src/modules/club project/migrations/066_club_core.js",
|
|
"cd project && npm run typecheck",
|
|
"cd project && npm run build",
|
|
"cd project && TEST_DATABASE_URL=postgres://mdv:mdv_dev_only@localhost:5432/mercadodevida_test npx vitest run src/app/tests/club.itest.ts --no-file-parallelism"
|
|
],
|
|
"timestamp": "2026-08-26T16:53:40Z"
|
|
}
|