diff --git a/README.md b/README.md index 9f08dc5..3b2a06d 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,29 @@ O formulário consulta o time na FACEIT, preenche o nome oficial e salva um snap - Sincronização manual do elenco FACEIT pelo painel administrativo. - Gerenciamento de campeonatos FACEIT com vínculos, snapshots e sincronização automática independente por edição. - Histórico da última sincronização automática e da última falha no painel administrativo. +- Classificação suíça baseada somente em partidas finalizadas na FACEIT; partidas canceladas não alteram campanhas ou resultados. - Publicação automática do snapshot em páginas integradas, atualmente na Copa ACE 10. - Publicação automática das equipes aprovadas na página da Copa ACE 10. +- Carregamento público otimizado com imagens responsivas, CSS por rota, React Compiler, renderização adiada e cache com revalidação. - Autenticação administrativa com bcrypt e JWT em cookie `httpOnly`. -- Rate limit persistente por e-mail e, atrás do proxy confiável, também por IP. -- Validação de campos, arquivos, assinaturas binárias e caminhos de armazenamento. + +## Segurança e integridade + +- A API de inscrição permanece fechada por padrão e só aceita envios quando `REGISTRATIONS_OPEN=true`. +- Inscrições ativas reservam separadamente o ID FACEIT e o nome normalizado da equipe; uma rejeição libera as duas reservas para um novo envio corrigido. +- Campos públicos possuem limites no servidor. Imagens são decodificadas, limitadas a 25 milhões de pixels e reprocessadas sem metadados ou conteúdo excedente antes do armazenamento; imagens animadas são rejeitadas. +- Alterações administrativas exigem origem válida, usam sessão `__Host-` em produção e respostas privadas não podem ser armazenadas em cache. +- Login administrativo possui limites persistentes por origem, combinação de e-mail/origem e conta. Inscrições são limitadas por e-mail e, quando o proxy é confiável, também por IP. +- A Política de Segurança de Conteúdo opera em modo de relatório. O coletor aceita somente relatórios CSP limitados, higienizados e enviados pela mesma origem. + +## Funcionalidades em avaliação + +Estas propostas estão em pull requests e ainda não fazem parte da versão atual: + +- [#19 — sincronização acionada por webhook da FACEIT](https://github.com/cespedesdan/ace-prod/pull/19): rascunho que mantém a reconciliação agendada como segurança; aguarda validação com um evento real da FACEIT e correção da auditoria Lighthouse. +- [#11 — confirmação do líder do time pela FACEIT](https://github.com/cespedesdan/ace-prod/pull/11): fluxo OAuth que ainda precisa ser atualizado contra a `main`, ter os conflitos resolvidos e ser integrado à interface antes da reabertura das inscrições. + +Não configure webhooks ou credenciais OAuth em produção antes de essas propostas serem aprovadas e integradas. ## Rotas @@ -38,6 +56,7 @@ O formulário consulta o time na FACEIT, preenche o nome oficial e salva um snap | `/admin/inscricoes` | Aprovação e rejeição de inscrições | | `/admin/faceit` | Vínculo, sincronização e desvinculação de campeonatos FACEIT | | `/admin/noticias` | Criação, edição e exclusão de notícias | +| `/api/security/csp-report` | Coletor interno de relatórios da política de segurança | ## Desenvolvimento local @@ -59,6 +78,8 @@ Em desenvolvimento, `TRUST_PROXY` deve permanecer `false`. Defina `FACEIT_API_KEY` no `.env.local` para habilitar a consulta de times. A chave é usada somente pelo servidor: não use prefixo `NEXT_PUBLIC_` e nunca a envie ao Git. +Mantenha `REGISTRATIONS_OPEN=false` fora da janela de inscrições. Alterar somente a interface não abre nem fecha a API; reinicie o servidor depois de mudar esse valor. + ## Primeiro administrador Defina `ADMIN_EMAIL` no `.env.local`. Para criar o administrador ou redefinir sua senha no PowerShell: @@ -83,7 +104,10 @@ O banco e os uploads são privados e estão ignorados pelo Git. Os dois precisam | --- | --- | | `npm run dev` | Desenvolvimento em `0.0.0.0:8001` | | `npm run build` | Build otimizado de produção | +| `npm run analyze` | Gera o build com análise dos pacotes | | `npm run start` | Produção interna em `127.0.0.1:8001` | +| `npm run perf:seed` | Prepara dados determinísticos quando `PERFORMANCE_FIXTURES=true` | +| `npm run perf:audit` | Mede as rotas públicas com Lighthouse | | `npm run db:generate` | Gera o Prisma Client | | `npm run db:migrate` | Aplica migrations pendentes | | `npm run db:migrate:status` | Verifica o estado das migrations |