#!/usr/bin/env bash
# Bootstrap HTTPS client MEA on-prem (macOS) : entrée /etc/hosts + récupération/épinglage/
# confiance du certificat du serveur MEA. Lancé par l'installeur de l'Agent Local (macOS)
# ou à la main par l'admin. Équivalent de Configure-MeaServerTrust.ps1 (Windows).
#
# Usage : configure-server-trust.sh [ServerIp] [ServerHost] [CertSha256]
#   (sans argument : demande l'IP de façon interactive)
#   ServerIp    IP du serveur pour /etc/hosts (vide = mode DNS, le nom résout déjà)
#   ServerHost  nom d'hôte ; défaut mearchiver.local
#   CertSha256  empreinte SHA-256 attendue (épinglage) ; vide = TOFU (empreinte affichée)
set -euo pipefail

SERVER_IP="${1:-}"                      # IP du serveur (mode host). Vide = mode DNS (le nom résout déjà).
SERVER_HOST="${2:-mearchiver.local}"
CERT_SHA256="${3:-}"                    # vide = TOFU : empreinte affichée, pas d'épinglage strict

# Lancé sans aucun argument → demander l'IP (interactif). Vide = mode DNS.
if [ "$#" -eq 0 ]; then
  read -r -p "IP du serveur MEA (vide si un DNS résout déjà ${SERVER_HOST}) : " SERVER_IP
fi

EXPECTED=$(printf '%s' "$CERT_SHA256" | tr -cd '0-9A-Fa-f' | tr '[:lower:]' '[:upper:]')
if [ -n "$EXPECTED" ] && [ "${#EXPECTED}" -ne 64 ]; then
  echo "CertSha256 invalide (64 hex attendus) : $CERT_SHA256" >&2; exit 1
fi

# 1. /etc/hosts (si IP fournie et nom pas déjà présent)
if [ -n "$SERVER_IP" ]; then
  if ! grep -qE "[[:space:]]${SERVER_HOST}([[:space:]]|\$)" /etc/hosts 2>/dev/null; then
    printf '%s\t%s\n' "$SERVER_IP" "$SERVER_HOST" | sudo tee -a /etc/hosts >/dev/null
    echo "hosts : ajouté '$SERVER_IP $SERVER_HOST'."
  else
    echo "hosts : '$SERVER_HOST' déjà présent — inchangé."
  fi
fi

# 2. Récupérer le cert présenté par le serveur (handshake TLS ; confiance = épinglage)
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
echo | openssl s_client -connect "${SERVER_HOST}:443" -servername "$SERVER_HOST" 2>/dev/null \
  | openssl x509 -outform PEM > "$TMP/server.pem"
[ -s "$TMP/server.pem" ] || { echo "Impossible de récupérer le cert de ${SERVER_HOST}:443." >&2; exit 1; }

# 3. SHA-256 : épinglage strict si empreinte fournie, sinon TOFU (affichage)
ACTUAL=$(openssl x509 -in "$TMP/server.pem" -noout -fingerprint -sha256 \
  | sed 's/.*=//; s/://g' | tr '[:lower:]' '[:upper:]')
if [ -n "$EXPECTED" ]; then
  if [ "$ACTUAL" != "$EXPECTED" ]; then
    echo "Empreinte du cert serveur NON conforme (MITM possible). Attendu $EXPECTED, reçu $ACTUAL — import refusé." >&2
    exit 1
  fi
  echo "Cert serveur épinglé OK (SHA-256 $ACTUAL)."
else
  echo "Empreinte du cert récupéré (SHA-256) : $ACTUAL"
  echo "ATTENTION : pas d'épinglage (aucune empreinte fournie) — vérifie cette valeur contre celle loggée sur le serveur."
fi

# 4. Import dans le trousseau Système (confiance racine, tous utilisateurs)
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "$TMP/server.pem"
echo "Bootstrap HTTPS client terminé : https://${SERVER_HOST} est désormais de confiance sur ce poste."
