#!/usr/bin/env bash
# assistente-wrapper — entrypoint invocado pelo `command=` do authorized_keys do
# utilizador tecnico `assistente` no Sabichao (dev: CT 100; prod: CT 107).
#
# Nao e chamado a mao. O sshd injeta:
#   - SSH_ORIGINAL_COMMAND: o que o cliente pediu a seguir a "ssh host" (normalmente
#     vazio ou ignorado — o wrapper nao confia nele para nada de autorizacao).
#   - $1 (arg fixo do proprio command=): "consulta" ou "apply", consoante a chave
#     usada — e essa a fonte de verdade da autorizacao, nunca o payload.
#
# Contrato (doc 03-CONTRATO-WRAPPER-CT107.md):
#   - JSON de entrada por stdin, JSON de saida por stdout.
#   - Nunca aceita comandos de shell arbitrarios (SSH_ORIGINAL_COMMAND e ignorado
#     para efeitos de execucao — serve so para log).
#   - stderr nunca contem dados sensiveis (password, PII desnecessaria).
#   - Exit codes: 0 ok, 1 erro de argumentos/acao nao permitida, 2 falha de
#     geracao/validacao, 3 falha de envio/execucao externa.
set -euo pipefail
umask 077

CLASSE_CHAVE="${1:-}"
if [ "$CLASSE_CHAVE" != "consulta" ] && [ "$CLASSE_CHAVE" != "apply" ]; then
    echo '{"ok":false,"erro":"classe de chave invalida"}'
    exit 1
fi

BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WRAPPER_PHP="$BASE_DIR/wrapper.php"

# Recusa explicita de qualquer tentativa de correr shell/outro comando: o
# SSH_ORIGINAL_COMMAND nunca e executado, so seria usado se um dia se quisesse
# log — nao usamos nem isso, para nao arriscar meter dados sensiveis no log.
if [ -n "${SSH_ORIGINAL_COMMAND:-}" ]; then
    :
fi

TMPDIR_WRAPPER=$(mktemp -d)
trap 'rm -rf "$TMPDIR_WRAPPER"' EXIT
PAYLOAD_FILE="$TMPDIR_WRAPPER/payload.json"
touch "$PAYLOAD_FILE"
chmod 600 "$PAYLOAD_FILE"

# Le stdin com limite de tamanho (256 KB) para nao gastar memoria/disco com
# payloads absurdos antes do PHP sequer olhar para o JSON.
LIMITE_BYTES=262144
head -c "$((LIMITE_BYTES + 1))" > "$PAYLOAD_FILE"
TAM=$(wc -c < "$PAYLOAD_FILE" | tr -d ' ')
if [ "$TAM" -gt "$LIMITE_BYTES" ]; then
    echo '{"ok":false,"erro":"payload excede o limite de tamanho"}'
    exit 1
fi

exec php "$WRAPPER_PHP" "$CLASSE_CHAVE" "$PAYLOAD_FILE"
