#!/usr/bin/python3

'''
Copyright (c) 2013-2015 Phusion Holding B.V.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'''

import sys
import os
import pwd


def abort(message):
    sys.stderr.write("setuser: %s\n" % message)
    sys.exit(1)


def main():
    '''
    A simple alternative to sudo that executes a command as a user by setting
    the user ID and user parameters to those described by the system and then
    using execvp(3) to execute the command without the necessity of a TTY
    '''

    username = sys.argv[1]
    try:
        user = pwd.getpwnam(username)
    except KeyError:
        abort("user %s not found" % username)
    os.initgroups(username, user.pw_gid)
    os.setgid(user.pw_gid)
    os.setuid(user.pw_uid)
    os.environ['USER'] = username
    os.environ['HOME'] = user.pw_dir
    os.environ['UID'] = str(user.pw_uid)
    try:
        os.execvp(sys.argv[2], sys.argv[2:])
    except OSError as e:
        abort("cannot execute %s: %s" % (sys.argv[2], str(e)))

if __name__ == '__main__':

    if len(sys.argv) < 3:
        sys.stderr.write("Usage: /sbin/setuser USERNAME COMMAND [args..]\n")
        sys.exit(1)

    main()
