#!/bin/sh
# Verwaltet von Tuxflotte (Rolle kiosk)
#
# Gibt die Anmeldung am Konto "kiosk" frei oder nimmt sie weg (Muster:
# personalisierung-anmeldung bis ansible-content f975938). Frei nur, wenn
# beides gilt:
#   - die Rolle hat eine gültige Konfiguration abgelegt (KIOSK), und
#   - das laufende LightDM nutzt schon den Kiosk-Wrapper. LightDM liest
#     seine Konfiguration nur beim Start; vorher bekäme das passwortlose
#     Konto den vollen Desktop.
# Frei: passwortlose PAM-Freigabe, Shell bash, im Greeter sichtbar, mit
# AUTOSTART zusätzlich automatische Anmeldung (wirkt ab dem nächsten Start
# von LightDM, zusammen mit dem Wrapper).
# Sonst: keine Freigabe, Shell nologin, in AccountsService
# SystemAccount=true (sonst bleibt das Konto im Greeter stehen), keine
# automatische Anmeldung.
#
# Aufruf: "start" aus ExecStartPre von lightdm.service (LightDM startet
# gleich mit der aktuellen Konfiguration), ohne Argument von der Rolle.
# Ausgabe: "frei" oder "gesperrt", bei einer Änderung mit " geaendert".
set -eu

KONF=/etc/lightdm/lightdm.conf.d/86-tuxflotte-kiosk.conf
AUTOLOGIN=/etc/lightdm/lightdm.conf.d/87-tuxflotte-kiosk-autostart.conf
KIOSK=/etc/tuxflotte/kiosk.json
AUTOSTART=/etc/tuxflotte/kiosk-autostart
PAM=/etc/pam.d/lightdm
ACCOUNTS=/var/lib/AccountsService/users/kiosk
ZEILE='auth        sufficient                                  pam_succeed_if.so user = kiosk'
MUSTER='^auth[[:space:]]+sufficient[[:space:]]+pam_succeed_if\.so[[:space:]]+user[[:space:]]+=[[:space:]]+kiosk[[:space:]]*$'

wrapper_aktiv() {
    [ -f "$KONF" ] || return 1
    [ "${1:-}" = start ] && return 0
    pid=$(systemctl show -p MainPID --value lightdm.service 2>/dev/null || true)
    [ "${pid:-0}" -gt 0 ] 2>/dev/null || return 1
    laufzeit=$(ps -o etimes= -p "$pid" | tr -d ' ')
    [ -n "$laufzeit" ] || return 1
    [ $(( $(date +%s) - laufzeit )) -gt "$(stat -c %Y "$KONF")" ]
}

soll=gesperrt
if [ -s "$KIOSK" ] && getent passwd kiosk >/dev/null && wrapper_aktiv "${1:-}"; then
    soll=frei
fi

geaendert=""
if [ "$soll" = frei ]; then
    if [ -f "$PAM" ] && ! grep -Eq "$MUSTER" "$PAM"; then
        sed -i "1i $ZEILE" "$PAM"
        geaendert=" geaendert"
    fi
    shell=/bin/bash
else
    if [ -f "$PAM" ] && grep -Eq "$MUSTER" "$PAM"; then
        sed -i -E "/$MUSTER/d" "$PAM"
        geaendert=" geaendert"
    fi
    shell=/usr/sbin/nologin
fi

# Automatische Anmeldung nur zusammen mit dem Wrapper: Beide Dateien liest
# LightDM beim selben Start.
if [ "$soll" = frei ] && [ -f "$AUTOSTART" ]; then
    if [ ! -f "$AUTOLOGIN" ]; then
        printf '%s\n' '# Verwaltet von Tuxflotte (Rolle kiosk)' '[Seat:*]' 'autologin-user=kiosk' 'autologin-user-timeout=0' > "$AUTOLOGIN"
        geaendert=" geaendert"
    fi
elif [ -f "$AUTOLOGIN" ]; then
    rm -f "$AUTOLOGIN"
    geaendert=" geaendert"
fi

if getent passwd kiosk >/dev/null; then
    if [ "$(getent passwd kiosk | cut -d: -f7)" != "$shell" ]; then
        usermod -s "$shell" kiosk
        geaendert=" geaendert"
    fi
    # AccountsService: SystemAccount=true blendet aus, ohne den Schlüssel
    # zeigt der Greeter das Konto. Andere Einträge der Datei bleiben stehen.
    if [ "$soll" = frei ]; then
        if [ -f "$ACCOUNTS" ] && grep -q '^SystemAccount=' "$ACCOUNTS"; then
            sed -i '/^SystemAccount=/d' "$ACCOUNTS"
            accounts_geaendert=1
        fi
    elif ! { [ -f "$ACCOUNTS" ] && grep -qx 'SystemAccount=true' "$ACCOUNTS"; }; then
        mkdir -p "$(dirname "$ACCOUNTS")"
        if [ -f "$ACCOUNTS" ] && grep -q '^\[User\]' "$ACCOUNTS"; then
            sed -i '/^SystemAccount=/d' "$ACCOUNTS"
            sed -i '/^\[User\]/a SystemAccount=true' "$ACCOUNTS"
        else
            printf '[User]\nSystemAccount=true\n' >> "$ACCOUNTS"
        fi
        accounts_geaendert=1
    fi
    if [ -n "${accounts_geaendert:-}" ]; then
        geaendert=" geaendert"
        # Beim Start von LightDM läuft accounts-daemon meist noch nicht und
        # liest die Datei selbst; try-restart tut dann nichts.
        systemctl try-restart accounts-daemon.service 2>/dev/null || true
    fi
fi

echo "$soll$geaendert"
