Skip to content

Commit c4cd7a7

Browse files
melgarafaelGervanno
andcommitted
fix(kit): a mensagem "não encontrado" do reset-password volta a ser alcançável
O PR #552 de @Gervanno consertou a causa raiz: `owner_id_by_email` pedia `?filter=email.eq.<email>`, sintaxe do PostgREST que o GoTrue não fala, e devolvia vazio para todo mundo. Reproduzido contra o GoTrue local v2.188.1 e confirmado — inclusive a exigência de casamento exato, porque o `filter` é substring e `?filter=ana@empresa.com` também traz `mariana@empresa.com`. Sobrou um resíduo que a triagem mediu no caminho de produção. `_common.sh` roda sob `set -euo pipefail` e o consumidor resolve o UUID numa ATRIBUIÇÃO: uid="$(owner_id_by_email "$EMAIL")" [ -n "$uid" ] || die "Usuário '$EMAIL' não encontrado." O status da atribuição é o da substituição de comando. O `grep` final devolve 1 quando não casa ninguém, então a função devolvia 1, e o `set -e` matava o script na PRIMEIRA linha — a segunda, que existe justamente para o e-mail que não existe, nunca rodava. Medido com as duas linhas reais contra o GoTrue local, e-mail inexistente: rc=1 e nenhuma saída. Quem errasse uma letra no endereço via o prompt de volta e mais nada. Conserto: `|| return 0` no fim do pipeline. A função devolve VAZIO e quem chama decide o que dizer — que é o contrato que o `[ -n "$uid" ] || die` já supunha. O teste do PR guardava o call site por `grep` das duas linhas, o que prova que elas existem e não que elas rodam. Acrescentei dois casos que EXECUTAM o call site sob o `set -e` real. Sabotagem do conserto (revertendo só o `|| return 0`): 1 dos 11 casos reprova, e é o que descreve o resíduo. Co-Authored-By: Elias Gervanno <vendiolabs@gmail.com>
1 parent 5ed857a commit c4cd7a7

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

hostgator-setup-kit/_common.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,20 @@ set_env_var() {
668668
# Falha FECHADA: se o GoTrue mudar a ordem dos campos, o padrão não casa e a
669669
# função devolve vazio — quem chama morre com "não encontrado", que é ruim mas
670670
# recuperável. Devolver o UUID errado, não.
671+
#
672+
# ── Por que o `|| return 0` do fim não é enfeite ────────────────────────────
673+
# `_common.sh` roda sob `set -euo pipefail`, e o consumidor resolve o UUID numa
674+
# ATRIBUIÇÃO: `uid="$(owner_id_by_email "$EMAIL")"`. O status da atribuição é o
675+
# da substituição, então uma função que devolve não-zero mata o script ALI — na
676+
# linha de cima do `[ -n "$uid" ] || die "Usuário não encontrado."`, que nunca
677+
# chega a rodar. E o `grep` devolve 1 justamente quando não casa ninguém, que é
678+
# o caso em que a mensagem existe para falar.
679+
#
680+
# Medido em 2026-09-03 contra o GoTrue local v2.188.1, e-mail inexistente, as
681+
# duas linhas reais do reset-password.sh: rc=1 e NENHUMA saída — o operador que
682+
# erra uma letra no endereço não vê aviso nenhum, só o prompt de volta. "Não
683+
# encontrado" era uma mensagem inalcançável. O `|| return 0` põe a decisão onde
684+
# ela pertence: a função devolve VAZIO, e quem chama decide o que dizer.
671685
owner_id_by_email() {
672686
local email="$1" resp esc
673687
resp="$(curl -fsS "${NEXT_PUBLIC_SUPABASE_URL}/auth/v1/admin/users?filter=${email}" \
@@ -676,7 +690,7 @@ owner_id_by_email() {
676690
esc="$(printf '%s' "$email" | sed 's/[.[\*^$]/\\&/g')"
677691
printf '%s' "$resp" \
678692
| grep -o "\"id\":\"[0-9a-f-]\{36\}\",\"aud\":\"[^\"]*\",\"role\":\"[^\"]*\",\"email\":\"${esc}\"" \
679-
| head -1 | sed 's/^"id":"//;s/".*//'
693+
| head -1 | sed 's/^"id":"//;s/".*//' || return 0
680694
}
681695

682696
# Ativa (idempotente) o cron que dispara o drain de eventos a cada minuto. SEM

tests/shell/owner-id-por-email.test.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,42 @@ check "reset-password.sh resolve o uid pela função" \
133133
check "reset-password.sh morre quando o uid vem vazio" \
134134
grep -qE '\[ -n "\$uid" \] \|\| die' "$KIT_DIR/reset-password.sh"
135135

136+
printf '\n\u25b6 o call site EXECUTADO (grep de linha nao e comportamento)\n'
137+
138+
# Os dois greps acima provam que as linhas EXISTEM. Nenhum prova que elas RODAM,
139+
# e era exatamente ali que morava o residuo: `_common.sh` roda sob
140+
# `set -euo pipefail` e o consumidor resolve o UUID numa ATRIBUICAO —
141+
# `uid="$(owner_id_by_email "$EMAIL")"`. O status da atribuicao e o da
142+
# substituicao, entao uma funcao que devolve nao-zero mata o script NA LINHA
143+
# ANTERIOR ao `[ -n "$uid" ] || die`. E o `grep` devolve 1 justamente quando nao
144+
# casa ninguem — o unico caso em que a mensagem tem o que dizer.
145+
#
146+
# Medido em 2026-09-03 contra o GoTrue local v2.188.1, e-mail inexistente, estas
147+
# duas linhas reais: rc=1 e NENHUMA saida. O operador que erra uma letra no
148+
# endereco nao via aviso nenhum, so o prompt de volta.
149+
cat > "$WORK/callsite.sh" <<'CALLSITE'
150+
. "$1"/_common.sh
151+
uid="$(owner_id_by_email "$2")"
152+
[ -n "$uid" ] || die "Usuario '$2' nao encontrado."
153+
printf 'ACHOU %s\n' "$uid"
154+
CALLSITE
155+
156+
callsite() { # callsite <email> -> o que o operador ve (stdout + stderr)
157+
(
158+
NEXT_PUBLIC_SUPABASE_URL="https://exemplo.supabase.co" \
159+
SUPABASE_SERVICE_ROLE_KEY="chave-de-teste" COLOR=0 \
160+
bash "$WORK/callsite.sh" "$KIT_DIR" "$1" 2>&1
161+
)
162+
}
163+
164+
check "o call site chega ao uid quando o e-mail existe" \
165+
test "$(callsite 'ana@empresa.com')" = "ACHOU $ANA"
166+
167+
# A guarda do residuo. Sem o `|| return 0` no fim de `owner_id_by_email`, esta
168+
# saida e a string VAZIA — nao a mensagem.
169+
check "e-mail inexistente: o operador VE 'nao encontrado' (o die e alcancavel)" \
170+
bash -c 'case "$1" in *"nao encontrado"*) exit 0 ;; *) exit 1 ;; esac' _ "$(callsite 'ninguem@empresa.com')"
171+
136172
printf '\n'
137173
[ "$FAILS" -eq 0 ] && { printf '✓ owner-id-por-email: tudo verde\n'; exit 0; }
138174
printf '✗ owner-id-por-email: %d falha(s)\n' "$FAILS"; exit 1

0 commit comments

Comments
 (0)