ipa-activity-generator-ptbr / docs /CODEBASE_AUDIT.md
Jesse Daniel Brown
Atualiza auditoria e prompts de próximos passos
24607a1
|
Raw History Blame Contribute Delete
6.11 kB

CODEBASE AUDIT

Resumo executivo

Status: Amarelo — a base de Next.js + Prisma + NextAuth está estruturada, com hashing de senha, validação por Zod, rate limit e fluxo de upload assinado para áudios. Ainda faltam camadas críticas: a geração de planos via IA é só placeholder, o driver de armazenamento cai para modo local inseguro, não há verificação de consentimento nem RBAC fino no backend, e os fluxos de teste/CI dependem de dependências não instaladas (não executadas nesta auditoria).

Mapa de arquitetura

  • Stack principal: Next.js 15 (App Router) com React 19 RC, TypeScript, Tailwind/shadcn, NextAuth (credenciais + Prisma adapter), Prisma/PostgreSQL, AWS SDK para S3 (presign) e Playwright/Vitest.
  • Rotas de página: / (landing), /login, /register, /dashboard (layout com subpáginas settings, students, recordings, plans), /capture (fluxo móvel). Todas protegidas por middleware exceto landing/auth.
  • APIs App Router:
    • Autenticação: /api/auth/[...nextauth] (NextAuth), /api/auth/register (cria org+usuário ADMIN, bcrypt, rate limit).
    • Estudantes/consentimento: /api/students (GET/POST), /api/students/[id] (GET/PATCH/DELETE), /api/students/[id]/consent (GET último consentimento).
    • Gravações: /api/storage/sign-upload (presign de upload), /api/storage/sign-download (presign de download), /api/recordings (GET/POST registro no DB).
    • Planos: /api/plans/generate retorna 501 (ainda não implementado).
  • Modelos de dados (Prisma): Organization ↔ Membership ↔ User (roles ADMIN/TEACHER); Student (código único por org, nome/notas opcionais) ↔ Consent (audioAllowed/shareForResearch, signedByUserId) ↔ Recording (orgId/studentId/storageKey/mime/duração, autor); Plan (orgId, autor, needs/plan em JSON).
  • Fluxo de áudio: página /capture usa MediaRecorder, valida MIME/tamanho (10MB), obtém URL assinada, envia para storage e registra gravação. Storage provider tenta S3 com presign Put/Get; se faltar config, usa driver "local" sem autenticação (URL query) e cache em memória.
  • Geração de planos (IA): schema ActivityPlan definido com Zod, mas endpoint devolve 501; não há chamadas ao OpenAI nem persistência de planos.

Achados de segurança e privacidade

  • Positivos: senhas hashadas com bcrypt; rate limiting em memória para login/registro/geração; validação por Zod em todas as rotas expostas; chaves de objeto de áudio incluem org/estudante; download verifica prefixo da org; códigos de estudante únicos por organização (pseudonimização).
  • Riscos/ausências:
    • Consentimento apenas no cliente: APIs de upload/gravação não checam consentimento nem se shareForResearch foi negado; qualquer membro autenticado da org pode gravar.
    • RBAC frouxo: enum de papéis existe, mas APIs não usam requireRole; TEACHER pode criar/alterar estudantes, gravar e baixar áudios sem restrição.
    • Armazenamento local inseguro: fallback automático para driver local gera URLs públicas sem assinatura/expiração; risco de exposição de áudio se variáveis S3 faltarem.
    • Geração de planos sem guardrails: endpoint retorna 501, sem validação de entrada/saída efetiva nem isolamento de chave OpenAI; potencial risco ao implementar sem checagens.
    • Faltam constraints: Membership não tem unicidade (usuário pode repetir na mesma org), Consent não garante único registro atual por estudante, Recording não impõe size/mime no backend além do enum; cascades não definidas.
    • Proteções adicionais: rate limit não persistente (multi-instância vulnerável), logs de erro podem vazar stack traces, não há scrubbing de dados sensíveis em logs.
    • Uploads: validação de tamanho/tipo só no sign-upload; download aceita qualquer key com prefixo org (sem checar MIME/expiração). Nenhum antivírus ou checagem de duração.
    • Tests/CI dependem de deps não instaladas: não executados nesta auditoria (restrição solicitada); risco de regressões ocultas.

Testes e CI

  • Scripts: lint/build/test (Vitest) e test:e2e (Playwright) configurados em package.json; Prisma seed configurado.
  • Configurações: Vitest em ambiente Node com alias @; Playwright usa Chromium e E2E_BASE_URL; CI GitHub Actions roda npm ci, lint, vitest e build (sem e2e).
  • Estado atual: Dependências não instaladas por orientação; nenhum teste/lint/build executado nesta auditoria.

Top 10 correções priorizadas (menor esforço → maior)

  1. Acrescentar checagem de consentimento (audioAllowed/shareForResearch) em /api/storage/sign-upload e /api/recordings para bloquear uploads sem autorização.
  2. Aplicar RBAC com requireRole nas rotas de estudantes/gravações/planos (ex.: apenas ADMIN cria/edita; TEACHER apenas lê/grava quando autorizado).
  3. Endurecer driver local de storage: habilitar somente em dev, adicionar token/HMAC com expiração ou remover fallback automático em produção.
  4. Adicionar endpoint para registrar/atualizar consentimento (POST/PATCH em /api/students/[id]/consent) com auditoria de quem assinou e data.
  5. Implementar validação adicional de uploads: reconfirmar MIME/tamanho no backend, rejeitar keys fora do padrão e registrar logs de auditoria.
  6. Definir constraints adicionais no Prisma (unicidade Membership por org/usuário; cascades ou ON DELETE RESTRICT onde fizer sentido; índice para Recording). Migrar DB conforme ajustes.
  7. Implementar geração de planos IA com schema ActivityPlan, chamada server-side ao OpenAI Responses API, e persistir planos vinculados à org/usuário.
  8. Persistir rate limiting (Redis/Upstash) e aumentar janelas para fluxos sensíveis (auth/upload), com métricas básicas de abuso.
  9. Ajustar storage S3 para exigir envs completos em produção (bucket/region/credenciais) e considerar criptografia/expiração curta para URLs.
  10. Criar cobertura automatizada (Vitest/Playwright) para consentimento, RBAC e upload, e condicionar e2e a variável de ambiente (ex.: E2E_RUN).