#!/usr/bin/env bash
# Alta de un alumno (root en el VPS). Solo recibe su clave PÚBLICA.
#   alta-alumno.sh <usuario> '<ssh-ed25519 AAAA... comentario>'
set -euo pipefail
[ "$(id -u)" -eq 0 ] || { echo "ejecuta como root"; exit 1; }
[ $# -eq 2 ] || { echo "uso: $0 <usuario> '<clave pública ssh>'"; exit 1; }

u=$1; key=$2
BASE=/var/lib/alumnos
KEYS=/etc/ssh/authorized_keys

# usuario: sin guion ni punto (es la etiqueta tras el proyecto en <proyecto>.<usuario>.alumnos...), 3-20 caracteres
[[ $u =~ ^[a-z][a-z0-9]{2,19}$ ]] || { echo "usuario inválido: [a-z][a-z0-9]{2,19}"; exit 1; }
case $u in root|admin|tunnel|www|nginx|ssh|sshd|ftp|mail|test|campus|alumnos) echo "usuario reservado"; exit 1;; esac
id "$u" >/dev/null 2>&1 && { echo "el usuario $u ya existe"; exit 1; }

# la clave debe ser una sola línea que EMPIECE por el tipo de clave (sin opciones inyectadas)
[[ $key != *$'\n'* && $key =~ ^(ssh-ed25519|sk-ssh-ed25519@openssh\.com|ecdsa-sha2-nistp256|ssh-rsa)\  ]] \
  || { echo "clave pública no válida (una línea, que empiece por ssh-ed25519, ecdsa-sha2-nistp256, ...)"; exit 1; }
ssh-keygen -l -f /dev/stdin <<<"$key" >/dev/null || { echo "ssh-keygen no reconoce la clave"; exit 1; }

useradd -M -s /usr/sbin/nologin -G alumnos "$u"
# El setgid hace que los sockets que cree sshd hereden el grupo nginxsock.
install -d -o "$u" -g nginxsock -m 2750 "$BASE/$u"
printf 'restrict,port-forwarding %s\n' "$key" > "$KEYS/$u"
chmod 0644 "$KEYS/$u"

echo "Alumno $u creado. Sus URLs serán  https://<lo-que-quieras>.$u.alumnos.codecrypto.dev  (túnel: $BASE/$u/web.sock)"
