#!/bin/sh
# ============================================================================
#  Helper privilegiado de MiVPN. Lo invoca la app con `pkexec`, autorizado por
#  /usr/share/polkit-1/actions/net.mivpn.app.policy.
#
#  Superficie deliberadamente mínima: solo `up` y `down` de UNA interfaz fija.
#  No acepta rutas ni nombres de interfaz desde la app, para que un fallo en el
#  lado no privilegiado no pueda convertirse en ejecución arbitraria como root.
#
#    up    lee el .conf por la entrada estándar y levanta el túnel
#    down  baja el túnel (no falla si ya estaba bajado)
#    status  imprime `up` o `down`
# ============================================================================
set -eu

IFACE=mivpn
CONF="/etc/wireguard/${IFACE}.conf"

die() { echo "mivpn-helper: $*" >&2; exit 1; }

command -v wg-quick >/dev/null 2>&1 || die "falta wg-quick (instala wireguard-tools)"

case "${1:-}" in
  up)
    umask 077
    mkdir -p /etc/wireguard
    # El .conf llega por stdin: la clave privada nunca toca un fichero
    # temporal legible por otros procesos del usuario.
    tmp="$(mktemp /etc/wireguard/.${IFACE}.XXXXXX)"
    trap 'rm -f "$tmp"' EXIT INT TERM
    cat > "$tmp"
    [ -s "$tmp" ] || die "configuración vacía"
    grep -q '^[[:space:]]*\[Interface\]' "$tmp" || die "configuración inválida"

    # Baja un túnel previo antes de reemplazar el fichero, o `wg-quick down`
    # posterior usaría la configuración nueva para deshacer la vieja.
    if ip link show "$IFACE" >/dev/null 2>&1; then
      wg-quick down "$IFACE" >/dev/null 2>&1 || true
    fi

    chmod 600 "$tmp"
    mv -f "$tmp" "$CONF"
    trap - EXIT INT TERM
    exec wg-quick up "$IFACE"
    ;;

  down)
    if ip link show "$IFACE" >/dev/null 2>&1; then
      exec wg-quick down "$IFACE"
    fi
    exit 0
    ;;

  status)
    if ip link show "$IFACE" >/dev/null 2>&1; then echo up; else echo down; fi
    ;;

  *)
    die "uso: mivpn-helper {up|down|status}"
    ;;
esac
