#!/bin/bash

if [ $(id -u) -ne 0 ]; then
    echo "Have to run as root" >&2
    exit 1
fi

# Find users with X session
loginctl --no-legend list-sessions |\
    cut -d ' ' -f 1 |\
while read sessionid; do
    if [ "$(loginctl --property Type --value show-session $sessionid)" = "x11" ]; then        
        login="$(loginctl --property Name --value show-session $sessionid)"

        for pid in $(pgrep -u $login); do
            [ -r /proc/$pid/environ ] || continue
            [ "$user_DISPLAY" ] || user_DISPLAY=$(tr '\0' '\n' < /proc/$pid/environ | grep "^DISPLAY=" | cut -d = -f 2-)
            [ "$user_XAUTHORITY" ] || user_XAUTHORITY=$(tr '\0' '\n' < /proc/$pid/environ | grep "^XAUTHORITY=" | cut -d = -f 2-)
            [ "$user_XDG_RUNTIME_DIR" ] || user_XDG_RUNTIME_DIR=$(tr '\0' '\n' < /proc/$pid/environ | grep "^XDG_RUNTIME_DIR=" | cut -d = -f 2-)
            [ "$user_XDG_CONFIG_HOME" ] || user_XDG_CONFIG_HOME=$(tr '\0' '\n' < /proc/$pid/environ | grep "^XDG_CONFIG_HOME=" | cut -d = -f 2-)
            [ "$user_DBUS_SESSION_BUS_ADDRESS" ] || user_DBUS_SESSION_BUS_ADDRESS=$(tr '\0' '\n' < /proc/$pid/environ | grep "^DBUS_SESSION_BUS_ADDRESS=" | cut -d = -f 2-)

            [ "$user_DISPLAY" -a "$user_XAUTHORITY" -a "$user_XDG_CONFIG_HOME" -a "$user_XDG_RUNTIME_DIR" -a "$user_DBUS_SESSION_BUS_ADDRESS" ] && break
        done

        [ "$user_XDG_CONFIG_HOME" ] || user_XDG_CONFIG_HOME="$(getent passwd $login | cut -d ':' -f 6)/.config"
        [ "$user_XDG_RUNTIME_DIR" ] || user_XDG_RUNTIME_DIR="/run/user/$(id -u "$login")"
        [ "$user_DBUS_SESSION_BUS_ADDRESS" ] || user_DBUS_SESSION_BUS_ADDRESS="unix:path=$user_XDG_RUNTIME_DIR/bus"
        
        sudo -H -u "$login" \
            env \
                DISPLAY="$user_DISPLAY" \
                XAUTHORITY="$user_XAUTHORITY" \
                XDG_CONFIG_HOME="$user_XDG_CONFIG_HOME" \
                XDG_RUNTIME_DIR="$user_XDG_RUNTIME_DIR" \
                DBUS_SESSION_BUS_ADDRESS="$user_DBUS_SESSION_BUS_ADDRESS" \
                "$@"

        unset user_DISPLAY
        unset user_XAUTHORITY
        unset user_XDG_CONFIG_HOME
        unset user_XDG_RUNTIME_DIR
        unset user_DBUS_SESSION_BUS_ADDRESS
    fi
done
