#!/bin/bash

set -e
set -u

trap 'echo exit' EXIT

# Удалить / отмонтировать home гостя, если папка существует.
_remove_home_if_exist()
{
    if { test -d "${1}" ; }
    then
        umount -f "${1}" || umount -fl "${1}" || rm -rf "${1}"
    fi
}

# Для считывания значений из конфига.
# $1 - считываемый параметр
# $2 - параметр по умолчанию
_read_from_config()
{
    py-ini-config get sddm "$1" -a /usr/lib/mos-auth/mos-auth.conf -a /etc/mos-auth/mos-auth.conf -e conf || echo "$2"
}

_parse_config_true_val()
{
    [[ "$1" == "true" || "$1" == "yes" || "$1" == "1" ]]
}

_parse_config_empty_val()
{
    [[ "$1" == "" ]]
}

# Основной код.
if [[ $PAM_USER == "guest"
    && $PAM_SERVICE != "systemd-user"
    && ($PAM_TYPE == "open_session" || $PAM_TYPE == "close_session") ]]
then

    loginctl disable-linger "$PAM_USER"

    # Если сессия завершается.
    if [[ $PAM_TYPE == "close_session" ]]
    then
        if { loginctl show-user guest ; }
        then
            loginctl kill-user --signal KILL guest
        fi
        exit
    fi

    declare -l session_state
    session_state="$(loginctl show-user -p State guest || true)"

    if [[ $session_state == "state=active"
            || $session_state == "state=online" ]]
    then
        # Если уже есть активная сессия, то ничего не делаем.
        exit
    elif [[ $session_state == "state=closing" ]]
    then
        # Иначе, завершаем "зависшую" сессию принудительно.
        loginctl kill-user --signal KILL guest
    fi

    declare home_dir
    home_dir="$( getent passwd "$PAM_USER" | cut -d: -f6 )"

    declare -l guest_home_tmpfs
    guest_home_tmpfs="$(_read_from_config 'guest-home-tmpfs' 'no')"

    # Если в конфиге выключена опция 'guest-autoclean-profile',
    # и директория с профилем гостя существует, то пропускаем очистку профиля.
    declare -l guest_autoclean_profile
    guest_autoclean_profile="$(_read_from_config 'guest-autoclean-profile' 'yes')"
    if { ! _parse_config_true_val "$guest_autoclean_profile" && test -d "$home_dir" ; }
    then
        # Отдельно проверяем случай, когда у нас включен tmpfs для профиля,
        # и после перезагрузки директория существует, но не примонтирована как tmpfs.
        # В таком случае мы не должны пропускать очистку.
        if { ! _parse_config_true_val "$guest_home_tmpfs" || mountpoint "$home_dir" ; }
        then
            exit 0
        fi
    fi

    _remove_home_if_exist "$home_dir"

    # Создаем папку home.
    mkdir --parents "${home_dir}"
    chown --recursive "$PAM_USER:" "${home_dir}"

    # Если в конфиге включена опция 'guest-home-tmpfs', то монтируем как tmpfs.
    if { _parse_config_true_val "$guest_home_tmpfs" ; }
    then
        mount --types tmpfs --options mode=700 none "${home_dir}"
    fi

    # Если в конфиге переопределена директория skel для гостя, то считываем это значение.
    # Иначе, считываем стандартное значение из `/etc/default/useradd`.
    # Если оно отсутствует или равно "", тогда используем `/etc/skel`.
    # Также проверяем, чтобы указанные директории существовали.
    declare -l guest_skel_directory
    guest_skel_directory="$(_read_from_config 'guest-skel-directory' '')"

    if { _parse_config_empty_val "$guest_skel_directory" || ! test -d "$guest_skel_directory" ; }
    then
        guest_skel_directory="$(py-ini-config get /etc/default/useradd --no-section SKEL || echo '')"

        if { _parse_config_empty_val "$guest_skel_directory" || ! test -d "$guest_skel_directory" ; }
        then
            guest_skel_directory="/etc/skel"
        fi
    fi

    # Копируем содержимое папки skel в домашний профиль гостя.
    cp --reflink=auto --recursive --no-target-directory "${guest_skel_directory}" "${home_dir}"

    # Если в конфиге включена опция 'guest-dbus-service', то ставим в автозагрузку DBus службу.
    declare -l guest_dbus_service
    guest_dbus_service="$(_read_from_config 'guest-dbus-service' 'yes')"

    if { _parse_config_true_val "$guest_dbus_service" || _parse_config_empty_val "$guest_dbus_service" ; }
    then
        mkdir --parents "${home_dir}/.config/autostart"
        cat << EOF > "${home_dir}/.config/autostart/mos-guest-dbus-service.desktop"
[Desktop Entry]
Name=MosTech Guest DBus Service
Exec=mos-guest-dbus-service
Type=Application
EOF
    fi

    chown --recursive "$PAM_USER:" "${home_dir}"
fi
