cellarvinhostechteam/novo-app-cellar
feat/tab-pop-to-top · 22 de setembro de 2026 às 12:54 · gpt-5.6-sol
A implementação apresenta riscos relevantes em segurança de transporte, publicação acidental em produção e exposição de credenciais. Também há um bug reproduzível no script de migração de ScrollView, falhas de confiabilidade no modal de cupons e ausência de testes automatizados. Score: 55/100.
Tráfego HTTP sem criptografia está liberado globalmente em iOS e Android
securityapp.config.jsA configuração define NSAllowsArbitraryLoads: true no iOS, tanto diretamente quanto em infoPlist, e usesCleartextTraffic: true no Android. Isso permite conexões HTTP não criptografadas para qualquer domínio.
Push notification de produção está configurado explicitamente em modo de desenvolvimento
reliabilityapp.config.jsO entitlement aps-environment está definido como development e o onesignal-expo-plugin recebe mode: "development" sem diferenciação por perfil EAS. Os mesmos valores são usados pelo perfil production.
Commits na branch development podem publicar OTA diretamente no canal production
reliability.eas/workflows/publish-development-updates.ymlO workflow executa em pushes para development e publica no channel production quando a mensagem do commit contém simultaneamente as substrings "update" e "production". Uma mensagem como "do not update production" também satisfaz a condição, sem aprovação ou validação adicional.
Token de autenticação e e-mail são inseridos diretamente na URL do WebView
securitysrc/components/home/ClubeWelcome.tsxA navegação constrói a URL https://socio.cellarvinhos.com/loginWebview?email=${userEmail}&tokenVtex=${authCookie?.Value}. Credenciais em query string podem aparecer em logs, telemetria, histórico e cabeçalhos de referência. Os valores também não são codificados; e-mails com '+' ou tokens contendo '&', '#' ou '=' podem ser interpretados incorretamente.
Script substitui ScrollView, mas não adiciona o import de AppScrollView
bugreplace_scrollviews.jsO script primeiro substitui '<ScrollView' por '<AppScrollView' e depois testa if (!content.includes('AppScrollView')). Após a substituição, essa condição sempre será falsa, portanto importStatement nunca é inserido em arquivos que ainda não importavam AppScrollView. O resultado é código com identificador não definido.
Falha no AsyncStorage pode impedir o fechamento do modal
reliabilitysrc/components/home/SelecaoCupons/HowToUseCouponsModal.tsxhandleClose aguarda AsyncStorage.setItem ou removeItem antes de chamar onClose, sem try/finally. Se a operação rejeitar, onClose não é executado. loadPref também chama getItem sem tratamento de erro, podendo gerar rejeição não tratada.
Consulta da vitrine é executada mesmo quando o componente será ocultado
performancesrc/components/home/MinhaVitrine.tsxuseAdegaProductsQuery(skus) é chamado antes da condição que retorna null para usuários que não pertencem ao clube. Além disso, skus recebe uma lista padrão, fazendo com que usuários sem skus personalizados ainda possam disparar a consulta.
Build de produção também pode ser disparado por texto ambíguo em commit de development
reliability.eas/workflows/create-development-builds.ymlO job dev_build_production roda em push para development quando a mensagem contém as substrings "build" e "production". Não há aprovação, tag, branch de release ou correspondência exata do comando.
Não há infraestrutura de testes automatizados declarada
testingpackage.jsonOs scripts disponíveis cobrem execução, build, submit e upload de source maps, mas não há script de test, lint ou typecheck. Também não há dependência de runner de testes entre as dependências fornecidas.
Logs verbosos do OneSignal ficam habilitados também em produção
securityApp.tsxOneSignal.Debug.setLogLevel(LogLevel.Verbose) é executado no escopo global sem condição de __DEV__ ou ambiente.
Áreas vazias do conteúdo do modal podem propagar toque para o backdrop
reliabilitysrc/components/home/SelecaoCupons/HowToUseCouponsModal.tsxO conteúdo usa pointerEvents="box-none", que impede o próprio container de ser alvo de toque. Como o backdrop abaixo fecha o modal, toques em áreas do container não cobertas por filhos interativos podem atingir o backdrop, contrariando o comentário de que o conteúdo está isolado.