#!/bin/bash
# lastact: arturo@2023-06-05
# desc: Configura el autologin del lightdm.  Para ello:
## 0) Antes de modificar el valor de autologin-user comprueba el valor actual para eliminar el anillo de claves Default
## 1) Modifica el parámetro: autologin-user
## 2) Agrega al usuario al grupo nopasswdlogin
## 3) Configura al usuario un anillo de claves vacío para que no le pida clave al iniciar sesión

FICHFUNCS="/usr/bin/vx-funcs-bash"
[ -f "${FICHFUNCS}" ] && . "${FICHFUNCS}" "null"

FICHCONF="/etc/lightdm/lightdm.conf"
SECCION='Seat:*'
PARAM="autologin-user"
VALOR="${1}"
USULDAP="usuario-ldap"

# Help-Begin: Descripción de la ayuda de la función:
AYUDA='Ayuda: Debe pasarse como parámetro una de las siguientes opciones:
    # 1) "null": indicamos que no queremos inicio de sesión automático
    # 2) "nombre-usuario": un nombre de usuario válido en el sistema. Lo configurará como usuario de inicio de sesión automática.
    # 3) "'"${USULDAP}"'": se deshabilitará el autologin y se configurará un login manual en el greeter, escondiendo la lista de usuarios del sistema.'
EJEMPLOS=("${0} \"Docente-centro\"")
EJEMPLOS+=("${0} \"juanjo\"")
EJEMPLOS+=("${0} \"null\"")
EJEMPLOS+=("${0} \"${USULDAP}\"")
if vx-check_need_help "${1}" || [[ -z "${1}" ]]; then
    vx-show_help "${0}" "${AYUDA}" "${EJEMPLOS[@]}" && exit 0
fi
# Help-End

function salir() {
    echo "=> ${1}"
    exit ${2}
}

function vx_autologin_deshacer() {
    # 1) Comprobamos si había un usuario configurado previamente en el autologin, para deshacer cambios hechos:
    USUANTERIOR="$(crudini --get "${FICHCONF}" "${SECCION}" "${PARAM}")"
    if [[ "${VALOR}" != "${USUANTERIOR}" ]] && getent passwd "${USUANTERIOR}" >/dev/null 2>&1; then
        # 2) Eliminamos el posible anillo de claves vacío que pudiera tener configurado a causa del autologin:
        vx-keyring-plain "del" "${USUANTERIOR}"
        # 3) Eliminamos el usuario de su posible pertenecia al grupo nopasswdlogin:
        gpasswd -d "${USUANTERIOR}" "${GRUPO}"
    fi
}

function vx_autologin() {
    # Antes de configurar el autologin deshacemos los posibles cambios provocados en el usuario anterior:
    vx_autologin_deshacer
    REGEX='^null$|^SIN-INICIO-AUTOMATICO$|^-- Sin Inicio de Sesión Automático --$|^'"${USULDAP}"'$'
    if [[ "${VALOR}" =~ ${REGEX} ]]; then
        # [Seat:*]
        # autologin-user=null
        # autologin-user-timeout=0
        crudini --set "${FICHCONF}" "${SECCION}" "${PARAM}" "null" &&
            vx-echo_log_ok "Se ha deshabilitado el inicio de sesión automático."
        [[ -f "/usr/bin/vx-lightdm-last-user" ]] &&
            vx-lightdm-last-user "null" &&
            echo "#> Se ha eliminado el rastro del last-user cacheado por lightdm"
    else
        crudini --set "${FICHCONF}" "${SECCION}" "${PARAM}" "${VALOR}"
        if getent passwd "${VALOR}" >/dev/null 2>&1; then
            vx-echo_log_ok "Se ha configurado \"${VALOR}\" como usuario de inicio de sesión automático"
            vx-keyring-plain "add" "${VALOR}" &&
                vx-echo_log_ok "${VALOR}: Se le ha configurado un anillo de claves en texto plano" ||
                vx-echo_log_error "${VALOR}: Problemas para configurar un anillo de claves en texto plano"
            gpasswd -a "${VALOR}" "${GRUPO}" &&
                vx-echo_log_ok "${VALOR}: Se ha añadido al grupo ${GRUPO} en coherencia con el autologin" ||
                vx-echo_log_error "${VALOR}: Problemas para añadirlo al grupo ${GRUPO}"
            [[ -f "/usr/bin/vx-lightdm-last-user" ]] &&
                vx-lightdm-last-user "${VALOR}" &&
                echo "#> Se ha cacheado last-user=${VALOR} para lightdm"
        else
            vx-echo_log_error "Se ha configurado \"${VALOR}\" como usuario de inicio de sesión automático, pero no existe"
        fi
    fi
}

function vx_usuario_ldap() {
    if "${1}"; then
        # Cuando el usuario a logarse sea vía ldap habilitaremos el login manual y deshabilitaremos el autologin:
        echo "=> Va a configurarse lightdm para que el login sea manual y no muestre la lista de usuarios del equipo"
        # [Seat:*]
        # greeter-show-manual-login=true
        # greeter-hide-users=true
        # allow-guest=false
        # autologin-user=null # PARAM=autologin-user
        crudini --set "${FICHCONF}" "${SECCION}" "greeter-show-manual-login" "true"
        crudini --set "${FICHCONF}" "${SECCION}" "greeter-hide-users" "true"
        crudini --set "${FICHCONF}" "${SECCION}" "${PARAM}" "null"
    else
        crudini --set "${FICHCONF}" "${SECCION}" "greeter-show-manual-login" "false"
        crudini --set "${FICHCONF}" "${SECCION}" "greeter-hide-users" "false"
    fi
}

# 0) Comprobamos que el usuario que ejecuta el script es el root:
MENSAJE="Necesitas permisos de root para configurar el autologin del equipo"
vx-check_user_root "${MENSAJE}"

# 1) Preparamos la auditoria del script:
LOG="$(basename "${0}").log"
vx-log_xsession -o "${LOG}"

# 2) Comprobamos que existe el archivo de configuración:
[[ ! -f "${FICHCONF}" ]] && salir "Error: No existe el fichero de configuración de lightdm" "2"

# 3) Comprobamos que el usuario a configurar no es "usuario-ldap":
[[ "${VALOR}" == "usuario-ldap" ]] &&
    vx_usuario_ldap "true" ||
    vx_usuario_ldap "false"

# 4) Comprobamos que existe el grupo GRUPO="nopasswdlogin", sino lo creamos:
GRUPO="nopasswdlogin"
! getent group "${GRUPO}" >/dev/null 2>&1 &&
    groupadd "${GRUPO}" &&
    echo "#> ${GRUPO}: Se ha creado el grupo, no existía en el sistema."

# 4) Llamamos la función vx_autologin para configure lo necesario:
vx_autologin

# 5) Eliminamos los espacios en blanco que deja crudini al insertar un nuevo parámetro:
sed -i --follow-symlinks "s/\ *=\ */=/g" "${FICHCONF}"
exit 0
