Execução da req-171.
Atividades e Checklist
1. [x] Configuração de Ambiente e Retrocompatibilidade
-
[x] Adicionar suporte a
CAPTCHA_PROVIDER(none|google-recaptcha|cloudflare-turnstile) emgestor/config.php. -
[x] Adicionar variáveis
TURNSTILE_SITE_KEY,TURNSTILE_SECRET_KEYeTURNSTILE_MODEemgestor/config.php. -
[x] Garantir inferência retrocompatível: se
CAPTCHA_PROVIDERnão existir no.env, masUSUARIO_RECAPTCHA_ACTIVEfortrue, assumirgoogle-recaptcha. -
[x] Atualizar template
.envemgestor/autenticacoes.exemplo/dominio/.envcom documentação e chaves de teste da Cloudflare.
2. [x] Abstração Centralizada de Validação Backend
-
[x] Criar helper/função centralizada
gestor_captcha_validar(?string $token = null, array $opcoes = []): array|bool(ex.: emgestor/bibliotecas/seguranca.phpou biblioteca apropriada). -
[x] Implementar chamada cURL para
[REDACTED]com tratamento de timeout (5s) e parse de retorno. -
[x] Refatorar validações de captcha em
gestor/bibliotecas/formulario.phpegestor/modulos/perfil-usuario/perfil-usuario.phppara utilizar a nova função centralizada. -
[x] Garantir que falha no Turnstile seja contabilizada como abuso no rate-limiting de acessos.
3. [x] Frontend, Componentes e Injeção de Assets
-
[x] Injetar script oficial do Turnstile (
[REDACTED]) dinamicamente quando o provedor for Turnstile. -
[x] Integrar renderização do widget nos formulários de autenticação (
perfil-usuario:acessar-sistema,cadastrar-se,esqueceu-a-senha) nos temas Fomantic UI e Tailwind CSS. -
[x] Integrar widget no motor de formulários dinâmicos (
gestor/assets/interface/formulario.jseformulario.php). -
[x] Garantir que o token
cf-turnstile-responseseja enviado em submissões AJAX e manipulado adequadamente em caso de erro/reset.
4. [x] Módulo Administrativo (admin-environment)
-
[x] Atualizar UI de
admin-environment(HTML e PHP) para permitir seleção deCAPTCHA_PROVIDERe inputs de chaves do Turnstile. -
[x] Implementar endpoint AJAX de teste das chaves do Turnstile no painel administrativo.
5. [x] Testes e Validação
-
[x] Criar testes unitários PHPUnit cobrindo os diferentes cenários do validador (chaves de teste Cloudflare, mock de rede, timeout, erros).
-
[x] Rodar
php -lnos arquivos modificados. -
[x] Executar suíte de testes PHPUnit e Vitest sem regressões.
Critérios de Aceite e Validação
-
Seleção de Provedor: Suporte transparente a
none,google-recaptchaecloudflare-turnstile. -
Retrocompatibilidade: Instalações prévias continuam funcionando com Google reCAPTCHA sem qualquer quebra.
-
Abstração Limpa: Chamadas de validação de captcha no core unificadas na função centralizada.
-
Proteção Efetiva: Autenticação e formulários públicos validados com sucesso via Turnstile.
-
Painel de Gestão:
admin-environmentconfigura e testa as credenciais do Turnstile. -
Suíte Verde: 100% dos testes da suíte passam com sucesso.
Execução e evidências (2026-09-22)
-
CAPTCHA_PROVIDERaceitanone,google-recaptchaecloudflare-turnstile. Valor ausente ou vazio preserva a inferência porUSUARIO_RECAPTCHA_ACTIVE. -
gestor_captcha_validar()concentra Siteverify, valida token e resposta, limita cURL a 5 segundos e aceita transporte injetado nos testes. Os fluxos de perfil-usuario, formulários públicos e testes de reCAPTCHA do painel usam o helper. Falhas de CAPTCHA seguem como abuso no controle de acessos; o signup ganhou contagem explícita. -
Widget Turnstile com renderização explícita em autenticação e formulários públicos. O campo
cf-turnstile-responseentra na submissão nativa ou noFormDataAJAX. O motor de formulários reinicia o widget após erro. O modo do widget é definido pela Site Key na Cloudflare;TURNSTILE_MODEregistra essa escolha no ambiente. -
Admin Environment oferece seletor, credenciais e teste AJAX do Turnstile, com textos em variáveis de módulo para
enept-br. -
php -lem 6 arquivos: sem erros;node --checkem 3 arquivos: sem erros; PHPUnit: 1.187 testes, 7.843 asserções, 4 pulados, exit 0; Vitest: 423/423, exit 0;assets:minify --verificar: 0 derivados desatualizados;resources:sync: exit 0, 2.882 recursos e nenhum problema detectado;git diff --check: exit 0. -
A primeira execução do PHPUnit falhou no teste RSA porque
OPENSSL_CONFapontava para um caminho ausente no host. Com o arquivoextras/ssl/openssl.cnfda instalação PHP 8.5, a suíte completa passou. -
O ambiente de teste foi identificado em
dev-environment/data/environment.json:[REDACTED]usa SSH/HestiaCP emlabe[REDACTED].php cli/c2f.php project:update-all [REDACTED]concluiu os 8 estágios no Lab (core, banco, recursos, arquivos, CSS, JS e assets). Foi preciso priorizarC:\Program Files\Git\binnoPATHpara quebashresolvesse para Git Bash em vez do atalho WSL do Windows. A publicação opcional emdist/permaneceu semPUBLIC_PATH; o pipeline publicou o que era aplicável ao projeto. -
MariaDB
admin_conn2flow:paginascontémadmin-environmentemenept-br, com HTML de Turnstile sincronizado (comprimentos 33.252 e 37.704 bytes, posição do texto 15.379 e 19.205). O banco respondeu sem impedimento; não havia necessidade de Docker. -
Com as chaves oficiais de teste da Cloudflare temporariamente configuradas no Lab, Playwright verificou
/signin/,/signup/,/forgot-password/e/contact/: HTTP 200, contêiner.cf-turnstile, campocf-turnstile-response, widget visualmente renderizado e nenhum erro de console. Capturas emtemp/batch-176-*-turnstile.png(artefatos locais ignorados pelo Git). O inspector padrão aguardounetworkidleindefinidamente por causa do script da Cloudflare; a checagem usoudomcontentloadede espera curta. -
Em
/admin-environment/, a aba Usuário mostrou o provedor selecionado e o bloco Turnstile. O botão de teste gerou token e a rota AJAX retornou “Chaves e token do Turnstile válidos.”; o salvamento pela interface retornou HTTP 200 estatus=success, e as quatro variáveis apareceram no.envremoto. O.envoriginal do Lab foi restaurado após cada teste; o checkout do projeto também foi restaurado após a geração automática deschema-metadata.json. -
Correção de diagnóstico: a primeira conclusão de que a homologação dependia de Docker foi incorreta. A skill
c2f-agent-visual-inspectiondescreve um ciclo antigo centrado em Docker, masc2f-project-pipeline-and-tasks,c2f-projects-systemec2f-shell-and-windows-traps, em conjunto comenvironment.json, apontavam para o fluxo SSH/HestiaCP. Eu não cruzei essas fontes antes de encerrar a primeira validação. O SQL é a fonte do HTML servido e foi consultado no MariaDB do Lab; o entrave prático adicional foiauth:cookie --projectmontar aspas incompatíveis com [REDACTED] quando iniciado no Windows. A sessão de teste foi gerada com o gerador existente diretamente no Lab.
Estado
complete