#!/bin/sh
#---------------------------------------------
#   xdg-su
#
#   Utility script to run a command as an alternate user, generally
#       the root user, with a graphical prompt for the root
#       password if needed
#
#   Refer to the usage() function below for usage.
#
#   Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
#   Copyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>
#   Copyright 2006, Jeremy White <jwhite@codeweavers.com>
#   Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
#
#   LICENSE:
#
#---------------------------------------------

manualpage()
{
cat << _MANUALPAGE
_MANUALPAGE
}

usage()
{
cat << _USAGE
_USAGE
}

#@xdg-utils-common@

su_kde()
{
    if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
        KDESU=`kde4-config --locate kdesu --path exe 2>/dev/null`
    else
        KDESU=`which kdesu 2>/dev/null`
    fi
    if [ $? -eq 0 ] ; then
        if [ -z "$user" ] ; then
             $KDESU -c "$cmd"
        else
             $KDESU -u "$user" -c "$cmd"
        fi

        if [ $? -eq 0 ]; then
            exit_success
        else
            exit_failure_operation_failed
        fi
    else
        su_generic
    fi
}

su_gnome()
{
    GSU=`which gnomesu 2>/dev/null`
    if [ $? -ne 0 ] ; then
        GSU=`which xsu 2>/dev/null`
    fi
    if [ $? -eq 0 ] ; then
        if [ -z "$user" ] ; then
            $GSU -c "$cmd"
        else
            $GSU -u "$user" -c "$cmd"
        fi

        if [ $? -eq 0 ]; then
            exit_success
        else
            exit_failure_operation_failed
        fi
    else
        su_generic
    fi
}

su_generic()
{
    if [ -z "$user" ] ; then
        xterm -geom 60x5 -T "xdg-su: $cmd" -e su -c "$cmd"
    else
        xterm -geom 60x5 -T "xdg-su: $cmd" -e su -c "$cmd" "$user"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

[ x"$1" != x"" ] || exit_failure_syntax

user=
cmd=
while [ $# -gt 0 ] ; do
    parm="$1"
    shift

    case "$parm" in
      -u)
        if [ -z "$1" ] ; then
            exit_failure_syntax "user argument missing for -u"
        fi
        user="$1"
        shift
        ;;

      -c)
        if [ -z "$1" ] ; then
            exit_failure_syntax "command argument missing for -c"
        fi
        cmd="$1"
        shift
        ;;

      -*)
        exit_failure_syntax "unexpected option '$parm'"
        ;;

      *)
        exit_failure_syntax "unexpected argument '$parm'"
        ;;
    esac
done

if [ -z "${cmd}" ] ; then
    exit_failure_syntax "command missing"
fi

detectDE

if [ x"$DE" = x"" ]; then
    XSU=`which xsu 2>/dev/null`
    if [ $? -eq 0 ] ; then
        DE=generic
    fi
fi

case "$DE" in
    kde)
    su_kde
    ;;

    gnome|lxde)
    su_gnome
    ;;

    generic)
    su_generic
    ;;

    *)
    [ x"$user" = x"" ] && user=root
    exit_failure_operation_impossible "no graphical method available for invoking '$cmd' as '$user'"
    ;;
esac
