Skip to content

install.sh: o sentinela 000 do curl é código morto — v_supabase_url aceita URL de Supabase inalcançável #190

Description

@melgarafael

Medido na main 9249e6f, achado durante a triagem do PR #188 (@ygorebos).

O defeito

hostgator-setup-kit/install.sh:195:

code="$(curl -s -o /dev/null -w '%{http_code}' -m 15 "$1/auth/v1/health" 2>/dev/null || echo 000)"
if [ "$code" = "000" ]; then
  echo "Não consegui alcançar $1 — confira se o projeto existe, está ativo …"
  return 1
fi

Quando o curl não alcança o host ele faz duas coisas: imprime 000 por causa do
-w '%{http_code}' e sai com código ≠ 0. Aí o || echo 000 dispara e acrescenta um segundo
000. A variável fica com 000000, que nunca é igual a "000"o ramo da recusa é código morto.

$ c="$(curl -s -o /dev/null -w '%{http_code}' -m 5 https://nao-existe-xyz.invalid/x 2>/dev/null || echo 000)"
$ printf '%s' "$c" | od -c | head -1
0000000    0   0   0   0   0   0

O efeito no usuário

O instalador aceita uma URL de Supabase inalcançável. Medido na main 9249e6f, chamando o
validador pelo mesmo caminho que a suíte usa (INSTALL_SH_LIB=1 . ./install.sh):

$ v_supabase_url "https://abcdefgh.supabase.co"   # projeto que não existe; curl sai 6 (não resolve)
rc=0    # aceitou, sem imprimir nada

Ou seja: quem digita a URL do projeto errado, ou cola a de um projeto pausado, passa da Fase 1. É a
classe falha-em-verde de triagem/references/complemento-do-ci.md §7 — num produto que a pessoa
instala sozinha, ninguém está olhando.

É classe, não instância

O mesmo || echo 000 está em 5 lugares de install.sh — linhas 195, 228, 235, 292 e 306. Os
outros quatro comparam por case e a duplicação cai no ramo *), com sintomas diferentes:

onde intenção do 000) o que acontece de verdade
v_supabase_url (195) recusar aceita (o único que falha ABERTO)
v_sb_key (228, 235) avisar e seguir recusa com Resposta inesperada do Supabase ao testar a chave (000000)
v_anthropic (292) avisar e seguir segue, dizendo a Anthropic respondeu 000000
v_openai (306) avisar e seguir segue, dizendo a OpenAI respondeu 000000

O de v_sb_key é o que morde quem instala com Supabase próprio: um host que o instalador não
resolve vira uma recusa dura com um número que não existe em lugar nenhum.

⚠ Consertar SÓ um sítio inverte o sinal — os 5 vão juntos

Isto foi medido, e é a parte contraintuitiva desta issue. A tabela acima destaca o sítio de
v_sb_key como "o que morde quem instala com Supabase próprio", e a tentação é começar por ele.
Não comece — e não pare nele.

v_sb_key é hoje a barreira que segura uma URL que não é Supabase: o v_supabase_url aceita
(porque o 000 está morto) e o v_sb_key recusa logo depois. Consertando o sítio de
v_sb_key, o 000 volta a ser reconhecido lá — e o ramo 000) dele é avisar e seguir, não
recusar. Resultado medido, aplicando o conserto isoladamente:

# com o conserto SÓ em v_sb_key, sobre a árvore que já tem o PR #188
url=https://zzzz-nao-existe.supabase.co   passo1_rc=0  passo2_rc=0  "⚠ não consegui checar a chave online; sigo com ela."
url=https://nao-existe-zzz.invalid        passo1_rc=0  passo2_rc=0  idem

Ou seja: a cadeia inteira abre para qualquer https:// inalcançável. O conserto parcial é pior
que o bug. v_supabase_url (linha 195) nunca pode ficar de fora do mesmo commit.

A correção

Uma linha em cada, tirando o echo de dentro da substituição:

code="$(curl -s -o /dev/null -w '%{http_code}' -m 15 "$1/auth/v1/health" 2>/dev/null)" || code=000

Medido:

padrão atual     code=[000000]  casa com "000"? NAO
padrão corrigido code=[000]     casa com "000"? SIM
caminho feliz    code=[200]     (não regride)

Por que nenhum gate pegou

hostgator-setup-kit/test-validators.sh cobre os validadores — mas nenhum job de CI o executa
(pnpm test:shell roda só tests/shell/update-guard.test.sh). Ver a issue irmã sobre isso.

E há um agravante de modelo mental: test-validators.sh:664 documenta o dublê de curl com o
comentário "Só o v_supabase_url exige resposta online (000 reprova); os outros toleram" — a
afirmação que este bug torna falsa. O comentário está certo sobre a intenção e errado sobre o
comportamento.

Aceite

  • as 5 ocorrências corrigidas
  • caso em test-validators.sh que reprova se o ramo 000 voltar a ser inalcançável (sabotar a correção tem de ficar vermelho)
  • o comentário de test-validators.sh:664 conferido contra o comportamento novo

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/kitArea tocada: kit

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions