#!/usr/bin/env bash
# redact.sh — redação de segredos, compartilhada pelos scripts do SSHepherd.
#
# Toda saída que vem do servidor e vai para a tela, para o log ou para o
# contexto do agente passa por aqui ANTES de qualquer outra coisa. Não é um
# muro: texto livre tem formas infinitas de carregar segredo. É a última rede,
# depois das que importam de verdade (o cofre fora do alcance do usuário de
# operação, e o comando livre exigir teclado).
#
# Uso, dentro de outro script:
#   . "$(dirname "${BASH_SOURCE[0]}")/redact.sh"
#   printf '%s\n' "$saida" | redact
#
# O que cai:
#   - chave privada, em uma linha ou em várias (awk guarda estado entre linhas)
#   - `Authorization: ...` e `Bearer ...`
#   - NOME=valor e "nome": "valor" quando o nome É ou TERMINA EM key, secret,
#     token, pass, password, pwd, senha, dsn, url, uri, credential(s),
#     inclusive entre aspas: `PASSWORD="x"` (a versão antiga deixava passar
#     porque o primeiro caractere do valor era a aspa)
#   - credencial dentro de URL: `postgres://usuario:senha@host`
#   - formatos conhecidos de chave soltos no texto: OpenAI/Anthropic `sk-`,
#     GitHub `ghp_`/`gho_`/`github_pat_`, AWS `AKIA`, Slack `xox?-`,
#     Google `AIza`, JWT `eyJ...eyJ...`
#   - chave pública SSH (não é segredo, mas é ruído de 70 caracteres)
#
# O que NÃO cai, de propósito: `DEPLOY=sucesso`, `engine=postgresql`,
# `ALERTAS=0`, `RELEASE=2026...`. Redigir toda atribuição destruiria a saída
# operacional que os scripts existem para entregar.

redact() {
  awk '
    /-----BEGIN [A-Z ]*PRIVATE KEY-----/ {
      print "[CHAVE-PRIVADA-REDIGIDA]"
      if ($0 !~ /-----END [A-Z ]*PRIVATE KEY-----/) dentro = 1
      next
    }
    dentro && /-----END [A-Z ]*PRIVATE KEY-----/ { dentro = 0; next }
    dentro { next }
    { print }
  ' \
  | sed -E \
    -e 's/((authorization)["'"'"']?[[:space:]]*[:=][[:space:]]*)("[^"]*"|'"'"'[^'"'"']*'"'"'|[^[:space:]"'"'"',;]+)/\1[REDIGIDO]/gI' \
    -e 's/(Bearer[[:space:]]+)[A-Za-z0-9._~+\/-]+=*/\1[REDIGIDO]/g' \
    -e 's/((password|passwd|pwd|senha|secret|token|api[_-]?key|access[_-]?key|private[_-]?key|client[_-]?secret|credentials?|[A-Za-z0-9_-]*[_-](key|secret|token|pass|password|pwd|dsn|url|uri|credentials?))["'"'"']?[[:space:]]*[:=][[:space:]]*)("[^"]*"|'"'"'[^'"'"']*'"'"'|[^[:space:]"'"'"',;]+)/\1[REDIGIDO]/gI' \
    -e 's#([a-z][a-z0-9+.-]*://[^:/@[:space:]]+:)[^@[:space:]]+@#\1[REDIGIDO]@#g' \
    -e 's/(^|[^A-Za-z0-9_])(sk-[A-Za-z0-9_-]{16,}|ghp_[A-Za-z0-9]{20,}|gho_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|AKIA[0-9A-Z]{16}|xox[baprs]-[A-Za-z0-9-]{10,}|AIza[0-9A-Za-z_-]{35}|eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]+)/\1[REDIGIDO]/g' \
    -e 's/(ssh-(rsa|ed25519)[[:space:]]+)[A-Za-z0-9+\/=]{20,}/\1[CHAVE-PUBLICA]/g'
}
