Skip to content

fix(cursos): evita crypto.randomUUID quebrar criação de rascunho de curso em HTTP puro - #550

Merged
PabloTzeliks merged 2 commits into
mainfrom
hotfix/crypto-randomuuid-secure-context
Jul 26, 2026
Merged

fix(cursos): evita crypto.randomUUID quebrar criação de rascunho de curso em HTTP puro#550
PabloTzeliks merged 2 commits into
mainfrom
hotfix/crypto-randomuuid-secure-context

Conversation

@PabloTzeliks

Copy link
Copy Markdown
Contributor

Contexto

Durante o review da PR #549 (que corrige o FileUpload do design system), foi feita uma vistoria em todo o repositório atrás de outros usos de crypto.randomUUID() — API restrita a secure context (HTTPS ou localhost) que quebra silenciosamente em host HTTP puro sem TLS (ex.: IP/DNS da AWS), cenário já visto em produção. A vistoria achou um segundo ponto, não coberto pela #549: a tela de criação em lote de cursos.

O que muda

  • CriarCursoFormWrapper.tsx (handleAdd, tela /cursos/novo, [FRONT-END] Tela de criação de curso #358): trocado crypto.randomUUID() por generateId() — em HTTP puro fora de localhost, clicar em "Adicionar" na lista de rascunho de curso lançava exceção síncrona dentro do setDrafts, sem erro visível na tela, e nada era adicionado à lista.
  • Novo utilitário generateId() em packages/shared/src/utils/generateId.ts — usa crypto.getRandomValues() (sem a restrição de secure context) pra montar um UUID v4 manualmente, com fallback pra Math.random() se crypto não existir de jeito nenhum. Exportado pelo barrel de @portal/shared.
  • O id gerado é só chave local de lista/React key — nunca é enviado ao backend (handleSalvarTodos mapeia só { code, name } no payload).

Issue relacionada

Sem issue de tracking dedicada — encontrado via vistoria manual solicitada durante o review da PR #549.

Como testar

  1. npx tsc --build sem erros (já validado).
  2. pnpm -w run build completo sem erros, incluindo a rota /cursos/novo (já validado).
  3. npx vitest run — 96 arquivos / 731 testes, todos passando (já validado; não há teste dedicado pra esse fluxo específico, dívida pré-existente da tela).
  4. Manual: em ambiente servido por HTTP puro fora de localhost, acessar /cursos/novo, preencher código/nome e clicar "Adicionar" — o curso deve entrar na lista de rascunho normalmente.

Tipo de mudança

  • Correção de bug
  • Nova feature
  • Refatoração (sem mudança de comportamento)
  • Documentação
  • Infraestrutura / config / build
  • Outro: ___

Checklist do autor

  • Código segue convenções definidas em CONTRIBUTING.md
  • Validei localmente que a aplicação compila/gera build sem erros (quando aplicável)
  • Verifiquei que não há erros de análise estática ou alertas relevantes no código (quando aplicável)
  • Confirmei que não há erros de tipagem/TypeScript no escopo da mudança (quando aplicável)
  • Testei manualmente os cenários principais (não reproduzido em host HTTP real — só validado por leitura de código + suíte automatizada)
  • Componentes novos/alterados documentados no Storybook (se aplicável)
  • Documentação atualizada (se aplicável)
  • Não introduzi dependências novas sem alinhamento prévio

Notas pro revisor

  • packages/shared/src/utils/generateId.ts tem o mesmo conteúdo do generateId que a PR fix: gera id local sem crypto.randomUUID em contexto inseguro #549 adiciona (lá, uma cópia local em packages/ui, porque @portal/ui ainda não depende de @portal/shared). Ao mergear as duas, o arquivo em @portal/shared deve ficar idêntico nas duas branches — conflito esperado como trivial/inexistente.
  • Sendo hotfix (nasce em main), depois de merge na main precisa também mergear de volta na develop, conforme fluxo do CONTRIBUTING.md.

…urso em HTTP puro

crypto.randomUUID() so existe em contexto seguro (HTTPS ou localhost).
Em host HTTP puro sem TLS (ex.: IP/DNS da AWS), a chamada lanca excecao
dentro do handler de adicionar rascunho, sem erro visivel na tela -
mesma causa raiz corrigida na PR #549 para o FileUpload. Move o fix
para generateId() em @portal/shared (crypto.getRandomValues, sem essa
restricao) e reusa no CriarCursoFormWrapper.
Copilot AI review requested due to automatic review settings July 26, 2026 23:09

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@PabloTzeliks PabloTzeliks self-assigned this Jul 26, 2026
@BlMedeiros
BlMedeiros removed the request for review from jonathan7gb July 26, 2026 23:12

@BlMedeiros BlMedeiros left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok

@PabloTzeliks
PabloTzeliks merged commit 4dd1ff7 into main Jul 26, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants