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

« back to all changes in this revision

Viewing changes to src/console/python-console

  • Committer: mattgiuca
  • Date: 2007-12-19 06:01:34 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:85
common/studpath.py: Added url_to_jailpaths.
apps/server: Rewrote parts to now get the UserID and paths relative to jail,
    and pass those off to the interpreter. The interpreter is no longer
    python, but one relative to IVLE (our trampoline). (Currently a test one).
Added bin/tramptest trampoline, called by server temporarily. Just prints out
    its arguments.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
 
3
 
# usage:
4
 
#   python-console <port> <magic>
5
 
 
6
 
import web
7
 
import md5
8
 
import codeop
9
 
import cjson
10
 
 
11
 
globs = {}
12
 
globs['__builtins__'] = globals()['__builtins__']
13
 
locls = {}
14
 
compiler = codeop.CommandCompiler()
15
 
curr_cmd = ''
16
 
 
17
 
def do_chat(txt):
18
 
    if curr_cmd == '':
19
 
        curr_cmd = txt
20
 
    else:
21
 
        curr_cmd = curr_cmd + '\n' + txt
22
 
    try:
23
 
        cmd = compiler(curr_cmd)
24
 
        if cmd is None:
25
 
            # The command was incomplete,
26
 
            # so send back a None, so the
27
 
            # client can print a '...'
28
 
            web.output(cjson.encode(None))
29
 
        else:
30
 
            # The command was complete,
31
 
            # so evaluate it!
32
 
            out = cStringIO.StringIO()
33
 
            sys.stdout = out
34
 
            sys.stderr = out
35
 
            signal.alarm(5)
36
 
            res = eval(cmd, globs, locls)
37
 
            signal.alarm(0)
38
 
            v = (out.getvalue(), res, None)
39
 
            web.output(json.encode(v))
40
 
            curr_cmd = ''
41
 
    except Exception, exc:
42
 
        v = (None, None, str(exc))
43
 
        web.output(json.encode(v))
44
 
        curr_cmd = ''
45
 
 
46
 
urls = (
47
 
    '/',            'index',
48
 
    '/(.*\.js)',    'jscript',
49
 
    '/(.*\.css)',   'style',
50
 
    '/chat',        'chat')
51
 
 
52
 
# The global 'magic' is the secret that the client and server share
53
 
# which is used to create and md5 digest to authenticate requests.
54
 
# It is assigned a real value at startup.
55
 
magic = ''
56
 
 
57
 
class index:
58
 
    def GET(self):
59
 
        inp = web.input()
60
 
 
61
 
        # Authenticate
62
 
        digest = md5.new('hello' + magic).digest().encode('hex')
63
 
        if inp.digest != digest:
64
 
            web.ctx.status = '401 Unauthorized'
65
 
            return
66
 
 
67
 
        # Okay, so the authentication succeeded,
68
 
        # so all we need to do is send back the static
69
 
        # HTML for the console app.
70
 
        web.output(file("index.html", "r").read())
71
 
 
72
 
class jscript:
73
 
    def GET(self, name):
74
 
        web.output(file(name, "r").read())
75
 
 
76
 
class style:
77
 
    def GET(self, name):
78
 
        web.output(file(name, "r").read())
79
 
 
80
 
class chat:
81
 
    def POST(self):
82
 
        inp = web.input()
83
 
 
84
 
        # Authenticate
85
 
        digest = md5.new(inp.text + magic).digest().encode('hex')
86
 
        if inp.digest != digest:
87
 
            web.ctx.status = '401 Unauthorized'
88
 
            return
89
 
 
90
 
        # Okay, so the authentication succeeded,
91
 
        # so now we have the trivial matter of actually
92
 
        # executing the python....
93
 
        web.output(do_chat(inp.text))
94
 
 
95
 
if __name__ == "__main__":
96
 
    # FIXME jail!
97
 
    magic = sys.argv[2]
98
 
    web.run(urls, globals())