#!/bin/sh
#
# Bloqueia /autenticacao/migrar-senhas no nginx (passo 6 do Dia 0).
#
#   sh bloquear-migrar-senhas.sh              mostra o que faria
#   sh bloquear-migrar-senhas.sh --aplicar    edita, testa e recarrega
#
# Aquela rota sobrescreve o hash de senha de TODOS os usuários ativos e não
# exige autenticação. O deploy do código corrigido a remove, mas ainda não há
# caminho de entrega (D37) — então o bloqueio no servidor é o que fecha hoje.
#
# ---------------------------------------------------------------------------
# SEGURANÇA
#
# Editar nginx de produção à mão é onde se derruba o site. Este script:
#
#   1. guarda cópia do arquivo antes de tocar;
#   2. insere o bloco antes do primeiro `location /`;
#   3. roda `nginx -t`;
#   4. **desfaz sozinho** se o teste falhar, e só recarrega se passar.
#
# É idempotente: se o bloqueio já existir, não faz nada.
# ---------------------------------------------------------------------------

set -u

APLICAR=0
[ "${1:-}" = "--aplicar" ] && APLICAR=1

DOMINIO="${DOMINIO:-franquiabv.com.br}"

# ---------------------------------------------------------------------------
# Achar o vhost
# ---------------------------------------------------------------------------

VHOST="${VHOST:-}"

if [ -z "$VHOST" ]; then
    for d in /etc/nginx/sites-enabled /etc/nginx/conf.d /etc/nginx/sites-available; do
        [ -d "$d" ] || continue

        encontrado=$(grep -rl "server_name.*${DOMINIO}" "$d" 2>/dev/null | head -1)

        if [ -n "$encontrado" ]; then
            VHOST="$encontrado"
            break
        fi
    done
fi

if [ -z "$VHOST" ] || [ ! -f "$VHOST" ]; then
    echo "ERRO: não achei o vhost de ${DOMINIO}." >&2
    echo "" >&2
    echo "Procure com:" >&2
    echo "    grep -rl 'server_name.*${DOMINIO}' /etc/nginx/" >&2
    echo "" >&2
    echo "E informe:" >&2
    echo "    VHOST=/etc/nginx/sites-available/arquivo sh $0 --aplicar" >&2
    exit 1
fi

echo "vhost:  $VHOST"
echo "modo:   $([ "$APLICAR" -eq 1 ] && echo 'APLICAR' || echo 'apenas mostrar')"
echo ""

# ---------------------------------------------------------------------------

if grep -q "autenticacao/migrar-senhas" "$VHOST"; then
    echo "O bloqueio já está no arquivo. Nada a fazer."
    exit 0
fi

if ! grep -qE '^\s*location\s+/\s*\{' "$VHOST"; then
    echo "ERRO: não achei um 'location / {' em $VHOST para me guiar." >&2
    echo "Insira o bloco à mão, dentro do server {} e antes do location /:" >&2
    echo "" >&2
    echo "    location = /autenticacao/migrar-senhas { deny all; }" >&2
    exit 1
fi

echo "Vou inserir, antes do primeiro 'location / {':"
echo ""
echo "    # Dia 0: rota sem autenticação que sobrescreve a senha de todos os"
echo "    # usuários ativos. Removida no código; bloqueada aqui até o deploy."
echo "    location = /autenticacao/migrar-senhas {"
echo "        deny all;"
echo "    }"
echo ""

if [ "$APLICAR" -eq 0 ]; then
    echo "Para aplicar: sh $0 --aplicar"
    exit 0
fi

# ---------------------------------------------------------------------------

COPIA="${VHOST}.antes-bloqueio-$(date +%Y%m%d-%H%M%S)"
cp "$VHOST" "$COPIA" || { echo "ERRO: não consegui copiar o arquivo." >&2; exit 1; }
echo "cópia de segurança: $COPIA"

# Insere antes da PRIMEIRA ocorrência. `location =` é correspondência exata e
# tem prioridade sobre qualquer prefixo no nginx, então a posição no arquivo
# não muda o resultado — mas ficar perto do `location /` deixa legível.
awk '
    !inserido && /^[[:space:]]*location[[:space:]]+\/[[:space:]]*\{/ {
        print "    # Dia 0: rota sem autenticação que sobrescreve a senha de todos os"
        print "    # usuários ativos. Removida no código; bloqueada aqui até o deploy."
        print "    location = /autenticacao/migrar-senhas {"
        print "        deny all;"
        print "    }"
        print ""
        inserido = 1
    }
    { print }
' "$COPIA" > "$VHOST"

if ! nginx -t 2>&1; then
    echo ""
    echo "nginx -t FALHOU. Desfazendo." >&2
    cp "$COPIA" "$VHOST"
    echo "Arquivo restaurado. Nada foi recarregado." >&2
    exit 1
fi

# O recarregamento tem duas formas, e nem toda máquina tem as duas. Importa
# tentar as duas porque, a esta altura, **o arquivo já está alterado e válido**
# — falhar aqui e sair não desfaz nada, só deixa a configuração no disco sem
# estar em vigor. Melhor dizer isso com todas as letras do que fingir erro.
if systemctl reload nginx 2>/dev/null; then
    recarregou="systemctl"
elif nginx -s reload 2>/dev/null; then
    recarregou="nginx -s reload"
else
    echo ""
    echo "ATENÇÃO: o arquivo FOI alterado e passou no nginx -t, mas não consegui"
    echo "recarregar — nem 'systemctl reload nginx' nem 'nginx -s reload'."
    echo ""
    echo "A configuração está no disco e correta; falta apenas colocá-la em"
    echo "vigor. Recarregue à mão e o bloqueio passa a valer:"
    echo "    systemctl reload nginx"
    echo ""
    echo "Para desfazer, se preferir:"
    echo "    cp $COPIA $VHOST"
    exit 1
fi

echo ""
echo "Bloqueio aplicado e nginx recarregado (via ${recarregou})."
echo ""
echo "Confira — deve devolver 403:"
echo "  curl -s -o /dev/null -w '%{http_code}\\n' https://${DOMINIO}/autenticacao/migrar-senhas"
echo ""
echo "ATENÇÃO: esse curl agora é seguro porque a rota está bloqueada."
echo "Antes do bloqueio ele DISPARARIA a troca de senhas — a requisição executa"
echo "o controller."
