~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/interpret.py

  • Committer: William Grant
  • Date: 2009-01-13 01:36:15 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1123
Merge setup-refactor branch. This completely breaks existing installations;
every path (both filesystem and Python) has changed. Do not upgrade without
knowing what you are doing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
# Runs a student script in a safe execution environment.
23
23
 
24
24
from ivle import studpath
 
25
from ivle import db
25
26
from ivle.util import IVLEError, IVLEJailError
26
27
import ivle.conf
27
28
 
38
39
 
39
40
CGI_BLOCK_SIZE = 65535
40
41
 
 
42
uids = {}
 
43
 
 
44
def get_uid(login):
 
45
    """Get the unix uid corresponding to the given login name.
 
46
       If it is not in the dictionary of uids, then consult the
 
47
       database and retrieve an update of the user table."""
 
48
    global uids
 
49
    if login in uids:
 
50
        return uids[login]
 
51
 
 
52
    conn = db.DB()
 
53
    res = conn.get_all('login', ['login', 'unixid'])
 
54
    def repack(flds):
 
55
        return (flds['login'], flds['unixid'])
 
56
    uids = dict(map(repack,res))
 
57
 
 
58
    return uids[login]
 
59
 
41
60
def interpret_file(req, owner, jail_dir, filename, interpreter, gentle=True):
42
61
    """Serves a file by interpreting it using one of IVLE's builtin
43
62
    interpreters. All interpreters are intended to run in the user's jail. The
45
64
    to the individual interpreters to create the jail.
46
65
 
47
66
    req: An IVLE request object.
48
 
    owner: The user who owns the file being served.
 
67
    owner: Username of the user who owns the file being served.
49
68
    jail_dir: Absolute path to the user's jail.
50
69
    filename: Absolute filename within the user's jail.
51
70
    interpreter: A function object to call.
60
79
        filename_abs = os.path.join(os.sep, filename)
61
80
        filename_rel = filename
62
81
 
 
82
    # Get the UID of the owner of the file
63
83
    # (Note: files are executed by their owners, not the logged in user.
64
84
    # This ensures users are responsible for their own programs and also
65
85
    # allows them to be executed by the public).
 
86
    uid = get_uid(owner)
66
87
 
67
88
    # Split up req.path again, this time with respect to the jail
68
89
    (working_dir, _) = os.path.split(filename_abs)
73
94
    # (Note that paths "relative" to the jail actually begin with a '/' as
74
95
    # they are absolute in the jailspace)
75
96
 
76
 
    return interpreter(owner.unixid, jail_dir, working_dir, filename_abs, req,
 
97
    return interpreter(uid, jail_dir, working_dir, filename_abs, req,
77
98
                       gentle)
78
99
 
79
100
class CGIFlags:
410
431
    # Additional environment variables
411
432
    username = studpath.url_to_jailpaths(req.path)[0]
412
433
    env['HOME'] = os.path.join('/home', username)
413
 
 
414
 
class ExecutionError(Exception):
415
 
    pass
416
 
 
417
 
def execute_raw(user, jail_dir, working_dir, binary, args):
418
 
    '''Execute a binary in a user's jail, returning the raw output.
419
 
 
420
 
    The binary is executed in the given working directory with the given
421
 
    args. A tuple of (stdout, stderr) is returned.
422
 
    '''
423
 
 
424
 
    tramp = location_cgi_python
425
 
    tramp_dir = os.path.split(location_cgi_python)[0]
426
 
 
427
 
    # Fire up trampoline. Vroom, vroom.
428
 
    proc = subprocess.Popen(
429
 
        [tramp, str(user.unixid), jail_dir, working_dir, binary] + args,
430
 
        stdin=subprocess.PIPE, stdout=subprocess.PIPE,
431
 
        stderr=subprocess.PIPE, cwd=tramp_dir, close_fds=True)
432
 
    exitcode = proc.wait()
433
 
 
434
 
    if exitcode != 0:
435
 
        raise ExecutionError('subprocess ended with code %d, stderr %s' %
436
 
                             (exitcode, proc.stderr.read()))
437
 
    return (proc.stdout.read(), proc.stderr.read())